Python 發送郵件

用Python來發送郵件還是蠻有趣的一件事,python爲我們提供了這樣一個模塊,可以方便的發送電子郵件,先來總結一下

 

1.      SMTP和HTTP類似。都是頭裏面有一些相關信息,content-type ,encoding等。Message是基類。用字典映射的方式可以讀取和設置head中選項的值。MIMEText,MIMEImage,MIMEAudio等MIME類型繼承自MIMEBase,MIMEBase繼承自Message。他們都沒有自己定義方法,都是用Message的。MIMEMultipart可以通過attach添加多個MIME的文件。所以用它添加附件

2.      不同附件文件類型不同,head裏面有個Content-Disposition的選項,可以設置文件類型。要上傳不同文件類型,就要讓python通過mimestypes.guess_type()識別文件類型

3.      讀取二進制文件的時候,打開方式要爲"rb",因爲可能會有和EOF編碼相同的字節。這樣python認爲找到了文件的結尾,停止讀入。

4.      lambda: 隨時定義一個函數,避免許多單行的函數定義


下面看代碼吧

__author__ = 'MrChen'

import smtplib, mimetypes
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

msg = MIMEMultipart('alternative')
msg['From'] = "[email protected]"
msg['To'] = '[email protected]'
msg['Subject'] = 'Email for testing'

#添加郵件內容
text = MIMEText('content')
msg.attach(text)

#添加二進制附件
fileName = r'C:\Users\a\Pictures\lovewallpaper\001.jpg'#選擇你自己的文件
fileType, encoding = mimetypes.guess_type(fileName)
if fileType is None or encoding is not None:
    fileType = 'application/octet-stream'
print(fileType, encoding)
maintype, subtype = fileType.split('/', 1)
att1 = MIMEImage((lambda f: (f.read(), f.close()))(open(fileName, 'rb'))[0], _subtype = subtype)
#發送的文件名需要把路徑去掉,給別人的郵件沒必要讓別人看到自己的文件路徑
att1.add_header('Content-Disposition', 'attachment', filename = fileName[fileName.rfind('\\')+1:])
msg.attach(att1)

server = smtplib.SMTP()
server.connect('smtp.163.com')#163郵箱的SMTP服務器地址
server.login('[email protected]','xxxxxxxx')#輸入郵箱用戶名和密碼
server.set_debuglevel(1)
server.sendmail('[email protected]', '[email protected]', msg.as_string())
server.quit()
print('發送成功')


下面介紹一下SMTP類都有哪些函數吧

 

smtplib.SMTP([host[, port[,local_hostname[, timeout]]]])

  SMTP類構造函數,表示與SMTP服務器之間的連接,通過這個連接我們可以向smtp服務器發送指令,執行相關操作(如:登陸、發送郵件)。該類提供了許多方法,將在下面介紹。它的所有參數都是可選的,其中host參數表示smtp服務器主機名,上面例子中的smtp主機爲"smtp.yeah.net";port表示smtp服務的端口,默認是25;如果在創建SMTP對象的時候提供了這兩個參數,在初始化的時候會自動調用connect方法去連接服務器。

  smtplib模塊還提供了SMTP_SSL類和LMTP類,對它們的操作與SMTP基本一致。

 

SMTP.set_debuglevel(level)

  設置是否爲調試模式。默認爲False,即非調試模式,表示不輸出任何調試信息。

 

SMTP.connect([host[, port]])

  連接到指定的smtp服務器。參數分別表示smpt主機和端口。注意: 也可以在host參數中指定端口號(如:smpt.yeah.net:25),這樣就沒必要給出port參數。默認的端口號是25

 

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協議中定義的格式。

  如果要發送的郵件內容很複雜,包含圖片、視頻、附件等內容,按照MIME的格式來拼接字符串,將是一件非常麻煩的事。不用擔心,python已經考慮到了這點,它爲我們提供了email模塊,使用該模塊可以輕鬆的發送帶圖片、視頻、附件等複雜內容的郵件。在介紹完smtplib模塊之後,我會簡單介紹email模塊的基本使用。

 

SMTP.quit()

  斷開與smtp服務器的連接,相當於發送"quit"指令。

 

下面介紹一下email模塊

 

emial模塊用來處理郵件消息,包括MIME和其他基於RFC 2822的消息文檔。使用這些模塊來定義郵件的內容,是非常簡單的。下面是一些常用的類:

class email.mime.multipart. MIMEMultipart: 多個MIME對象的集合。

class email.mime.audio. MIMEAudio: MIME音頻對象。

class email.mime.image. MIMEImage: MIME二進制文件對象。

class email.mime.text. MIMEText: MIME文本對象。

 

 

補充:

 

說下MIME類型,MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型,就是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。

 

在把輸出結果傳送到瀏覽器上的時候,瀏覽器必須啓動本機的應用程序來處理這個輸出文檔。這可以通過多種類型MIME(多功能網際郵件擴充協議)來完成。在HTTP中,MIME類型被定義在Content-Type header中。

 

例如,架設你要傳送一個Microsoft Excel文件到客戶端。那麼這時的MIME類型就是“application/vnd.ms-excel”。在大多數實際情況中,這個文件然後將傳送給Execl來處理(假設我們設定Execl爲處理特殊MIME類型的應用程序)。在ASP中,設定MIME類型的方法是通過Response對象的ContentType屬性。

 

多媒體文件格式MIME

 

最早的HTTP協議中,並沒有附加的數據類型信息,所有傳送的數據都被客戶程序解釋爲超文本標記語言HTML 文檔,而爲了支持多媒體數據類型,HTTP協議中就使用了附加在文檔之前的MIME數據類型信息來標識數據類型。

 

MIME意爲多用途Internet郵件擴展,它設計的最初目的是爲了在發送電子郵件時附加多媒體數據,讓郵件客戶程序能根據其類型進行處理。然而當它被HTTP協議支持之後,它的意義就更爲顯著了。它使得HTTP傳輸的不僅是普通的文本,而變得豐富多彩。

 

每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象image等,後面定義具體的種類。

 

常見的MIME類型

 

超文本標記語言文本 .html,.html text/html

普通文本 .txt text/plain

RTF文本 .rtfapplication/rtf

GIF圖形 .gif image/gif

JPEG圖形 .ipeg,.jpgimage/jpeg

au聲音文件 .au audio/basic

MIDI音樂文件 mid,.midiaudio/midi,audio/x-midi

RealAudio音樂文件 .ra, .ramaudio/x-pn-realaudio

MPEG文件 .mpg,.mpegvideo/mpeg

AVI文件 .avivideo/x-msvideo

GZIP文件 .gzapplication/x-gzip

TAR文件 .tarapplication/x-tar


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章