全部產品
Search
文件中心

Alibaba Mail:SMTP郵件投遞代碼之Python3.6及以上調用樣本

更新時間:Dec 11, 2025

本文為SMTP郵件投遞代碼調用樣本,適用於Python3.6及以上。

Alibaba Mail配置

SMTP伺服器位址:

新加坡網站:smtp.sg.aliyun.com

中國香港網站:smtp.hk.aliyun.com

德國網站:smtp.de.alibabacloud.com

美國網站:smtp.us.alibabacloud.com

連接埠:非加密25,SSL加密465


# -*- 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,使用者名稱
username = 'XXXXXXXX'
# password,如果開啟了三方用戶端安全密碼需要使用網頁端產生的安全密碼,如果沒有開啟使用郵箱登入密碼
password = 'XXXXXXXX'
# 自訂的回信地址
replyto = 'XXXXXXXX'
# 顯示的To收信地址
rcptto = ['address1@example.net', 'address2@example.net']
# 顯示的Cc收信地址
rcptcc = ['address3@example.net', 'address4@example.net']
# Bcc收信地址,密送人不會顯示在郵件上,但可以收到郵件
rcptbcc = ['address5@example.net', 'address6@example.net']
receivers = rcptto + rcptcc + rcptbcc

# 構建alternative結構
msg = MIMEMultipart('alternative')
msg['Subject'] = Header('自訂信件主題')
msg['From'] = formataddr(["自訂發信暱稱", username])  # 暱稱+發信地址(或代發)
# list轉為字串
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()


# 構建alternative的text/plain部分
# textplain = MIMEText('自訂TEXT純文字部分', _subtype='plain', _charset='UTF-8')
# msg.attach(textplain)

# 構建alternative的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
    # client = smtplib.SMTP_SSL('smtp.qiye.aliyun.com', 465)

    # python 3.10/3.11新版本若出現ssl握手失敗,請使用下列方式處理:
    # ctxt = ssl.create_default_context()
    # ctxt.set_ciphers('DEFAULT')
    # client = smtplib.SMTP_SSL('smtp.qiye.aliyun.com', 465, context=ctxt)

    # SMTP普通連接埠為25
    client = smtplib.SMTP('smtp.sg.aliyun.com', 25, timeout=10)
    # 開啟DEBUG模式
    # 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))