1. 程式人生 > >發送電子郵件

發送電子郵件

ins .py dea nbsp 建議 設置 tp服務器 ear none

SMTP

簡單郵件傳輸協議(SMTP)是用於發送電子郵件的協議。

SMTP規定電子郵件應該如何格式化、加密、在郵件服務器之間傳遞,以及在點擊發送後,計算機要處理的所有其他細節。

SMTP服務器的域名通常是電子郵件提供商的域名,前面加上SMTP。

>>> import smtplib
>>> smtpObj1=smtplib.SMTP('smtp.gmail.com',587)    ##TLS
>>> smtpObj2=smtplib.SMTP_SSL('smtp.gmail.com',465)  ##SSL


要確保得到smtp對象後,第一件事就是調用ehlo()方法,否則以後的方法調用會導致錯誤。

連接到SMTP服務器的587端口後,調用starttls()方法,這是連接實現加密必須的步驟。如果要連接到465端口,加密已經設置好了,這一步可以跳過。

不建議在源代碼中放入密碼,推薦調用input(),讓用戶輸入密碼。

>>> import smtplib
>>> smtpObj=smtplib.SMTP('smtp.qq.com',587)
>>> smtpObj.ehlo()
(250, b'smtp.qq.com\nPIPELINING\nSIZE 73400320\nSTARTTLS\nAUTH LOGIN PLAIN\nAUTH=LOGIN\nMAILCOMPRESS\n8BITMIME') ##如果返回的元組中,第一項是250(SMTP中“成功”的代碼),則問候成功了。
>>> smtpObj.starttls()             ##starttls()讓SMTP連接處於TLS模式。
(220, b'Ready to start TLS')       ##返回值220表示服務器已經準備就緒。
>>> smtpObj.login('[email protected]','123456789')
(235,b'2.7.0 Accepted')   ##返回值235表示認證成功。
>>> smtpObj.sendmail('[email protected]','[email protected]','Subject:TKS\nDear,TKS.') ##返回值是一個字典。空字典表示已成功發送。
{}
>>> smtpObj.quit()
(221, b'2.0.0 closing connection')   ##221表示會話結束。


IMAP

SMTP只負責向別人發送電子郵件。IMAP則負責收取下載電子郵件。

python帶有一個imaplib模塊,但實際上第三方的imapclient模塊更易用。

imapclient模塊從IMAP服務器下載電子郵件,格式相當復雜。pyzmail模塊可以完成解析郵件的辛苦工作。

[root@pos ~]# pip3 install imapclient pyzmail
[root@pos ~]# python3
Python 3.4.5 (default, May 29 2017, 15:17:55) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import imapclient
>>> import pyzmail
>>>


電子郵件可以是純文本、HTML或者兩者的混合。

連接到IMAP服務器時,大多數電子郵件提供商要求SSL加密,傳入SSL=TRUE關鍵字參數。

幾乎每個賬戶默認都有一個INBOX文件夾,但也可以調用IMAPClient對象的list_folders()方法,獲取文件列表。這將返回一個元組的列表。每個元組包含一個文件夾的信息。

要選擇一個文件夾進行搜索,就調用IMAPClient對象的select_folder()方法,傳入該文件夾的名稱字符串。

如果搜索匹配大量的電子郵件,python可能拋出異常。如果發生這種情況,必須斷開並重連IMAP服務器,然後再試。這個限制是防止python程序消耗太多內存。可以使用imaplib._MAXLINE=10000000將限制改為10000000字節。

文件夾選中後,就可以用IMAPClient對象的search()方法搜索電子郵件。得到列表後,調用fetch()方法,獲得實際的電子郵件內容。

delete_messages()為郵件加上\Deleted標誌。調用expunge()方法,將永久刪除當前選中的文件夾中帶\Deleted標誌的所有電子郵件。

如果程序運行了幾分鐘或者更長時間,IMAP服務器可能會超時,或自動斷開。調用imapclient.IMAPClient(),再次連接。

>>>import imapclient
>>>imapObj=imapclient.IMAPClient('imap.gmail.com',ssl=True)
>>>imapObj.login('[email protected]','88888888')
>>>imapObj.select_folder('INBOX',readonly=True)
>>>UIDs=imapObj.search(['SINCE 15-Jul-2016'])     ##能夠看到40041
>>>rawMessages=imapObj.fetch([40041],['BODY[]','FLAGS'])
>>>import pyzmail
>>>message=pyzmail.PyzMessage.factory(rawMessages[40041]['BODY[]'])
>>>message.get_subject()  ##獲取主題
'Hello World!'
>>>message.get_addresses('from')   ##發送方
[('abc','[email protected]')]
>>>message.get_addresses('to')     ##接收方
[('Grodd','[email protected]')]
>>>message.get_addresses('cc')     ##抄送
[]             ##表示沒有包含地址
>>>message.get_addresses('bcc')    ##密送
[]
>>>message.text_part != None
True
>>>message.text_part.get_payload().decode(message.text_part.charset)  ##獲取文本部分
>>>message.html_part != None
True
>>>message.html_part.get_payload().decode(message.html_part.charset)  ##獲取html部分
>>>imapObj.logout()


發送電子郵件