今回はsmtplibというモジュールを使って
python上からメールを送るレッスン。
pythonはライブラリのインポートが簡単で使いやすいですね。
(他の言語は知らないけども)
ついでに、Gitなどでアップする時に間違えて大事な情報とかもアップしないように
.envを使った環境変数を使ったコーディングもしていきます。
環境変数とは…
https://wa3.i-3-i.info/word11027.html
ここのリンクでざっくりわかりますが、さらにざっくり言うならば
python上の変数ではなく、使っているPCのos上で作られる変数。
なのでpythonファイルに直接大事な情報はコーディングしなくても動かせます。
自動メール送信アプリの流れはこちら
- 誕生日や名前、メアドを入力したcsvをインポートする
- 今日と誕生日を参照して、今日が誕生日の人がいたらメールを送る
- メールは毎年同じにならないようにランダムにメールテンプレートを作る
smptモジュールは型を覚えるだけ
ちょうどこのレッスンを最初に受けた時に覚えとこうと思って書いたtips。
これは環境変数使ってない直書きなので公開の際には使えないけど。。
コーディングしていきます。
import smtplib
import datetime as dt
import pandas as pd
import random
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
password = os.environ.get("PASSWORD") # 環境変数の値をAPに代入
my_email = os.environ.get("MY_EMAIL")
now = dt.datetime.now()
data = pd.read_csv("birthdays.csv")
data_dic = data.to_dict(orient="records")
import os〜("MY_EMAIL")のコードは先ほど言っていた環境変数を使うモジュールで、
普通環境変数を使う時はターミナルを使ってやるのだけども
検索してみたらこれが出てきたので、これならプロジェクトごとに環境変数管理しやすいし見やすいしいいじゃんと思って採用しています。
こちらを参考にしました。
あとは今日を取得するためにdatetime、レターのテンプレをランダムに取得するためにrandomモジュールをインポートしています。
pandasでcsvを整形して辞書型リストにフォーマットしています。
csvの入力例はこんな感じ
name,email,year,month,day
dad,dad-sample@emailadmin.com,1961,5,10
今日が誕生日の人を確認して該当するならメールを送る
for i in range(len(data_dic)):
if now.month == data_dic[i]["month"] and now.day == data_dic[i]["day"]:
with open(f"letter_templates/letter_{random.randint(1,3)}.txt") as mail_temp:
letter = mail_temp.read().replace("[NAME]", data_dic[i]["name"])
with smtplib.SMTP("smtp.gmail.com", port=587) as connection:
connection.starttls()
connection.login(user=my_email, password=password)
connection.sendmail(
from_addr=my_email,
to_addrs=data_dic[i]["email"],
msg=f"Subject:Happy Birthday!\n\n{letter}")
else:
print("Not birthday")
forでリストの中にある人を全部見ていき、
月と日が同じであればメールテンプレをランダムで取得し、
replaceで[NAME]の部分をcsvのnameに入れている名前に変更。
次にメールを開いて型通りに入力していきます。
smtpのサーバーは今回はgmailにしています。gmailにしている場合、port=587がないと正常に動かなかったので入れています。
詳しく知りたい方はこちら
誕生日が該当しない場合はNot birthdayというのを出力しますが、
特になくてもいいです。
今回はこれだけ。Gitはこちらです。