すべてのプロダクト
Search
ドキュメントセンター

Direct Mail:Python 3.6 以降の SMTP 呼び出し例

最終更新日:Dec 20, 2025

この Topic では、Python 3.6 以降で SMTP プロトコルを使用してメールを送信する方法を説明します。

サンプルコード:

# -*- coding:utf-8 -*-
import smtplib
import email
# import json
# import base64
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# from email.mime.image import MIMEImage
# from email.mime.base import MIMEBase
# from email.mime.application import MIMEApplication
from email.header import Header
from email.utils import formataddr
# import urllib.request
# import ssl

# コンソールで作成された送信元アドレス。
username = 'XXXXXXXX'
# コンソールで作成された SMTP パスワード。
password = 'XXXXXXXX'
# カスタムの返信先アドレス。コンソールの設定とは独立しています。Direct Mail の送信元アドレスはメールを受信しません。受信者が返信すると、メールは指定された返信先アドレスに自動的に送信されます。
replyto = 'XXXXXXXX'
# 表示される To 受信者アドレス。
rcptto = ['address1@example.net', 'address2@example.net']
# 表示される Cc 受信者アドレス。
rcptcc = ['address3@example.net', 'address4@example.net']
# Bcc 受信者アドレス。Bcc 受信者はメールに表示されませんが、メールを受信できます。
rcptbcc = ['address5@example.net', 'address6@example.net']
# Cc アドレスを含むすべての受信者アドレス。1回の送信で 60 人を超える受信者には送信できません。
receivers = rcptto + rcptcc + rcptbcc

# 代替構造を構築します。
msg = MIMEMultipart('alternative')
msg['Subject'] = Header('カスタムメールの件名')
msg['From'] = formataddr(["カスタム送信者のニックネーム", username])  # ニックネーム + 送信元アドレス (またはプロキシ送信者)
# リストを文字列に変換します。
msg['To'] = ",".join(rcptto)
msg['Cc'] = ",".join(rcptcc)
msg['Reply-to'] = replyto  # 返信メールを受信するために使用します。受信者は標準プロトコルをサポートしている必要があります。
msg['Return-Path'] = 'test@example.net'  # バウンスメールを受信するために使用します。受信者は標準プロトコルをサポートしている必要があります。
msg['Message-id'] = email.utils.make_msgid()  # message-id は各メールを一意に識別します。フォーマットは RFC 5322 に準拠する必要があります (例:<uniquestring@example.com>)。uniquestring はメールサーバーによって生成される一意の識別子で、タイムスタンプや乱数などの情報を含む場合があります。
msg['Date'] = email.utils.formatdate()

# メールトラッキングサービスを有効にするには、次のコードを使用してトラッキングリンクヘッダーを設定します。
# メールの送信にはタグが必要です。このタグはコンソールで作成する必要があり、作成後 10 分で使用可能になります。
# トラッキングリンクヘッダーを設定します。
# tagName = 'xxxxxxx'
#
# # OpenTrace と LinkTrace の値は、文字列 '1' に固定されています。
# trace = {
#     "OpenTrace": '1',  # メールの開封トラッキングを有効にします。
#     "LinkTrace": '1',  # メール内の URL クリックトラッキングを有効にします。
#     "TagName": tagName  # コンソールで作成されたタグ名。
# }
# jsonTrace = json.dumps(trace)
# base64Trace = str(base64.b64encode(jsonTrace.encode('utf-8')), 'utf-8')
# # print(base64Trace)
# msg.add_header("X-AliDM-Trace", base64Trace)


# 代替構造の text/plain パートを構築します。
# textplain = MIMEText('カスタムプレーンテキストパート', _subtype='plain', _charset='UTF-8')
# msg.attach(textplain)

# 代替構造の text/html パートを構築します。
texthtml = MIMEText('カスタム HTML ハイパーテキストパート', _subtype='html', _charset='UTF-8')
msg.attach(texthtml)

# # ローカルの添付ファイルを送信します。
# files = [r'C:\Users\Downloads\test1.jpg', r'C:\Users\Downloads\test2.jpg']
# for t in files:
#     filename = t.rsplit('/', 1)[1]
#     part_attach1 = MIMEApplication(open(t, 'rb').read())  # 添付ファイルを開きます。
#     part_attach1.add_header('Content-Disposition', 'attachment', filename=filename)  # 添付ファイルに名前を付けます。
#     msg.attach(part_attach1)  # 添付ファイルを追加します。

# # URL から添付ファイルを送信します。
# files = [r'https://example.oss-cn-shanghai.aliyuncs.com/xxxxxxxxxxx.png']
# for t in files:
#     filename=t.rsplit('/', 1)[1]
#     response = urllib.request.urlopen(t)
#     part_attach1 = MIMEApplication(response.read())  # 添付ファイルを開きます。これはローカルファイルではありません。
#     part_attach1.add_header('Content-Disposition', 'attachment', filename=filename)  # 添付ファイルに名前を付けます。
#     msg.attach(part_attach1)  # 添付ファイルを追加します。


# メールを送信します。
try:
    # SSL を使用して暗号化するには、次のようにクライアントを作成します。
    # client = smtplib.SMTP_SSL('smtpdm.aliyun.com', 465)
    
    # Python 3.10 または 3.11 で SSL ハンドシェイクが失敗した場合は、次のように処理します。
    # ctxt = ssl.create_default_context()
    # ctxt.set_ciphers('DEFAULT')
    # client = smtplib.SMTP_SSL('smtpdm.aliyun.com', 465, context=ctxt)
    
    
    # 標準の SMTP ポートは 25 と 80 です。
    client = smtplib.SMTP('smtpdm.aliyun.com', 80)
    # デバッグモードを有効にします。有効にするには 1 に設定します。
    client.set_debuglevel(0)
    # 送信者と認証アドレスは同じである必要があります。
    client.login(username, password)
    # 注:DATA コマンドの戻り値を取得するには、smtplib.sendmail のカプセル化メソッドをご参照ください。
    # SMTP.mail、SMTP.rcpt、および SMTP.data メソッドを使用します。
    # print(receivers)
    client.sendmail(username, receivers, msg.as_string())  # 複数の受信者がサポートされています。具体的な制限については、仕様をご参照ください。
    client.quit()
    print('メールの送信に成功しました!')
except smtplib.SMTPConnectError as e:
    print('メールの送信に失敗しました。接続失敗:', e.smtp_code, e.smtp_error)
except smtplib.SMTPAuthenticationError as e:
    print('メールの送信に失敗しました。認証エラー:', e.smtp_code, e.smtp_error)
except smtplib.SMTPSenderRefused as e:
    print('メールの送信に失敗しました。送信者拒否:', e.smtp_code, e.smtp_error)
except smtplib.SMTPRecipientsRefused as e:
    print('メールの送信に失敗しました。受信者拒否:', e.smtp_code, e.smtp_error)
except smtplib.SMTPDataError as e:
    print('メールの送信に失敗しました。データ受信拒否:', e.smtp_code, e.smtp_error)
except smtplib.SMTPException as e:
    print('メールの送信に失敗しました、', str(e))
except Exception as e:
    print('メール送信中に例外が発生しました、', str(e))