UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY32 csvに登録された人の誕生日の日に自動でメールを送るアプリを作る!

今回はsmtplibというモジュールを使って

python上からメールを送るレッスン。

 

pythonはライブラリのインポートが簡単で使いやすいですね。

(他の言語は知らないけども)

 

ついでに、Gitなどでアップする時に間違えて大事な情報とかもアップしないように

.envを使った環境変数を使ったコーディングもしていきます。

 

環境変数とは…

https://wa3.i-3-i.info/word11027.html

 

ここのリンクでざっくりわかりますが、さらにざっくり言うならば

python上の変数ではなく、使っているPCのos上で作られる変数。

なのでpythonファイルに直接大事な情報はコーディングしなくても動かせます。

 

 

自動メール送信アプリの流れはこちら

  • 誕生日や名前、メアドを入力したcsvをインポートする
  • 今日と誕生日を参照して、今日が誕生日の人がいたらメールを送る
  • メールは毎年同じにならないようにランダムにメールテンプレートを作る

 

smptモジュールは型を覚えるだけ

go-python.hatenablog.com

 

ちょうどこのレッスンを最初に受けた時に覚えとこうと思って書いた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")のコードは先ほど言っていた環境変数を使うモジュールで、

普通環境変数を使う時はターミナルを使ってやるのだけども

検索してみたらこれが出てきたので、これならプロジェクトごとに環境変数管理しやすいし見やすいしいいじゃんと思って採用しています。

 

こちらを参考にしました。

qiita.com

 

あとは今日を取得するために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がないと正常に動かなかったので入れています。

 

詳しく知りたい方はこちら

qiita.com

 

誕生日が該当しない場合はNot birthdayというのを出力しますが、

特になくてもいいです。

 

 

今回はこれだけ。Gitはこちらです。

github.com