Python3 SMTPメール送信

SMTP(Simple Mail Transfer Protocol)は、簡単なメール転送プロトコルです。これは、送信元アドレスから宛先アドレスへメールを転送するための一連のルールであり、メールの中継方法を制御します。

Pythonのsmtplibは、電子メールを送信するための非常に便利な方法を提供します。これはSMTPプロトコルを簡単にラップしています。

PythonでSMTPオブジェクトを作成する構文は次のとおりです:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

パラメータの説明:

  • host: SMTP サーバーのホスト。 ホストのIPアドレスまたはドメイン名(example.comなど)を指定できます。これはオプションのパラメータです。
  • port: host パラメータを指定した場合、SMTP サービスが使用するポート番号を指定する必要があります。通常、SMTPのポート番号は25です。
  • local_hostname: SMTPがローカルマシン上にある場合、サーバーアドレスを localhost と指定するだけで済みます。

PythonのSMTPオブジェクトはsendmailメソッドを使用してメールを送信します。構文は次のとおりです:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

パラメータの説明:

  • from_addr: メール送信者のアドレス。
  • to_addrs: 文字列リスト。メールの送信先アドレス。
  • msg: 送信メッセージ

ここで3番目のパラメータに注意してください。msgは文字列で、メールを表します。メールは通常、件名、送信者、受信者、メール本文、添付ファイルなどで構成されることは知っています。メールを送信するときは、msgの形式に注意する必要があります。この形式はSMTPプロトコルで定義された形式です。

例

以下は、Pythonを使用してメールを送信する簡単な例です:

例

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # メールを受信します。あなたのQQメールや他のメールに設定できます # 3つのパラメータ:1つ目はテキスト内容、2つ目は plain でテキスト形式を設定、3つ目は utf-8 でエンコーディングを設定 message = MIMEText('Python メール送信テスト...', 'plain', 'utf-8') message['From'] = Header("サンプル", 'utf-8') # 送信者 message['To'] = Header("テスト", 'utf-8') # 受信者 subject = 'Python SMTP メールテスト' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("メール送信成功") except smtplib.SMTPException: print ("Error: メールを送信できません")

私たちは3つの引用符を使用してメール情報を設定します。標準的なメールには3つのヘッダー情報が必要です:From, To、およびSubject各情報は空行で区切ります。

smtplib モジュールの SMTP オブジェクトをインスタンス化することでsmtpObjSMTPアクセスに接続し、さらにsendmailメソッドで情報を送信します。

上記のプログラムを実行すると、ローカルマシンに sendmail がインストールされていれば、次のように出力されます:

$ python3 test.py 
邮件发送成功

受信トレイ(通常は迷惑メールボックス)を確認すると、メール情報を確認できます:

ローカルマシンに sendmail アクセスがない場合は、他のプロバイダーの SMTP アクセス(QQ、NetEase、Googleなど)を使用することもできます。

例

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header # サードパーティのSMTPサービス mail_host="smtp.XXX.com" # サーバーを設定 mail_user="XXXX" # ユーザー名 mail_pass="XXXXXX" # パスワード sender = '[email protected]' receivers = ['[email protected]'] # メールを受信します。あなたのQQメールや他のメールに設定できます message = MIMEText('Python メール送信テスト...', 'plain', 'utf-8') message['From'] = Header("サンプル", 'utf-8') message['To'] = Header("テスト", 'utf-8') subject = 'Python SMTP メールテスト' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 は SMTP のポート番号です smtpObj.login(mail_user,mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print ("メール送信成功") except smtplib.SMTPException: print ("Error: メールを送信できません")

Pythonを使用してHTML形式のメールを送信する

PythonでHTML形式のメールを送信する点は、プレーンテキストメッセージのメールを送信する場合と異なり、MIMETextの_subtypeをhtmlに設定することです。具体的なコードは次のとおりです:

例

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # メールを受信します。あなたのQQメールや他のメールに設定できます mail_msg = """<p>Python メール送信テスト...</p> <p><a href="http://www.example.com">これはリンクです</a></p>""" message = MIMEText(mail_msg, 'html', 'utf-8') message['From'] = Header("サンプル", 'utf-8') message['To'] = Header("テスト", 'utf-8') subject = 'Python SMTP メールテスト' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("メール送信成功") except smtplib.SMTPException: print ("Error: メールを送信できません")

上記のプログラムを実行すると、ローカルマシンに sendmail がインストールされていれば、次のように出力されます:

$ python3 test.py 
邮件发送成功

受信トレイ(通常は迷惑メールボックス)を確認すると、メール情報を確認できます:


Python で添付ファイル付きメールを送信する

添付ファイル付きメールを送信するには、まず MIMEMultipart() インスタンスを作成し、次に添付ファイルを構築します。複数の添付ファイルがある場合は、順に構築して、最後に smtplib.smtp を使用して送信します。

