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を使用してメールを送信する簡単な例です:

例

#!/usr/bin/python # -*- coding: UTF-8 -*- 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(メール転送エージェントプログラム)がインストールされている場合は、次のように出力されます:

$ python test.py 
邮件发送成功

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

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

例

#!/usr/bin/python # -*- coding: UTF-8 -*- 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/python # -*- coding: UTF-8 -*- 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がインストールされている場合、次のように出力されます:

$ python test.py 
邮件发送成功

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


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

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

例

#!/usr/bin/python # -*- coding: UTF-8 -*- 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: メールを送信できません"
$ python test.py 
邮件发送成功

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


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

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

例

#!/usr/bin/python # -*- coding: UTF-8 -*- 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: メールを送信できません"
$ python test.py 
邮件发送成功

受信トレイを確認すると(迷惑メールフォルダにある場合は、受信トレイに移動しないと正常に表示されない場合があります)、メール情報を確認できます:


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

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

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

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

以下の例では、変更が必要です:送信者メール(あなたのQQメール)、パスワード、受信者メール(自分宛てに送信可能)。

QQ SMTP

#!/usr/bin/python # -*- coding: UTF-8 -*- 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/2/library/email-examples.html。

その他の拡張機能