python中使用smtplib和email模塊發(fā)送郵件實(shí)例
SMTP模塊
這么多已定義的類中,我們最常用的的還是smtplib.SMTP類,就具體看看該類的用法:
smtp實(shí)例封裝一個(gè)smtp連接,它支持所有的SMTP和ESMTP操作指令,如果host和port參數(shù)被定義,則smtp會在初始化期間自動(dòng)調(diào)用connect()方法,如果connect()方法失敗,則會觸發(fā)SMTPConnectError異常,timeout參數(shù)設(shè)置了超時(shí)時(shí)間。在一般的調(diào)用過程中,應(yīng)該遵connetc()、sendmail()、quit()步驟。
SMTP模塊主要方法
下面我們來看看該類的方法:
SMTP.set_debuglevel(level)
設(shè)置輸出debug調(diào)試信息,默認(rèn)不輸出調(diào)試信息。
SMTP.docmd(cmd[, argstring])
發(fā)送一個(gè)command到smtp服務(wù)器,
SMTP.connect([host[, port]])
連接到指定的smtp服務(wù)器,默認(rèn)是本機(jī)的25端口。也可以寫成hostname:port的形式。
SMTP.helo([hostname])
使用helo指令向smtp服務(wù)器確認(rèn)你的身份。
SMTP.ehlo([hostname])
使用ehlo指令向esmtp服務(wù)器確認(rèn)你的身份。
SMTP.ehlo_or_helo_if_needed()
如果在以前的會話連接中沒有提供ehlo或者h(yuǎn)elo指令,這個(gè)方法調(diào)用ehlo()或者h(yuǎn)elo()。
SMTP.has_extn(name)
判斷指定的名稱是否在smtp服務(wù)器上。
SMTP.verify(address)
判斷郵件地址是否在smtp服務(wù)器上存在。
SMTP.login(user, password)
登陸需要驗(yàn)證的smtp服務(wù)器,如果之前沒有提供ehlo或者h(yuǎn)elo指令,則會先嘗試ESMTP的ehlo指令。
SMTP.starttls([keyfile[, certfile]])
使smtp連接運(yùn)行在TLS模式,所有的smtp指令都會被加密。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
發(fā)送郵件,該方法需要一些郵件地址和消息。
SMTP.quit()
終止smtp會話并且關(guān)閉連接。
經(jīng)過搜索學(xué)習(xí)發(fā)現(xiàn)網(wǎng)上大多都是用smtp類的sendmail這個(gè)方法來發(fā)郵件,那就先看看這個(gè)例子:
使用sendmail發(fā)送郵件
import smtplib
import time
from email.message import Message
from time import sleep
import email.utils
import base64
smtpserver = 'smtp.gmail.com'
username = 'username@gmail.com'
password = 'password '
from_addr = 'from@gmail.com'
to_addr = 'tooooooo@qq.com'
cc_addr = 'ccccccccc@qq.com'
time = email.utils.formatdate(time.time(),True)
message = Message()
message['Subject'] = 'Mail Subject'
message['From'] = from_addr
message['To'] = to_addr
message['Cc'] = cc_addr
message.set_payload('mail content '+time)
msg = message.as_string()
sm = smtplib.SMTP(smtpserver,port=587,timeout=20)
sm.set_debuglevel(1)
sm.ehlo()
sm.starttls()
sm.ehlo()
sm.login(username, password)
sm.sendmail(from_addr, to_addr, msg)
sleep(5)
sm.quit()
Email模塊
如果想在郵件中攜帶附件、使用html書寫郵件,附帶圖片等等,就需要使用email模塊及其子模塊。下面來看看email包,email包是用來管理email信息的,它包括MIME和其他基于RFC 2822的消息格式。email包的主要特征是在它內(nèi)部解析和生成email信息是分開的模塊來實(shí)現(xiàn)的。
MIME消息由消息頭和消息體兩大部分組成,在郵件里就是郵件頭和郵件體。郵件頭與郵件體之間以空行進(jìn)行分隔。
郵件頭包含了發(fā)件人、收件人、主題、時(shí)間、MIME版本、郵件內(nèi)容的類型等重要信息。每條信息稱為一個(gè)域,由域名后加“: ”和信息內(nèi)容構(gòu)成,可以是一行,較長的也可以占用多行。域的首行必須“頂頭”寫,即左邊不能有空白字符(空格和制表符);續(xù)行則必須以空白字符打頭,且第一個(gè)空白字符不是信息本身固有的。
郵件體包含郵件的內(nèi)容,它的類型由郵件頭的“Content-Type”域指出。最常見的類型有text/plain(純文本)和text/html(超文本)。郵件體被分為多個(gè)段,每個(gè)段又包含段頭和段體兩部分,這兩部分之間也以空行分隔。常見的multipart類型有三種:multipart/mixed, multipart/related和multipart/alternative。
在email的包里面包含了很多模塊:
email.message
email.parser
email.generator
email.mime 創(chuàng)建email和MIME對象
email.header
email.charset
email.encoders
email.ereors
email.utils
email.iterators
主要來看看email.mime,在郵件中攜帶附件、圖片、音頻時(shí),主要使用的是該模塊。一般情況下,你通過解析一個(gè)文件或者一段text來生成一個(gè)消息對象結(jié)構(gòu),你也可以從頭開始建立一個(gè)消息結(jié)構(gòu),實(shí)際上,你可以給一個(gè)已經(jīng)存在的消息結(jié)構(gòu)追加一個(gè)新的消息對象。你可以通過創(chuàng)建message實(shí)例來創(chuàng)建一個(gè)對象結(jié)構(gòu),然后給該結(jié)構(gòu)追加附件和頭部信息。email包提供了一些子類使得該操作變得很容易。
模擬在郵件內(nèi)容中攜帶圖片,如下:
郵件內(nèi)容中攜帶圖片
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib
from_mail = 'froooooooom@gmail.com'
to_mail = 'toooooooooo@qq.com'
msg = MIMEMultipart()
msg['From'] = from_mail
msg['To'] = to_mail
msg['Subject'] = 'python mail test'
body = 'test img send'
con = MIMEText('<b>%s</b>
<img alt="" src="cid:D:\\10535-102.jpg" />
' % body,'html')
msg.attach(con)
img = MIMEImage(file('D:\\10535-102.jpg','rb').read())
img.add_header('Content-ID','D:\\10535-102.jpg')
msg.attach(img)
server = smtplib.SMTP('smtp.gmail.com')
server.docmd('ehol','tooooooo@gmail.com')
server.starttls()
server.login('username@gmail.com','password')
server.sendmail(from_mail,to_mail,msg.as_string())
server.quit()
郵件中攜帶附件
發(fā)送帶附件的郵件,首先要?jiǎng)?chuàng)建MIMEMultipart()實(shí)例,然后構(gòu)造附件,如果有多個(gè)附件,可依次構(gòu)造,最后利用smtplib.smtp發(fā)送
模擬在 郵件中攜帶附件 ,如下:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
#創(chuàng)建一個(gè)帶附件的實(shí)例
msg = MIMEMultipart()
txt = MIMEText("這是中文的郵件內(nèi)容哦",'plain','gb2312')
msg.attach(txt)
#構(gòu)造附件1
att1 = MIMEText(open('d:\\drcom.rar', 'rb').read(), 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="drcom.rar"'#這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
msg.attach(att1)
#構(gòu)造附件2
att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="123.txt"'
msg.attach(att2)
#加郵件頭
msg['to'] = 'tooooooo@qq.com'
msg['from'] = 'frommmmmmm@gmail.com'
msg['subject'] = 'hello world'
#發(fā)送郵件
try:
server = smtplib.SMTP()
server.connect('smtp.gmail.com')
server.starttls()
server.login('xxxxx@gmail.com','xxxxxxxxx')#XXX為用戶名,XXXXX為密碼
server.sendmail(msg['from'], msg['to'],msg.as_string())
server.quit()
print '發(fā)送成功'
except Exception, e:
print str(e)
- python email smtplib模塊發(fā)送郵件代碼實(shí)例
- Python使用email模塊對郵件進(jìn)行編碼和解碼的實(shí)例教程
- 用smtplib和email封裝python發(fā)送郵件模塊類分享
- python通過imaplib模塊讀取gmail里郵件的方法
- 使用Python3 poplib模塊刪除服務(wù)器多天前的郵件實(shí)現(xiàn)代碼
- Python使用poplib模塊和smtplib模塊收發(fā)電子郵件的教程
- 在Python中使用poplib模塊收取郵件的教程
- Python網(wǎng)絡(luò)編程之使用email、smtplib、poplib、imaplib模塊收發(fā)郵件
相關(guān)文章
Python實(shí)現(xiàn)的當(dāng)前時(shí)間多加一天、一小時(shí)、一分鐘操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)的當(dāng)前時(shí)間多加一天、一小時(shí)、一分鐘操作,結(jié)合實(shí)例形式分析了Python基于datetime模塊進(jìn)行日期時(shí)間操作相關(guān)使用技巧,需要的朋友可以參考下2018-05-05Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實(shí)例詳解
這篇文章主要介紹了Python多線程操作之互斥鎖、遞歸鎖、信號量、事件,結(jié)合實(shí)例形式詳細(xì)分析了Python多線程操作互斥鎖、遞歸鎖、信號量、事件相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03Python使用LSTM實(shí)現(xiàn)銷售額預(yù)測詳解
大家經(jīng)常會遇到一些需要預(yù)測的場景,比如預(yù)測品牌銷售額,預(yù)測產(chǎn)品銷量。本文給大家分享一波使用?LSTM?進(jìn)行端到端時(shí)間序列預(yù)測的完整代碼和詳細(xì)解釋,需要的可以參考一下2022-07-07python 利用openpyxl讀取Excel表格中指定的行或列教程
這篇文章主要介紹了python 利用openpyxl讀取Excel表格中指定的行或列教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02python tkinter圖形界面代碼統(tǒng)計(jì)工具
這篇文章主要為大家詳細(xì)介紹了python tkinter圖形界面代碼統(tǒng)計(jì)工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Python開發(fā)之QT解決無邊框界面拖動(dòng)卡屏問題(附帶源碼)
朋友在學(xué)習(xí)QT的過程中,都會遇到各種問題,今天就QT無邊框拖動(dòng)花屏問題給大家詳細(xì)介紹,究竟該如何解決呢,下面通過實(shí)例代碼和圖文相結(jié)合給大家詳細(xì)介紹,需要的朋友參考下吧2021-05-05深入了解python的tkinter實(shí)現(xiàn)簡單登錄
這篇文章主要為大家介紹了python的tkinter實(shí)現(xiàn)簡單登錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12解決Matplotlib圖表不能在Pycharm中顯示的問題
今天小編就為大家分享一篇解決Matplotlib圖表不能在Pycharm中顯示的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05