例

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # メールを受信します。あなたのQQメールや他のメールに設定できます # 添付ファイル付きのインスタンスを作成 message = MIMEMultipart() message['From'] = Header("サンプル", 'utf-8') message['To'] = Header("テスト", 'utf-8') subject = 'Python SMTP メールテスト' message['Subject'] = Header(subject, 'utf-8') # メール本文の内容 message.attach(MIMEText('これはサンプルのPythonメール送信テスト……', 'plain', 'utf-8')) # 添付ファイル1を構築し、現在のディレクトリにある test.txt ファイルを転送します att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # ここでの filename は任意に書くことができ、書いた名前がメールに表示される名前です att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # 添付ファイル2を構築し、現在のディレクトリにある サンプル.txt ファイルを転送します att2 = MIMEText(open('サンプル.txt', 'rb').read(), 'base64', 'utf-8') att2["Content-Type"] = 'application/octet-stream' att2["Content-Disposition"] = 'attachment; filename="サンプル.txt"' message.attach(att2) try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message.as_string()) print ("メール送信成功") except smtplib.SMTPException: print ("Error: メールを送信できません")
$ python3 test.py 
邮件发送成功

受信トレイ(通常は迷惑メールボックス)を確認すると、メール情報を確認できます:


HTML テキストに画像を追加する

メールのHTMLテキストに外部リンクを追加しても、一般的なメールサービスプロバイダーでは無効です。画像を正しく追加する例は次のとおりです:

例

#!/usr/bin/python3 import smtplib from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # メールを受信します。あなたのQQメールや他のメールに設定できます msgRoot = MIMEMultipart('related') msgRoot['From'] = Header("サンプル", 'utf-8') msgRoot['To'] = Header("テスト", 'utf-8') subject = 'Python SMTP メールテスト' msgRoot['Subject'] = Header(subject, 'utf-8') msgAlternative = MIMEMultipart('alternative') msgRoot.attach(msgAlternative) mail_msg = """<p>Python メール送信テスト...</p> <p><a href="http://www.example.com">サンプルリンク</a></p> <p>画像デモ:</p> <p><img src="cid:image1"></p>""" msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 画像を現在のディレクトリに指定 fp = open('test.png', 'rb') msgImage = MIMEImage(fp.read()) fp.close() # 画像IDを定義し、HTMLテキストで参照します msgImage.add_header('Content-ID', '<image1>') msgRoot.attach(msgImage) try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, msgRoot.as_string()) print ("メール送信成功") except smtplib.SMTPException: print ("Error: メールを送信できません")
$ python3 test.py 
邮件发送成功

受信トレイを確認すると(迷惑メールボックスにある場合は、正常に表示するために受信トレイに移動する必要があるかもしれません)、メール情報を確認できます:


サードパーティのSMTPサービスを使用して送信する

ここでは QQ メール(163、Gmailなども使用できます)の SMTP サービスを使用します。次の設定を行う必要があります:

QQメールは認証コードを生成してパスワードを設定します:

QQメールのSMTPサーバーアドレス:smtp.qq.com、SSLポート:465。

以下の例では、修正が必要です:送信者メール(あなたのQQメール)、パスワード、受信者メール(自分宛に送信できます)。

QQ SMTP

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.utils import formataddr my_sender='[email protected]' # 送信者メールアカウント my_pass = 'xxxxxxxxxx' # 送信者メールのパスワード my_user='[email protected]' # 受信者メールアカウント。ここでは自分自身に送信します def mail(): ret=True try: msg=MIMEText('メールの内容を入力','plain','utf-8') msg['From']=formataddr(["Fromサンプル",my_sender]) # 括弧内は、送信者メールのニックネーム、送信者メールアカウントに対応します msg['To']=formataddr(["FK",my_user]) # 括弧内は、受信者メールのニックネーム、受信者メールアカウントに対応します msg['Subject']="サンプルメール送信テスト" # メールの主題、つまりタイトル server=smtplib.SMTP_SSL("smtp.qq.com", 465) # 送信者メールのSMTPサーバー。ポートは25です server.login(my_sender, my_pass) # 括弧内は、送信者メールアカウント、メールパスワードに対応します server.sendmail(my_sender,[my_user,],msg.as_string()) # 括弧内は、送信者メールアカウント、受信者メールアカウント、送信メールに対応します server.quit() # 接続を閉じる except Exception: # try 内のステートメントが実行されない場合は、以下の ret=False が実行されます ret=False return ret ret=mail() if ret: print("メール送信成功") else: print("メール送信失敗")
$ python test.py 
邮件发送成功

送信に成功したら、受信者のメールボックスにログインして確認できます:

詳細は次を参照してください:https://docs.python.org/3/library/email-examples.html。

その他の拡張