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を使用してメールを送信する簡単な例です:
例
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
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など)を使用することもできます。
例
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_host="smtp.XXX.com"
mail_user="XXXX"
mail_pass="XXXXXX"
sender = '[email protected]'
receivers = ['[email protected]']
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)
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に設定することです。具体的なコードは次のとおりです:
例
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
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 を使用して送信します。
例
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]']
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'))
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
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テキストに外部リンクを追加しても、一般的なメールサービスプロバイダーでは無効です。画像を正しく追加する例は次のとおりです:
例
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]']
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()
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
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)
server.login(my_sender, my_pass)
server.sendmail(my_sender,[my_user,],msg.as_string())
server.quit()
except Exception:
ret=False
return ret
ret=mail()
if ret:
print("メール送信成功")
else:
print("メール送信失敗")
$ python test.py
邮件发送成功
送信に成功したら、受信者のメールボックスにログインして確認できます:

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