exchange 只發送郵件 不能登入_Python: 通過QQ郵箱傳送電子郵件
技術標籤:exchange 只發送郵件 不能登入
文章背景:自學Python程式設計快速上手
中關於傳送電子郵件的章節。本文講述如何通過Python,使用QQ郵箱傳送電子郵件。
連線到SMTP伺服器
import smtplibsmtpObj = smtplib.SMTP('smtp.qq.com',587)
傳送SMTP的“Hello”訊息
smtpObj.ehlo()
開始TLS加密
smtpObj.starttls()
登陸到SMTP伺服器
smtpObj.login('[email protected]','MY_SECRET_PASSWORD')
對於MY_SECRET_PASSWORD,針對QQ郵箱,需要輸入的是授權碼。授權碼是QQ郵箱推出的,用於登入第三方客戶端的專用密碼。適用於登入以下服務:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務。
將密碼放在原始碼中要當心。呼叫input(),讓使用者輸入密碼是個好主意。
傳送電子郵件
from email.mime.text import MIMETextfrom email.header import Headerfrom email.utils import parseaddr, formataddrdef _format_addr(s): name, addr = parseaddr(s) return formataddr((Header(name, 'utf-8').encode(), addr))from_addr = '[email protected]' # 發件人to_addr = '
[email protected]' # 收件人message = MIMEText('Happy new year!', 'plain', 'utf-8') # 正文message['From'] = _format_addr('Sam ' % from_addr) # 發件人message['To'] = _format_addr('Python lover ' % to_addr) # 收件人subject = 'Python SMTP 郵件測試'message['Subject'] = Header(subject, 'utf-8') #主題smtpObj.sendmail(from_addr, [to_addr], message.as_string())
郵件主題、如何顯示發件人、收件人等資訊並不是通過SMTP協議傳送出去,而是包含在發給message的文字中。所以,我們必須把
From
、To
和Subject
新增到MIMEText
中,才是一封完整的郵件。函式
_format_addr()
用來格式化一個郵件地址;如果包含中文,需要通過Header
物件進行編碼。message['To']接收的是字串而不是list,如果有多個郵件地址,用
,
分隔即可。sendmail()
方法就是發郵件,由於可以一次發給多個人,所以傳入一個list
,郵件正文是一個str
,as_string()
把MIMEText
物件變成str
。
從SMTP伺服器斷開
smtpObj.quit()
程式碼彙總
import smtplibfrom email.mime.text import MIMETextfrom email.header import Headerfrom email.utils import parseaddr, formataddrdef _format_addr(s): name, addr = parseaddr(s) return formataddr((Header(name, 'utf-8').encode(), addr))# 1. 連線到SMTP伺服器smtpObj = smtplib.SMTP('smtp.qq.com',587)# 2. 傳送SMTP的“HELLO”訊息smtpObj.ehlo()# 3. 開始TLS加密smtpObj.starttls()# 4. 登陸到SMTP伺服器smtpObj.login('[email protected]','MY_SECRET_PASSWORD')# 5. 傳送電子郵件from_addr = '[email protected]' # 發件人to_addr = '[email protected]' # 收件人message = MIMEText('Happy new year!', 'plain', 'utf-8') # 正文message['From'] = _format_addr('Sam ' % from_addr) # 發件人message['To'] = _format_addr('Python lover ' % to_addr) # 收件人subject = 'Python SMTP 郵件測試'message['Subject'] = Header(subject, 'utf-8') #主題smtpObj.sendmail(from_addr, [to_addr], message.as_string())# 6. 從伺服器斷開smtpObj.quit()print("Done!")
執行程式碼後,開啟收件箱,效果如下:
參考資料:
[1] Python程式設計快速上手—讓繁瑣工作自動化(https://ddz.red/AFTmO)
[2] QQ郵箱的POP3與SMTP伺服器(https://service.mail.qq.com/cgi-bin/help?subtype=1&no=167&id=28)
[3] 授權碼(https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256%27)
[4] SMTP傳送郵件(https://www.liaoxuefeng.com/wiki/1016959663602400/1017790702398272)
[5] Python SMTP傳送郵件(https://www.runoob.com/python/python-email.html)