python 收发邮件_python发送各类邮件的主要基本方法
利用python實現基本的郵件發送。
感謝以下博客的整理,本人在學習的同時也做了一些整理
一、相關模塊介紹
發送郵件主要用到了smtplib和email兩個模塊,這里首先就兩個模塊進行一下簡單的介紹:
1、smtplib模塊
smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
SMTP類構造函數,表示與SMTP服務器之間的連接,通過這個連接可以向smtp服務器發送指令,執行相關操作(如:登陸、發送郵件)。所有參數都是可選的。
host:smtp服務器主機名
port:smtp服務的端口,默認是25;如果在創建SMTP對象的時候提供了這兩個參數,在初始化的時候會自動調用connect方法去連接服務器。
smtplib模塊還提供了SMTP_SSL類和LMTP類,對它們的操作與SMTP基本一致。
smtplib.SMTP提供的方法:
SMTP.set_debuglevel(level):設置是否為調試模式。默認為False,即非調試模式,表示不輸出任何調試信息。
SMTP.connect([host[, port]]):連接到指定的smtp服務器。參數分別表示smpt主機和端口。注意: 也可以在host參數中指定端口號(如:smpt.yeah.net:25),這樣就沒必要給出port參數。
SMTP.docmd(cmd[, argstring]):向smtp服務器發送指令。可選參數argstring表示指令的參數。
SMTP.helo([hostname]) :使用"helo"指令向服務器確認身份。相當于告訴smtp服務器“我是誰”。
SMTP.has_extn(name):判斷指定名稱在服務器郵件列表中是否存在。出于安全考慮,smtp服務器往往屏蔽了該指令。
SMTP.verify(address) :判斷指定郵件地址是否在服務器中存在。出于安全考慮,smtp服務器往往屏蔽了該指令。
SMTP.login(user, password) :登陸到smtp服務器。現在幾乎所有的smtp服務器,都必須在驗證用戶信息合法之后才允許發送郵件。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :發送郵件。這里要注意一下第三個參數,msg是字符串,表示郵件。我們知道郵件一般由標題,發信人,收件人,郵件內容,附件等構成,發送郵件的時候,要注意msg的格式。這個格式就是smtp協議中定義的格式。
SMTP.quit():斷開與smtp服務器的連接,相當于發送"quit"指令。(也有用到smtp.close())
使用smtplib庫發送郵件的基本步驟:
#連接到SMTP服務器,參數表示SMTP主機和端口,端口默認25
SMTP.connect([host[,port]]) #也可以不顯式鏈接:SMTP(host)
#登錄SMTP服務器
SMTP.login(user,password)
#發送郵件。.as_string()是字符串,表示郵件內容,to_addrs是收件人list
SMTP.sendmail(from_addr, to_addrs, msg.as_string())
#斷開連接
SMTP.close() #也有用SMTP.quit()
2、email模塊
Email庫用來處理郵件消息。包括MIME和基于RFC2822的消息文檔。
有關MIME的一些知識
RFC2822定義的郵件格式中,郵件體只是單純的ASCII編碼的字符序列,MIME擴展郵件的格式,用以支持非ASCII編碼的文本、非文本附件及包含多個部分(multi-part)的郵件體。
MIME消息由消息頭、消息體組成,即郵件的郵件頭、郵件體。中間以空行進行分隔。
1、郵件頭:包括發件人(from)、收件人(to)、郵件主題(subject)、接收日期(date)、MIME版本、郵件內容類型等信息。每條信息稱為一個域,由域名后加“:”和信息內容構成,域的首行必須頂頭寫。
2、郵件體:有text/plain(純文本)和text/html(超文本)之分,由郵件頭的“content type”域指出。可以同時存在,也可以只存在一種。這就是為什么有些郵件既可以用html格式查看,又可以用文本格式查看的原因。郵件體分為多個段,稱為Payload。每個段也包括段頭段尾,中間以空行分隔。multipart類型有3種:multipart/mixed multipart/related multipart/alternative。郵件里添加附件要定義multipart/mixed段,如果純文本超文本共存,則要定義multipart/alternative,如存在內嵌資源,要定義multipart/related。
3、附件(attach)。發送郵件時,可以將本機的文件一起發送。附件可以有0個或多個,只要附件的總大小,不超過郵件服務器所聲明的最大容量。 4、
包括的類主要有(更加詳細的介紹可見:
http://docs.python.org/library/email.mime.html):
class email.mime.text.MIMEText(_text[, _subtype[, _charset]])
用于生成MIME對象的主體文本:_text指定郵件內容,_subtype指定郵件類型,_charset指定編碼。
class email.mime.multipart.MIMEMultipart()
用于生成包含多個部分的郵件體的MIME對象
class email.mime.base.MIMEBase(_maintype, _subtype, **_params)
這是MIME的一個基類。一般不需要在使用時創建實例。其中_maintype是內容類型,如text或者image。_subtype是內容的minor type 類型,如plain或者gif。 **_params是一個字典,直接傳遞給Message.add_header()。
class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]
MIMEBase的一個子類,多個MIME對象的集合,_subtype默認值為mixed。boundary是MIMEMultipart的邊界,默認邊界是可數的。
class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]])
MIMEMultipart的一個子類。
class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])
MIME音頻對象
class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
MIME二進制文件對象。
class email.mime.message.MIMEMessage(_msg[, _subtype])
具體的一個message實例,使用方法如下:
msg=mail.Message.Message() #一個實例
msg['to']='XXX@XXX.com' #發送到哪里
msg['from']='YYY@YYY.com' #自己的郵件地址
msg['date']='2013-5-25' #時間日期
msg['subject']='hello python' #郵件主題
class email.mime.text.MIMEText(_text[, _subtype[, _charset]])
MIME文本對象,其中_text是郵件內容,_subtype郵件類型,可以是text/plain(普通文本郵件),html/plain(html郵件), _charset編碼,可以是gb2312等等。
三、幾種郵件的具體實現代碼
1.普通文本和html郵件的發送
普通文本郵件發送的實現,關鍵是要將MIMEText中_subtype設置為plain。首先導入smtplib和mimetext。創建smtplib.smtp實例,connect郵件smtp服務器,login后發送.
html信息發送和普通文本一樣,conten內容變為html信息,并將_subtype設置為html。
具體代碼如下(python 2.7):
#import getpass #如果需要交互獲取密碼
#pwd_input = getpass.getpass('Password:')
import time
import smtplib
import email.utils
from email.mime.text import MIMEText
#Initialize mail information
#mailto_list = ['XXX@163.com','YYY@qq.com']
mail_host = 'smtp.163.com' #設置網易163服務器
mail_user = 'ZZZ' #用戶名
mail_pass = '*********' #口令
mail_postfix = '163.com' #發件箱后綴
mail_from = '@'.join([mail_user,mail_postfix]) #收件箱
#Create the message
#html信息
#content = "Dyllian使用程序給你發了個鏈接!"
#msg = MIMEText(content,_subtype='html',_charset='utf8')
#普通文本
content = "Hello dyllian"
msg = MIMEText(content,_subtype='plain',_charset='utf8')
msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type
msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list
msg['Subject'] = 'Test from python!'
msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')#定義發送時間(不定義的可能有的郵件客戶端會不顯示發送時間)
#msg.preamble = 'This is a common message in MIME format.'
#Send mail to list recipient
try:
server = smtplib.SMTP(mail_host)
server.login(mail_user,mail_pass)
server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient
except Exception,e: #try中有異常則執行
print 'Mail passed unsuccessfully!\n',str(e)
else: #try中沒有異常則執行
print 'Mail passed successfully!'
finally: #try中有無異常都執行
server.close()
2.帶附件的郵件發送(附件圖片,附件一般文件)
import os
import time
import smtplib
import email.utils
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
#Get local path
path = os.path.dirname(__file__)
#Initialize mail infomation
#mailto_list = ['XXX@163.com','YYY@qq.com']
mailto_list = ['XXX@163.com']
mail_host = 'smtp.163.com' #設置服務器
mail_user = 'ZZZ' #用戶名
mail_pass = '******' #口令
mail_postfix = '163.com' #發件箱后綴
mail_from = '@'.join([mail_user,mail_postfix]) #收件箱
#構建一個帶附件的實例
msg = MIMEMultipart()
#用MIMEImage附件圖片
fp = open(path+'\\ning1.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '')
msg.attach(msgImage)
#構造附件1圖片
att1 = MIMEText(open(path+'\\ning1.jpg','rb').read(),_subtype='base64',_charset='utf8')
att1['Content-Type'] = 'application/octet-stream'
att1['Content-Disposition'] = "attachment; filename=ningning1.jpg" #這里的filename可以隨便取,寫什么名字,郵件中顯示什么名字
msg.attach(att1)
#構造附件2文件
att2 = MIMEText(open(path+'\\ning2.txt','rb').read(),_subtype='base64',_charset='utf8')
att2['Content-Type'] = 'application/octet-stream'
att2['Content-Disposition'] = "attachment; filename=test2.txt"
msg.attach(att2)
#加郵件頭
msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type
msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list
msg['Subject'] = 'Test from python!'
msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')#定義發送時間(不定義的可能有的郵件客戶端會不顯示發送時間)
#msg.preamble = 'This is a multi-part message in MIME format.'
#Send mail to list recipient
try:
server = smtplib.SMTP(mail_host)
server.login(mail_user,mail_pass)
server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient
except Exception,e: #try中有異常則執行
print 'Mail passed unsuccessfully!\n',str(e)
else: #try中沒有異常則執行
print 'Mail passed successfully!'
finally: #try中有無異常都執行
server.close()
四:遇到的問題
希望在郵件正文中顯式圖片信息,思路是用html屬性發送,查了幾個資料,遇到了同樣的問題:
1.如果做以下處理,結果還是以附件的形式發送圖片:
#構建一個帶附件的實例
msg = MIMEMultipart('ralated')
#用MIMEImage附件圖片
fp = open(path+'\\ning1.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '')
msg.attach(msgImage)
2.如果做以下的處理,結果有編譯錯誤:
import os
import smtplib
import email.utils
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
#Get local path
path = os.path.dirname(__file__)
#Initialize mail infomation
mailto_list = ['XXX@163.com']
mail_host = 'smtp.163.com' #設置服務器
mail_user = 'YYY' #用戶名
mail_pass = '******' #口令
mail_postfix = '163.com' #發件箱后綴
mail_from = '@'.join([mail_user,mail_postfix]) #收件箱
#構建一個帶附件的實例
msg = MIMEMultipart('ralated')
#html附帶圖片正文
msgAlternative = MIMEMultipart('alternative')
msg.attach(msgAlternative)
html = '本郵件,正文中顯示圖片!'
htmlText = MIMEText(html,_subtype='html',_charset='utf8')
msgAlternative.attach(htmlText)
#內置圖片
fp = open(path+'\\ning1.jpg','rb+')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID','')
msg.attach(msgImage)
#加郵件頭
msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type
msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list
msg['Subject'] = 'Test from python!'
msg.preamble = 'This is a multi-part message in MIME format.'
#Send mail to list recipient
try:
server = smtplib.SMTP(mail_host)
server.login(mail_user,mail_pass)
server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient
except Exception,e: #try中有異常則執行
print 'Mail passed unsuccessfully!\n',str(e)
else: #try中沒有異常則執行
print 'Mail passed successfully!'
finally: #try中有無異常都執行
server.close()
編譯結果:
Mail passed unsuccessfully!
(554, 'DT:SPM smtp11, D8CowEDp5XJrPKBR0ATQBg--.765S2 1369455724 http://mail.163.com/help/help_spam_16.htm?ip=61.150.43.98&hostid=smtp11&time=1369455724')
不知道哪里出了錯,哪位可能提供思路解決?謝謝!
總結
以上是生活随笔為你收集整理的python 收发邮件_python发送各类邮件的主要基本方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H5 video 播放器demo
- 下一篇: 硬件编程:硬件开发中常用的几种通信接口总