なぜこんなものを?
業務(業務以外でも飲み会の出欠とか)で星取り表を作って、それに基づいてまだ未提出の人に催促を行うような、いわゆる雑務はかなりあります。そこでPythonで処理することにしました。ぶっちゃけMicrosoft Office365を使っているような企業ならAutomate Flowを使えばこんなのノーコードでできそうですが、身の回りで使える環境がないためちゃちゃっと用意しました。
参考にしたもの
- 退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング (2017/6/3)Al Sweigart(著), 相川 愛三 (翻訳)
用意するもの
下のような「maillist.xlsx」 というファイルを用意します。
mail_send.py
import openpyxl, smtplib
from email import message
wb = openpyxl.load_workbook('maillist.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
lastCol = sheet.max_column
latest_month = sheet.cell(row=1, column=lastCol).value
# Excelファイルの確認
unpaid_Members = {}
for r in range(2,sheet.max_row + 1):
payment = sheet.cell(row=r, column=lastCol).value
if payment != 'paid':
name = sheet.cell(row=r, column=1).value
email = sheet.cell(row=r, column=2).value
unpaid_Members[name] = email
# メールアカウントにログインする
smtp_host = 'smtp-mail.outlook.com'
smtp_port = 587
send_name = 'Master'
from_email ='master@outlook.jp'
username = 'master@outlook.jp'
password = 'password'
smtp_obj = smtplib.SMTP(smtp_host, smtp_port)
smtp_obj.ehlo()
smtp_obj.starttls()
smtp_obj.login(username,password)
# コマンドラインの画面でユーザにパスワードの入力を要求して
# 入力したいときにはsysパッケージをインポートして下のコードを実行。
# smtp_obj.login(username,sys.argv[1])
# メールを送信する
for name, email in unpaid_Members.items():
msg = message.EmailMessage()
msg.set_content("""
{}様
お疲れさまです。
まだ来週の歓迎会の参加費未払いのようです。
確認をお願いします。
""".format(name))
msg['From'] = '{}<{}>'.format(send_name, from_email)
msg['Subject'] = '{}の支払い分に関しまして'.format(latest_month)
print('メールを送信しています {}...' .format(email))
sendmail_Status = smtp_obj.sendmail(from_email, email, msg.as_string())
if sendmail_Status != {}:
print('{}へメール送信中に問題が起こりました: {}'.format(email,sendmail_Status))
smtp_obj.quit()
使い方
後はこの.pyファイルを実行するだけです。タイムスケジュールを設定して実行することで毎日自動で飲み会の料金建替え徴収を未支払いの人に対して催促することができます。よいメールライフを。