python發郵件須要掌握兩個模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import便可使用。smtplib模塊主要負責發送郵件,email模塊主要負責構造郵件。html
smtplib模塊主要負責發送郵件:是一個發送郵件的動做,鏈接郵箱服務器,登陸郵箱,發送郵件(有發件人,收信人,郵件內容)。python
email模塊主要負責構造郵件:指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。服務器
1.smtplib模塊app
smtplib使用較爲簡單。如下是最基本的語法。測試
導入及使用方法以下:ui
import smtplib smtp = smtplib.SMTP() smtp.connect('smtp.163.com,25') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
說明:編碼
smtplib.SMTP():實例化SMTP()debug
connect(host,port):unix
host:指定鏈接的郵箱服務器。經常使用郵箱的smtp服務器地址以下:code
新浪郵箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐郵箱:smtp.sohu.com,126郵箱:smtp.126.com,139郵箱:smtp.139.com,163網易郵箱:smtp.163.com。
port:指定鏈接服務器的端口號,默認爲25.
login(user,password):
user:登陸郵箱的用戶名。
password:登陸郵箱的密碼,像筆者用的是網易郵箱,網易郵箱通常是網頁版,須要用到客戶端密碼,須要在網頁版的網易郵箱中設置受權碼,該受權碼即爲客戶端密碼。
sendmail(from_addr,to_addrs,msg,...):
from_addr:郵件發送者地址
to_addrs:郵件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'
msg:發送消息:郵件內容。通常是msg.as_string():as_string()是將msg(MIMEText對象或者MIMEMultipart對象)變爲str。
quit():用於結束SMTP會話。
2.email模塊
email模塊下有mime包,mime英文全稱爲「Multipurpose Internet Mail Extensions」,即多用途互聯網郵件擴展,是目前互聯網電子郵件廣泛遵循的郵件技術規範。
該mime包下經常使用的有三個模塊:text,image,multpart。
導入方法以下:
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage
構造一個郵件對象就是一個Message
對象,若是構造一個MIMEText
對象,就表示一個文本郵件對象,若是構造一個MIMEImage
對象,就表示一個做爲附件的圖片,要把多個對象組合起來,就用MIMEMultipart
對象,而MIMEBase
能夠表示任何對象。它們的繼承關係以下:
Message +- MIMEBase +- MIMEMultipart +- MIMENonMultipart +- MIMEMessage +- MIMEText +- MIMEImage
2.1 text說明
郵件發送程序爲了防止有些郵件閱讀軟件不能顯示處理HTML格式的數據,一般都會用兩類型分別爲"text/plain"和"text/html"
構造MIMEText對象時,第一個參數是郵件正文,第二個參數是MIME的subtype,最後必定要用utf-8編碼保證多語言兼容性。
2.1.1添加普通文本
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text,'plain', 'utf-8')
查看MIMEText屬性:能夠觀察到MIMEText,MIMEImage和MIMEMultipart的屬性都同樣。
print dir(text_plain)
['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']
2.1.2添加超文本
html = """ <html> <body> <p> Here is the <a href="http://www.baidu.com">link</a> you wanted. </p> </body> </html> """ text_html = MIMEText(html,'html', 'utf-8')
2.1.3添加附件
sendfile=open(r'D:\pythontest\1111.txt','rb').read() text_att = MIMEText(sendfile, 'base64', 'utf-8') text_att["Content-Type"] = 'application/octet-stream' text_att["Content-Disposition"] = 'attachment; filename="顯示的名字.txt"'
2.2 image說明
添加圖片:
sendimagefile=open(r'D:\pythontest\testimage.png','rb').read() image = MIMEImage(sendimagefile) image.add_header('Content-ID','<image1>')
查看MIMEImage屬性:
print dir(image)
['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']
2.3 multpart說明
常見的multipart類型有三種:multipart/alternative, multipart/related和multipart/mixed。
郵件類型爲"multipart/alternative"的郵件包括純文本正文(text/plain)和超文本正文(text/html)。
郵件類型爲"multipart/related"的郵件正文中包括圖片,聲音等內嵌資源。
郵件類型爲"multipart/mixed"的郵件包含附件。向上兼容,若是一個郵件有純文本正文,超文本正文,內嵌資源,附件,則選擇mixed類型。
msg = MIMEMultipart('mixed')
咱們必須把Subject,From,To,Date添加到MIMEText對象或者MIMEMultipart對象中,郵件中才會顯示主題,發件人,收件人,時間(若無時間,就默認通常爲當前時間,該值通常不設置)。
msg = MIMEMultipart('mixed') msg['Subject'] = 'Python email test' msg['From'] = 'XXX@163.com <XXX@163.com>' msg['To'] = 'XXX@126.com' msg['Date']='2012-3-16'
查看MIMEMultipart屬性:
msg = MIMEMultipart('mixed') print dir(msg)
結果:
['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__len__', '__module__', '__setitem__', '__str__', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']
說明:
msg.add_header(_name,_value,**_params):添加郵件頭字段。
msg.as_string():是將msg(MIMEText對象或者MIMEMultipart對象)變爲str,若是隻有一個html超文本正文或者plain普通文本正文的話,通常msg的類型能夠是MIMEText;若是是多個的話,就都添加到MIMEMultipart,msg類型就變爲MIMEMultipart。
msg.attach(MIMEText對象或MIMEImage對象):將MIMEText對象或MIMEImage對象添加到MIMEMultipart對象中。MIMEMultipart對象表明郵件自己,MIMEText對象或MIMEImage對象表明郵件正文。
以上的構造的文本,超文本,附件,圖片都何以添加到MIMEMultipart('mixed')中:
msg.attach(text_plain) msg.attach(text_html) msg.attach(text_att) msg.attach(image)
3.文字,html,圖片,附件實現實例
#coding: utf-8 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.header import Header #設置smtplib所需的參數 #下面的發件人,收件人是用於郵件傳輸的。 smtpserver = 'smtp.163.com' username = 'XXX@163.com' password='XXX' sender='XXX@163.com' #receiver='XXX@126.com' #收件人爲多個收件人 receiver=['XXX@126.com','XXX@126.com'] subject = 'Python email test' #經過Header對象編碼的文本,包含utf-8編碼信息和Base64編碼信息。如下中文名測試ok #subject = '中文標題' #subject=Header(subject, 'utf-8').encode() #構造郵件對象MIMEMultipart對象 #下面的主題,發件人,收件人,日期是顯示在郵件頁面上的。 msg = MIMEMultipart('mixed') msg['Subject'] = subject msg['From'] = 'XXX@163.com <XXX@163.com>' #msg['To'] = 'XXX@126.com' #收件人爲多個收件人,經過join將列表轉換爲以;爲間隔的字符串 msg['To'] = ";".join(receiver) #msg['Date']='2012-3-16' #構造文字內容 text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text,'plain', 'utf-8') msg.attach(text_plain) #構造圖片連接 sendimagefile=open(r'D:\pythontest\testimage.png','rb').read() image = MIMEImage(sendimagefile) image.add_header('Content-ID','<image1>') image["Content-Disposition"] = 'attachment; filename="testimage.png"' msg.attach(image) #構造html #發送正文中的圖片:因爲包含未被許可的信息,網易郵箱定義爲垃圾郵件,報554 DT:SPM :<p><img src="cid:image1"></p> html = """ <html> <head></head> <body> <p>Hi!<br> How are you?<br> Here is the <a href="http://www.baidu.com">link</a> you wanted.<br> </p> </body> </html> """ text_html = MIMEText(html,'html', 'utf-8') text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"' msg.attach(text_html) #構造附件 sendfile=open(r'D:\pythontest\1111.txt','rb').read() text_att = MIMEText(sendfile, 'base64', 'utf-8') text_att["Content-Type"] = 'application/octet-stream' #如下附件能夠重命名成aaa.txt #text_att["Content-Disposition"] = 'attachment; filename="aaa.txt"' #另外一種實現方式 text_att.add_header('Content-Disposition', 'attachment', filename='aaa.txt') #如下中文測試不ok #text_att["Content-Disposition"] = u'attachment; filename="中文附件.txt"'.decode('utf-8') msg.attach(text_att) #發送郵件 smtp = smtplib.SMTP() smtp.connect('smtp.163.com') #咱們用set_debuglevel(1)就能夠打印出和SMTP服務器交互的全部信息。 #smtp.set_debuglevel(1) smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
說明:
若是你們對add_header的入參有更多的瞭解(Content-Disposition,Content-Type,Content-ID),但願告訴我,謝謝。