Python独習!

習得したPython知識をペイフォワード

Pythonで自動化!Outlookメールを自動送信する

STMPサーバー?よく分からない…それを使わずにメールを自動送信する方法あるか?
win32comモジュールを使ってOutlookを操作する

解説

Pythonでメール操作する方法をググるstmplibを使用する方法が多く出てくる。この方法はSTMPサーバーやパスワードを指定する必要があり、詳しくない人だとちょっと忌避感があるかもしれない。そこで、手軽に実現する方法としてwin32comを使用する。サーバーとかパスワードの指定不要!
コードも簡単これだけ↓↓で、勝手にOutlookが立ち上がってメールが送信される。

from win32com import client
outlook = client.Dispatch('Outlook.Application')
new_email = outlook.CreateItem(0)
new_email.BodyFormat = 1
new_email.To = '送信メールアドレス' 
new_email.Subject = 'タイトル'
new_email.Body = '本文'
new_email.Send()

Line 4

メールの書式設定を選択する。
1:テキスト 2:HTML 3:リッチテキスト
python-win32com-outlook

Line 5,6,7

必要事項をここにべた書きするか、変数でもよい。

Line 8

このタイミングでメールが送信される。動作確認したい場合は代わりにnew_email.Display(True)を入れておく。送信前のメール画面が確認できる。


サンプルプログラム

毎日、朝9時と夕方18時に上司にメール連絡を入れるプログラムを作成した。リモートワークの勤怠管理のための定時連絡を自動化する、という想定。

  • 朝9時に送信されるメール画面。キャプチャーするためにnew_email.Display(True)で送信しないように止めている。
Outlook 自動作成されたメール画面①
  • 夕方18時に送信されるメール画面。
Outlook 自動作成されたメール画面②


ソースコード

# 36_EmailAutomatically_001.py
# python 3.8.1
# schedule 0.6.0
# coding: utf-8

import time
from win32com import client
import schedule

def makeEmail(set_subject, set_body):
    outlook = client.Dispatch('Outlook.Application')
    new_email = outlook.CreateItem(0)

    #フォーマットを指定する。1:テキスト 2:HTML 3:リッチテキスト
    new_email.BodyFormat = 1

    #送信先メールアドレス
    new_email.To = 'test1@test.com; test2@test.com'
    new_email.CC = 'test3@test.com'

    #メールタイトル
    new_email.Subject = set_subject

    #メール本文
    new_email.Body = set_body

    #メール送信実行
    new_email.Display(True)   #Outlookの新規メール画面が開くとこまで
#   new_email.Send()          #問答無用で送信するモード

def main():
    #朝用の定型文
    subj_morning = "[連絡]業務開始"
    body_morning = "〇〇さん\n業務開始します。\n□□"

    #夕方用の定型文
    subj_afternoon = "[連絡]業務終了"
    body_afternoon = "〇〇さん\n業務終了します。\nお疲れさまでした。\n□□"

    #朝9時と、夕方18時にタイマーをセットする
    schedule.every().day.at("9:00").do(makeEmail, subj_morning, body_morning)
    schedule.every().day.at("18:00").do(makeEmail, subj_afternoon, body_afternoon)

    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == '__main__':
    main()

参考サイト

schedule · PyPI

/* -----codeの行番号----- */