PythonでSMTPメール送信:簡単・確実なガイド
SMTPとは
Simple Mail Transfer Protocol(SMTP)は、メールの送信とメールサーバー間のメールルーティングを処理するプロトコルです。
Pythonはsmtplibモジュールを提供しており、SMTPクライアントセッションオブジェクトを定義しています。これを使用して、SMTPまたはESMTPリスナーデーモンを持つ任意のインターネットマシンにメールを送信できます。
SMTPオブジェクトの作成
後にメール送信に使用できるSMTPオブジェクトを作成する簡単な構文:
import smtplib
smtpObj = smtplib.SMTP([host[, port[, local_hostname]]])
パラメータの詳細
- host - SMTPサーバーを実行しているホスト。ホストのIPアドレスやtutorialspoint.comのようなドメイン名を指定可能。省略可能
- port -
host引数を指定する場合、SMTPサーバーがリッスンしているポートを指定する必要がある。通常は25 - local_hostname - SMTPサーバーがローカルマシンで実行されている場合、このオプションとして
localhostを指定可能
SMTPオブジェクトにはsendmailというインスタンスメソッドがあり、通常メール送信の作業に使用されます。3つのパラメータを取ります:
- sender - 送信者のアドレスを含む文字列
- receivers - 受信者ごとに1つずつ文字列を含むリスト
- message - 各種RFCで指定された形式でフォーマットされたメッセージ文字列
基本的なメール送信例
Pythonスクリプトでメールを1通送信する簡単な方法です。試してみてください。
#!/usr/bin/python
import smtplib
sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']
message = """From: From Person
To: To Person
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
except SMTPException:
print("Error: unable to send email")
ここでは、トリプルクォートを使用して基本的なメールをmessageに配置し、ヘッダーを正しくフォーマットするように注意しています。メールにはFrom、To、Subjectヘッダーが必要で、これらはメール本文から空行で区切られます。
メールを送信するには、smtpObjを使用してローカルマシンのSMTPサーバーに接続し、メッセージ、送信元アドレス、宛先アドレスをパラメータとしてsendmailメソッドを使用します(fromとtoアドレスはメール内にもありますが、これらが常にメールのルーティングに使用されるわけではありません)。
ローカルマシンでSMTPサーバーを実行していない場合、smtplibクライアントを使用してリモートSMTPサーバーと通信できます。Webメールサービス(Hotmail、Yahoo! Mailなど)を使用していない限り、メールプロバイダーから送信メールサーバーの詳細が提供されているはずです。それらを以下のように指定できます。
smtplib.SMTP('mail.your-domain.com', 25)
HTMLメールの送信
Pythonでテキストメッセージを送信すると、すべてのコンテンツが単純なテキストとして扱われます。テキストメッセージにHTMLタグを含めても、単純なテキストとして表示され、HTMLタグはHTML構文に従ってフォーマットされません。しかし、PythonにはHTMLメッセージを実際のHTMLメッセージとして送信するオプションがあります。
メールメッセージを送信する際、MIMEバージョン、コンテンツタイプ、文字セットを指定してHTMLメールを送信できます。
例:HTMLコンテンツをメールとして送信
#!/usr/bin/python
import smtplib
message = """From: From Person
To: To Person
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
This is HTML message.
This is headline.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print("Successfully sent email")
except SMTPException:
print("Error: unable to send email")
添付ファイル付きメールの送信
複合コンテンツのメールを送信するには、Content-typeヘッダーをmultipart/mixedに設定する必要があります。その後、テキストと添付ファイルのセクションを境界内で指定できます。
境界は、メールのメッセージ部分に出現しない一意の番号に続く2つのハイフンで始まります。メールの最終セクションを示す最終境界も、2つのハイフンで終わる必要があります。
添付ファイルは、送信前にpack("m")関数でエンコードしてbase64エンコードする必要があります。
例:/tmp/test.txtを添付ファイルとして送信
#!/usr/bin/python
import smtplib
import base64
filename = "/tmp/test.txt"
# ファイルを読み込みbase64形式でエンコード
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent) # base64
sender = 'webmaster@tutorialpoint.com'
receiver = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER"
body = """This is a test email to send an attachment."""
# メインヘッダーを定義
part1 = """From: From Person
To: To Person
Subject: Sending Attachment
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# メッセージアクション部分を定義
part2 = """Content-Type: text/plain
Content-Transfer-Encoding: 8bit
%s
--%s
""" % (body, marker)
# 添付ファイルセクションを定義
part3 = """Content-Type: multipart/mixed; name="%s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" % (filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receiver, message)
print("Successfully sent email")
except Exception:
print("Error: unable to send email")
Python
- Raspberry PiでTMP006赤外線温度センサーを使う – Pythonライブラリとセットアップガイド
- Raspberry PiとPythonでリモート温度センサーを構築 – ステップバイステップガイド
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Python例外処理マスター:try、except、else、finallyを徹底解説
- Pythonで平均を計算する:実践ガイド
- Pythonで一時変数なしで2変数をスワップするワンライナー
- Javaでメールを送信する方法:ステップバイステップガイド