python中使用smtplib和email模塊發(fā)送郵件實例
SMTP模塊
這么多已定義的類中,我們最常用的的還是smtplib.SMTP類,就具體看看該類的用法:
smtp實例封裝一個smtp連接,它支持所有的SMTP和ESMTP操作指令,如果host和port參數(shù)被定義,則smtp會在初始化期間自動調用connect()方法,如果connect()方法失敗,則會觸發(fā)SMTPConnectError異常,timeout參數(shù)設置了超時時間。在一般的調用過程中,應該遵connetc()、sendmail()、quit()步驟。
SMTP模塊主要方法
下面我們來看看該類的方法:
SMTP.set_debuglevel(level)
設置輸出debug調試信息,默認不輸出調試信息。
SMTP.docmd(cmd[, argstring])
發(fā)送一個command到smtp服務器,
SMTP.connect([host[, port]])
連接到指定的smtp服務器,默認是本機的25端口。也可以寫成hostname:port的形式。
SMTP.helo([hostname])
使用helo指令向smtp服務器確認你的身份。
SMTP.ehlo([hostname])
使用ehlo指令向esmtp服務器確認你的身份。
SMTP.ehlo_or_helo_if_needed()
如果在以前的會話連接中沒有提供ehlo或者helo指令,這個方法調用ehlo()或者helo()。
SMTP.has_extn(name)
判斷指定的名稱是否在smtp服務器上。
SMTP.verify(address)
判斷郵件地址是否在smtp服務器上存在。
SMTP.login(user, password)
登陸需要驗證的smtp服務器,如果之前沒有提供ehlo或者helo指令,則會先嘗試ESMTP的ehlo指令。
SMTP.starttls([keyfile[, certfile]])
使smtp連接運行在TLS模式,所有的smtp指令都會被加密。
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
發(fā)送郵件,該方法需要一些郵件地址和消息。
SMTP.quit()
終止smtp會話并且關閉連接。
經(jīng)過搜索學習發(fā)現(xiàn)網(wǎng)上大多都是用smtp類的sendmail這個方法來發(fā)郵件,那就先看看這個例子:
使用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包的主要特征是在它內部解析和生成email信息是分開的模塊來實現(xiàn)的。
MIME消息由消息頭和消息體兩大部分組成,在郵件里就是郵件頭和郵件體。郵件頭與郵件體之間以空行進行分隔。
郵件頭包含了發(fā)件人、收件人、主題、時間、MIME版本、郵件內容的類型等重要信息。每條信息稱為一個域,由域名后加“: ”和信息內容構成,可以是一行,較長的也可以占用多行。域的首行必須“頂頭”寫,即左邊不能有空白字符(空格和制表符);續(xù)行則必須以空白字符打頭,且第一個空白字符不是信息本身固有的。
郵件體包含郵件的內容,它的類型由郵件頭的“Content-Type”域指出。最常見的類型有text/plain(純文本)和text/html(超文本)。郵件體被分為多個段,每個段又包含段頭和段體兩部分,這兩部分之間也以空行分隔。常見的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,在郵件中攜帶附件、圖片、音頻時,主要使用的是該模塊。一般情況下,你通過解析一個文件或者一段text來生成一個消息對象結構,你也可以從頭開始建立一個消息結構,實際上,你可以給一個已經(jīng)存在的消息結構追加一個新的消息對象。你可以通過創(chuàng)建message實例來創(chuàng)建一個對象結構,然后給該結構追加附件和頭部信息。email包提供了一些子類使得該操作變得很容易。
模擬在郵件內容中攜帶圖片,如下:
郵件內容中攜帶圖片
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ā)送帶附件的郵件,首先要創(chuàng)建MIMEMultipart()實例,然后構造附件,如果有多個附件,可依次構造,最后利用smtplib.smtp發(fā)送
模擬在 郵件中攜帶附件 ,如下:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
#創(chuàng)建一個帶附件的實例
msg = MIMEMultipart()
txt = MIMEText("這是中文的郵件內容哦",'plain','gb2312')
msg.attach(txt)
#構造附件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)
#構造附件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)
相關文章
在ironpython中利用裝飾器執(zhí)行SQL操作的例子
這篇文章主要介紹了在ironpython中利用裝飾器執(zhí)行SQL操作的例子,文章中以操作MySQL為例,需要的朋友可以參考下2015-05-05
使用Pytorch構建第一個神經(jīng)網(wǎng)絡模型?附案例實戰(zhàn)
這篇文章主要介紹了用Pytorch構建第一個神經(jīng)網(wǎng)絡模型(附案例實戰(zhàn)),本文通過實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
pandas讀取CSV文件時查看修改各列的數(shù)據(jù)類型格式
這篇文章主要介紹了pandas讀取CSV文件時查看修改各列的數(shù)據(jù)類型格式,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07

