テレワークに移行した方必見!出退勤メールを自動送信するプログラム。

Automation

自粛ムード真っ只中の昨今、出社を取り止めてテレワークに移行した方は多いのではないでしょうか。
世界中が感染症の驚異にさらされている今で無くとも、出社せず仕事ができるなら通勤は無駄な時間です。

それが改善されたのは素晴らしいことと言えるでしょう。
しかしテレワークになったことにより生まれる煩わしさもあります。

タイトルにもありますが、その代表格に出退勤メールです。

ここでは出退勤メールを自動送信する方法をご紹介します。
これでいつもより10分長くねれm..。

前提条件

WindowsでメーラーはOutlook、Python3.7.2がインストールされているという環境です。
まずはOutlookを起動してメールを送信するコードを書き、そのプログラムが指定された時間に自動送信されるようにします。

必要ライブラリのインストール

PythonでOutlookを操作するためのライブラリ

pip install pypiwin32

Pythonで指定時刻にプログラムを実行するためのライブラリ

pip install schedule

メールを送信

import win32com.client

#Outlookオブジェクトの作成
outlook = win32com.client.Dispatch("Outlook.Application")

#Itemのタイプは0:メール、1:予定表、2:連絡先、3:タスク
mymail = outlook.CreateItem(0)

#メールの書式設定
#1:テキストメール、2:HTMLメール、3:リッチテキストメール
mymail.BodyFormat = 1

#宛先等の決定
mymail.To = "foo@localhost.com"

#件名と本文
mymail.Subject = "Test Mail"
mymail.Body = """宛先各位
これはテストです。

署名
"""

#送信前の確認
mymail.Display(True)

#送信する
#mymail.Send()

mymail.Toで宛先を指定しています。ccやbccを追加したければ、mymail.Cc、mymail.Bccにアドレスを設定してください。ここではmymail.Display(True)でメール作成画面を立ち上げるところで止めています。

そのまま送信したければmymail.Display(True)を消し、mymail.Send()前にある#を外しましょう。ただこれを実行するとメールが送信されてしまうので、宛先と内容には十分注意してください。

指定時刻にプログラムを実行

import sched, time, datetime

s = sched.scheduler(time.time, time.sleep)

#10時に出勤するとします。
sc1 = datetime.datetime(2020, 4, 13, 10, 0)
sc1 = int(time.mktime(sc1.timetuple()))

#18時半に退勤するとします。
sc2 = datetime.datetime(2020, 4, 13, 18, 30)
sc2 = int(time.mktime(sc2.timetuple()))

def sendEmail(a):
    print(datetime.datetime.now(), a)

def schedule():
    s.enterabs(sc1, 1, sendEmail, argument=('出勤メールを送信しました。',))
    s.enterabs(sc2, 1, sendEmail, argument=('退勤メールを送信しました。',))
    s.run()

schedule()

上記コードのsendEmailの部分にメール送信のコードを挿入すれば、指定時刻にメールを送信するプログラムの完成です。

それがこちら。

import sched, time, datetime
import win32com.client
from random import randint

s = sched.scheduler(time.time, time.sleep)

#出勤時間の5-20分前
sc1 = datetime.datetime(2020, 4, 13, 10, 0+randint(-20, -5))
sc1 = int(time.mktime(sc1.timetuple()))

#退勤時間の5-20分後
sc2 = datetime.datetime(2020, 4, 13, 18, 30+randint(5, 20))
sc2 = int(time.mktime(sc2.timetuple()))

def sendEmail(a):
    #Outlookオブジェクトの作成
    outlook = win32com.client.Dispatch("Outlook.Application")

    #Itemのタイプは0:メール、1:予定表、2:連絡先、3:タスク
    mymail = outlook.CreateItem(0)

    #メールの書式設定
    #1:テキストメール、2:HTMLメール、3:リッチテキストメール
    mymail.BodyFormat = 1

    #宛先等の決定
    mymail.To = "foo@localhost.com"
    #件名と本文
    mymail.Subject = "Daily Mail"
    mymail.Body = """test
    """

    #送信前の確認
    mymail.Display(True)

    #送信するには
    #mymail.Send()
    print(datetime.datetime.now(), a)

def schedule():
    s.enterabs(sc1, 1, sendEmail, argument=('出勤メールを送信しました。',))
    s.enterabs(sc2, 1, sendEmail, argument=('退勤メールを送信しました。',))
    s.run()

schedule()

毎日同じ時刻に出勤メールを送ると自動化がバレる可能性があるので、randintを使ってノイズを入れています(笑)。

タイトルとURLをコピーしました