SMTP模組
這麼多已定義的類中,我們最常用的的還是smtplib.SMTP類,就具體看看該類的用法:
smtp執行個體封裝一個smtp串連,它支援所有的SMTP和ESMTP操作指令,如果host和port參數被定義,則smtp會在初始化期間自動調用connect()方法,如果connect()方法失敗,則會觸發SMTPConnectError異常,timeout參數設定了逾時時間。在一般的調用過程中,應該遵connetc()、sendmail()、quit()步驟。
SMTP模組主要方法
下面我們來看看該類的方法:
複製代碼 代碼如下:
SMTP.set_debuglevel(level)
設定輸出debug調試資訊,預設不輸出調試資訊。
SMTP.docmd(cmd[, argstring])
發送一個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])
發送郵件,該方法需要一些郵件地址和訊息。
SMTP.quit()
終止smtp會話並且關閉串連。
經過搜尋學習發現網上大多都是用smtp類的sendmail這個方法來發郵件,那就先看看這個例子:
使用sendmail發送郵件
複製代碼 代碼如下:
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資訊是分開的模組來實現的。
MIME訊息由訊息頭和訊息體兩大部分組成,在郵件裡就是郵件標頭和郵件體。郵件標頭與郵件體之間以空行進行分隔。
郵件標頭包含了寄件者、收件者、主題、時間、MIME版本、郵件內容的類型等重要訊息。每條資訊稱為一個域,由網域名稱後加“: ”和資訊內容構成,可以是一行,較長的也可以佔用多行。域的首行必須“頂頭”寫,即左邊不能有空白字元(空格和定位字元);續行則必須以空白字元打頭,且第一個空白字元不是資訊本身固有的。
郵件體包含郵件的內容,它的類型由郵件標頭的“Content-Type”域指出。最常見的類型有text/plain(純文字)和text/html(超文本)。郵件體被分為多個段,每個段又包含段頭和段體兩部分,這兩部分之間也以空行分隔。常見的multipart類型有三種:multipart/mixed, multipart/related和multipart/alternative。
在email的包裡麵包含了很多模組:
複製代碼 代碼如下:
email.message
email.parser
email.generator
email.mime 建立email和MIME對象
email.header
email.charset
email.encoders
email.ereors
email.utils
email.iterators
主要來看看email.mime,在郵件中攜帶附件、圖片、音頻時,主要使用的是該模組。一般情況下,你通過解析一個檔案或者一段text來產生一個訊息對象結構,你也可以從頭開始建立一個訊息結構,實際上,你可以給一個已經存在的訊息結構追加一個新的訊息對象。你可以通過建立message執行個體來建立一個對象結構,然後給該結構追加附件和頭部資訊。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()
郵件中攜帶附件
發送帶附件的郵件,首先要建立MIMEMultipart()執行個體,然後構造附件,如果有多個附件,可依次構造,最後利用smtplib.smtp發送
類比在 郵件中攜帶附件 ,如下:
複製代碼 代碼如下:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
#建立一個帶附件的執行個體
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'
#發送郵件
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 '發送成功'
except Exception, e:
print str(e)