Python 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プロトコルで定義されている形式です。
例
以下の実行例では、ローカルマシンにsendmailなどの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(メール転送エージェントプログラム)がインストールされている場合は、次のように出力されます:
$ python 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がインストールされている場合、次のように出力されます:
$ python 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: メールを送信できません"
$ python 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: メールを送信できません"
$ python test.py
邮件发送成功
受信トレイを確認すると(迷惑メールフォルダにある場合は、受信トレイに移動しないと正常に表示されない場合があります)、メール情報を確認できます:

サードパーティのSMTPサービスを使用して送信する
ここではQQメールのSMTPサービスを使用します(163、Gmailなども使用できます)。以下の設定が必要です:

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/2/library/email-examples.html。
その他の拡張機能