1. 程式人生 > >Python SMTP傳送QQ郵件

Python SMTP傳送QQ郵件

1、QQ郵箱開通SMTP許可權,並獲取授權碼

QQ郵箱---->設定---->賬戶---->開啟服務---->IMAP/SMTP服務---->獲取授權碼

傳送方和接收方都必須開通

2、傳送純文字郵件:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 配置
mail_host = 'smtp.qq.com'  # 伺服器
mail_port = 587  # mail_sender = '******@qq.com'  # 傳送者郵箱
mail_psw = '******' # 口令,不是郵箱密碼 mail_receivers = ['******@qq.com'] # 接收者郵箱 # 內容 msg_content = '郵件測試內容' msg_subject = 'SMTP郵件測試' msg_from = '傳送者' msg_to = '接受者' msg = MIMEText(msg_content, 'plain', 'utf-8') # 純文字內容 msg['Subject'] = Header(msg_subject, 'utf-8') # 主題 msg['From'] = Header(msg_from,
'utf-8') # 傳送者名稱 msg['To'] = Header(msg_to, 'utf-8') # 接收者名稱 # 傳送 try: stmpObj = smtplib.SMTP(mail_host, mail_port) # 配置伺服器和埠 stmpObj.starttls() # 先加密,部分郵箱服務商要求加密傳輸,避免被竊聽 stmpObj.login(mail_sender, mail_psw) # 登入 stmpObj.sendmail(mail_sender, mail_receivers, msg.as_string()) # 傳送郵件
    stmpObj
.quit()
print('傳送成功')except smtplib.SMTPException as e: print('Error:', e)
# 構造MIMEText物件時,第一個引數就是郵件正文,第二個引數是MIMEsubtype,傳入'plain',最終的MIME就是'text/plain',最後一定要用utf-8編碼保證多語言相容性。

# as_string()MIMEText物件變成str

執行結果:


3、傳送HTML格式郵件

msg_content = '''
<p>郵件測試內容</p>
<p><a href='http://www.baidu.com'>百度連結</a></p>
'''
msg = MIMEText(msg_content, 'html', 'utf-8')  # 帶HTML文字

執行結果:


4、同時支援HTML和Plain格式

msg = MIMEMultipart('alternative')

msg['Subject'] = Header(msg_subject, 'utf-8')  # 主題
msg['From'] = Header(msg_from, 'utf-8')  # 傳送者名稱
msg['To'] = Header(msg_to, 'utf-8')  # 接收者名稱
msg.attach(MIMEText(str('Python測試內容'),'plain','utf-8'))
msg.attach(MIMEText('<p><a href="http://www.baidu.com"></a></p>','html','utf-8'))

5、傳送帶附件的郵件

# 如果Email中要加上附件怎麼辦?帶附件的郵件可以看做包含若干部分的郵件:
# 文字和各個附件本身,所以,可以構造一個MIMEMultipart物件代表郵件本身,
# 然後往裡面加上一個MIMEText作為郵件正文,再繼續往裡面加上表示附件的MIMEBase物件即可:

# 郵件物件
msg = MIMEMultipart()
msg['Subject'] = Header(msg_subject, 'utf-8')  # 主題
msg['From'] = Header(msg_from, 'utf-8')  # 傳送者名稱
msg['To'] = Header(msg_to, 'utf-8')  # 接收者名稱
# 郵件正文MIMEText
msg.attach(MIMEText(msg_content, 'plain', 'utf-8'))

# 郵件附件--圖片
attachment = MIMEBase('image','png',filename = 'bd_logo1.png')
attachment.add_header('Content-Disposition','attachment',filename = 'bd_logo1.png')
attachment.add_header('Content-ID','<logo>')
attachment.add_header('X-Attachment-Id','logo')

fp = open('bd_logo1.png','rb')
attachment.set_payload(fp.read())  # 載入附件內容
encoders.encode_base64(attachment)  # base64編碼
msg.attach(attachment)

# 要把圖片嵌入到郵件正文中,我們只需按照發送附件的方式,先把郵件作為附件新增進去,
# 然後,在HTML中通過引用src="cid:0"就可以把附件作為圖片嵌入了。
# 如果有多個圖片,給它們依次編號,然後引用不同的cid:x即可。

6、繼承關係

# 構造一個郵件物件就是一個Messag物件,如果構造一個MIMEText物件,就表示一個文字郵件物件,
# 如果構造一個MIMEImage物件,就表示一個作為附件的圖片,要把多個物件組合起來,
# 就用MIMEMultipart物件,而MIMEBase可以表示任何物件。它們的繼承關係如下:
Message
+- MIMEBase
    +- MIMEMultipart
    +- MIMENonMultipart
        +- MIMEMessage
        +- MIMEText
        +- MIMEImage

參考連結:

廖雪峰

菜鳥教程