ChatGPTに、Gmailから一斉メール配信するPythonコードを書いてもらいました。
日常的に一斉メールやメルマガを運用している場合は専用ソフトや商用サービスを契約・利用していると思いますが、突発的に一斉メールを配信したい場合、手作業で一通づつ送るとかbccにセットして送るとかのは怖いので、簡易的にシステムを組んで。。。という想定です。
ちなみにGmail側の制限として1日のメール送信上限が500通のため、500通以上の場合は素直に商用サービスを利用しましょう。例えばSendgridなら無料で1.2万通/月なので、それでも良いかも。
指示文(プロンプト):
Pythonでメールを一斉送信するプログラムを作成して提示してください。
smtpにはgmailを利用します。アプリパスワードは取得済みです。
一斉送信する送信リストはcsvファイルから読み込みます。csvには、行ごとに宛先名とメールアドレスが書かれています。
送信したいメールの本文も外部のテキストファイルから読み込ませたいです。メール本文の中で、送信リストから取得した宛先名を差し込んで送信したいです。
回答:
まず、GmailのSMTPサーバーを使うには、アプリパスワードだけでなく、Googleアカウントのセキュリティ設定で「安全性の低いアプリのアクセス」を有効にする必要があります1。
次に、Pythonでメールを送信するには、emailパッケージとsmtplibモジュールを使います1。添付ファイル付きのメールを送信する場合は、email.mimeパッケージも必要です2。
宛先のリストはcsvファイルから読み込むということですが、csvファイルの形式は以下のようになっているということでよろしいでしょうか?
宛先名,メールアドレス
山田太郎,yamada@example.com
鈴木花子,suzuki@example.com
佐藤一郎,sato@example.com
送信したいメールの本文も外部のテキストファイルから読み込ませたいということですが、テキストファイルの中で、宛先名を差し込むためには、何かしらのプレースホルダーを使う必要があります。例えば、以下のように{name}というプレースホルダーを使ってみましょう。
{name}様
お世話になっております。
この度は弊社製品をご購入いただきありがとうございます。
以下のURLからアンケートにご協力いただけますと幸いです。
https://example.com/survey
今後ともよろしくお願いいたします。
このようにすれば、{name}の部分をcsvファイルから取得した宛先名に置き換えることができます。 では、以上の仕様に基づいて、Pythonでメールを一斉送信するプログラムを作成してみましょう。以下がコードブロックです。
# 必要なライブラリをインポート
import csv
import smtplib
import ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# GmailのSMTPサーバーの情報
smtp_server = "smtp.gmail.com"
port = 587
# 送信元のGmailアドレスとアプリパスワード
sender_email = "your_email@gmail.com"
password = "your_app_password"
# メールの件名
subject = "弊社製品に関するアンケートのお願い"
# テキストファイルからメール本文を読み込む
with open("message.txt", "r", encoding="utf-8") as f:
message_template = f.read()
# csvファイルから宛先リストを読み込む
with open("recipients.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
next(reader) # ヘッダー行をスキップ
recipients = list(reader) # 宛先リストをリスト型に変換
# SSLコンテキストを作成
context = ssl.create_default_context()
# SMTPサーバーに接続してメール送信処理を開始
try:
server = smtplib.SMTP(smtp_server, port)
server.ehlo()
# TLS暗号化を開始
server.starttls(context=context)
server.ehlo()
# Gmailアカウントにログイン
server.login(sender_email, password)
# 宛先リストの各要素に対してメール送信処理を繰り返す
for name, email in recipients:
# メールの本文を作成
message = message_template.format(name=name)
# メールのオブジェクトを作成
msg = MIMEMultipart()
msg["From"] = sender_email
msg["To"] = email
msg["Subject"] = subject
# メールの本文をオブジェクトに追加
msg.attach(MIMEText(message, "plain"))
# メールを送信
server.sendmail(sender_email, email, msg.as_string())
print(f"Sent email to {name} at {email}")
# SMTPサーバーとの接続を終了
server.quit()
except Exception as e:
# エラーが発生した場合は表示
print(e)
結果:
送信元のGmailアドレスとアプリパスワードをセットして、テストしたところ、以下のように成功しました。
宛先リストcsvの構造とメールテンプレートの書式は、提示されたものに従いました(指示が漏れていた・・・)。