自粛ムード真っ只中の昨今、出社を取り止めてテレワークに移行した方は多いのではないでしょうか。
世界中が感染症の驚異にさらされている今で無くとも、出社せず仕事ができるなら通勤は無駄な時間です。
それが改善されたのは素晴らしいことと言えるでしょう。
しかしテレワークになったことにより生まれる煩わしさもあります。
タイトルにもありますが、その代表格に出退勤メールです。
ここでは出退勤メールを自動送信する方法をご紹介します。
これでいつもより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を使ってノイズを入れています(笑)。