SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。
Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。
首先,我們來構造一個最簡單的純文本郵件:
from email.mime.text import MIMETextmsg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
注意到構造MIMEText對象時,第一個參數就是郵件正文,第二個參數是MIME的subtype,傳入'plain',最終的MIME就是'text/plain',最后一定要用utf-8編碼保證多語言兼容性。
然后,通過SMTP發出去:
# 輸入Email地址和口令:from_addr = raw_input('From: ')password = raw_input('Password: ')# 輸入SMTP服務器地址:smtp_server = raw_input('SMTP server: ')# 輸入收件人地址:to_addr = raw_input('To: ')import smtplibserver = smtplib.SMTP(smtp_server, 25) # SMTP協議默認端口是25server.set_debuglevel(1)server.login(from_addr, password)server.sendmail(from_addr, [to_addr], msg.as_string())server.quit()
我們用set_debuglevel(1)就可以打印出和SMTP服務器交互的所有信息。SMTP協議就是簡單的文本命令和響應。login()方法用來登錄SMTP服務器,sendmail()方法就是發郵件,由于可以一次發給多個人,所以傳入一個list,郵件正文是一個str,as_string()把MIMEText對象變成str。
如果一切順利,就可以在收件人信箱中收到我們剛發送的Email:
仔細觀察,發現如下問題:
郵件沒有主題; 收件人的名字沒有顯示為友好的名字,比如Mr Green <green@example.com>; 明明收到了郵件,卻提示不在收件人中。這是因為郵件主題、如何顯示發件人、收件人等信息并不是通過SMTP協議發給MTA,而是包含在發給MTA的文本中的,所以,我們必須把From、To和Subject添加到MIMEText中,才是一封完整的郵件:
# -*- coding: utf-8 -*-from email import encodersfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddrimport smtplibdef _format_addr(s): name, addr = parseaddr(s) return formataddr(( / Header(name, 'utf-8').encode(), / addr.encode('utf-8') if isinstance(addr, unicode) else addr))from_addr = raw_input('From: ')password = raw_input('Password: ')to_addr = raw_input('To: ')smtp_server = raw_input('SMTP server: ')msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')msg['From'] = _format_addr(u'Python愛好者 <%s>' % from_addr)msg['To'] = _format_addr(u'管理員 <%s>' % to_addr)msg['Subject'] = Header(u'來自SMTP的問候……', 'utf-8').encode()server = smtplib.SMTP(smtp_server, 25)server.set_debuglevel(1)server.login(from_addr, password)server.sendmail(from_addr, [to_addr], msg.as_string())server.quit()
新聞熱點
疑難解答