見出し画像

Pythonでできること3:定期メール

概要

Pythonを使用してメール(g-mail, yahooメール, outlook)を送付することができ、定期実行の仕組みを入れるとリマインダーメールを送付できます。

【私のリマインダーメールの使用例】
●工程会議のため、製造部門に在庫の更新を依頼
●プロジェクト会議のため、部下にプロジェクト表の更新依頼
●在宅管理のために、毎週の出勤表の記入依頼
●上記出勤表をチームに送付

ちなみに(私はしていないですが)フォルダ内に指定のファイルがあればメール送付処理を実行させることもできます(承認依頼の漏れ防止)。

1.使用するライブラリ

●os:ファイル操作(ここではパスからファイル名を取得)
●smtplib:メール送付
●datetime:日付や時刻を取得する
●email:MIME操作(ここではファイルを添付するためのライブラリ)

2.完成コード

g-mail, yahooメール, outlookでできますが、社内のソフトの関係でOutlook(正確にはOffice365)で作成しております。

import smtplib, ssl, os
from email.mime.text import MIMEText
import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email import encoders

account = 'KIYO@outlook' #自分のメールアドレス
mailinglist_tosend = 'KIYO@outlook' #宛先のメールアドレス
password = 'メールソフトのパスワードを入れてね'
dateinfo = datetime.datetime.today().strftime('%Y年%m月%d日更新') #今日の日付を取得します。

def send_outlook_mail(msg):
   server = smtplib.SMTP('smtp.office365.com', 587)
   server.ehlo()
   server.starttls()
   server.ehlo()
   server.login(
       account,
       password
   )
   server.send_message(msg)


#メールデータを作成
msg = MIMEMultipart()
msg['Subject'] = f'【定期メール】 出社予定表@{dateinfo}'
msg['To'] = mailinglist_tosend
msg['From'] = account
msg['Cc'] = account

#テキストを追加
bodytext='''
宛先各位

本文を記載

KIYO
'''
txt = MIMEText(bodytext)
msg.attach(txt)

#Excelを添付
path_attach = r"Excelファイルのパスを入れてください"
attachment = MIMEBase('application', 'vnd.ms-excel')
with open(path_attach, 'rb') as fp:
   attachment.set_payload(fp.read())

encoders.encode_base64(attachment)
attachment.add_header("Content-Disposition",
"attachment", filename=os.path.basename(path_attach))
msg.attach(attachment)


if __name__=='__main__':
   send_outlook_mail(msg)

3.コード解説

3-1. ライブラリ、必要情報を変数化

 必要なライブラリを読み込み、メール情報を変数に入れます(accountとmailinglist_tosendは要編集)。
最後の行は今日の日付の文字列をdateinfoという変数に入れます。(件名用)

import smtplib, ssl, os
from email.mime.text import MIMEText
import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
from email import encoders

account = 'KIYO@outlook' #自分のメールアドレス
mailinglist_tosend = 'KIYO@outlook' #宛先のメールアドレス
password = 'メールソフトのパスワードを入れてね'
dateinfo = datetime.datetime.today().strftime('%Y年%m月%d日更新') #今日の日付を取得します。

3-2. メール送付処理の関数化

smtplibを使用してoffice365からメールを送付する処理を関数化します。

def send_outlook_mail(msg):
   server = smtplib.SMTP('smtp.office365.com', 587)
   server.ehlo()
   server.starttls()
   server.ehlo()
   server.login(
       account,
       password
   )
   server.send_message(msg)   

3-3.メール情報を入力

MIMEMultipartをインスタンス化(msg = MIMEMultipart())します。この時点のイメージは、msgが空のウィンドウが開いた状態です。このmsgに件名(Subject)、宛先(To)、送信先(From)、CC(Cc)、テキストを入力します。

#メールデータを作成
msg = MIMEMultipart()
msg['Subject'] = f'【定期メール】 出社予定表@{dateinfo}'
msg['To'] = mailinglist_tosend
msg['From'] = account
msg['Cc'] = account

#テキストを追加
bodytext='''
宛先各位

本文を記載してください。

KIYO
'''

txt = MIMEText(bodytext)
msg.attach(txt)

3-4. ファイルを添付(添付不要であれば省略可)

ファイルを添付します。注意点として添付するファイルによってMIMEBase()の記載方法は異なり下記はExcel専用です。

#Excelを添付
path_attach = r"Excelファイルのパスを入れてください"
attachment = MIMEBase('application', 'vnd.ms-excel')
with open(path_attach, 'rb') as fp:
   attachment.set_payload(fp.read())

encoders.encode_base64(attachment)
attachment.add_header("Content-Disposition",
"attachment", filename=os.path.basename(path_attach))
msg.attach(attachment)

3-5.モジュールを実行時のみ処理させる記述

3-2.で作成したsend_outlook_mail()関数に3.~4.で情報を追加したmsgを引数に入れて処理することでメール送付を実行します。
※なお作成ファイルの拡張子は.pyとなります。(.ipynbは多分無理)

if __name__=='__main__':
   send_outlook_mail(msg)

if __name__=='__main__'の記載は、pythonファイルとして実行されたときに下記処理を実行するために記述です。(これがないと例えばモジュールをimportしたときに処理が実行される。)

4.【参考】定期実行

上記はメール処理の操作のみとなります。Windows用の定期実行は下記記事をご確認ください。タスクスケジューラはPC電源が入っていないと実行されないため常に実行できる環境にしたい場合はクラウドを利用します。

●Windowsの人:タスクスケジューラ
●Macの人:カレンダー
●ガチ勢:クラウド(githubやクラウド)に挙げてコードを記載

5.【参考】プロキシ設定:社内から使おう

プロキシ設定って何??という人にしっかり説明できるほどの知識はないため避けますが、おそらく大企業なら基本的にプロキシサーバーを使用していると思います(確認は自社の情報部門の人に聞くのがいいと思います)。
結論として、プロキシサーバーを使用している会社の社内メールを使用したい場合は社内からしかできない(自宅PCでトライアルしても多分無理)です。
自宅PCでできない人は社内LANに入ってトライアルしてみてください。

あとがき

プロキシサーバーの問題は結構しんどかった。G-mailとyahooはいけたのにOutlookができないので自分のコードをずっと疑っていたのに社内でやったらすんなりいけた。
あと最近定期メールになれたのかプロジェクト表更新をすっぽかされることも増えたため、単純な定期メールだけだと十分な管理ができないかな・・・やってくれる人は自然にやってくれるから効果はあるんだけど・・・・

この記事が気に入ったらサポートをしてみませんか?