python中使用smtplib和email模組發送郵件執行個體_python

來源:互聯網
上載者:User

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.