今天記錄一下如何使用python收發(fā)郵件,知識(shí)要點(diǎn)在python內(nèi)置的poplib和stmplib模塊的使用上。
1. 準(zhǔn)備工作
首先,我們需要有一個(gè)測(cè)試郵箱,我們使用新浪郵箱,而且要進(jìn)行如下設(shè)置:

在新浪郵箱首頁(yè)的右上角找到設(shè)置->更多設(shè)置,然后在左邊選擇“客戶(hù)端/pop/imap/smtp”:

最后,將Pop3/smtp服務(wù)的服務(wù)狀態(tài)打開(kāi)即可:

2. poplib接收郵件
首先,介紹一下poplib登錄郵箱和下載郵件的一些接口:
self.popHost = 'pop.sina.com' self.smtpHost = 'smtp.sina.com' self.port = 25 self.userName = 'xxxxxx@sina.com' self.passWord = 'xxxxxx' self.bossMail = 'xxxxxx@qq.com'
我們需要如上一些常量,用于指定登錄郵箱以及pop,smtp服務(wù)器及端口。我們調(diào)用poplib的POP3_SSL接口可以登錄到郵箱。
# 登錄郵箱 def login(self): try: self.mailLink = poplib.POP3_SSL(self.popHost) self.mailLink.set_debuglevel(0) self.mailLink.user(self.userName) self.mailLink.pass_(self.passWord) self.mailLink.list() print u'login success!' except Exception as e: print u'login fail! ' + str(e) quit()
在登錄郵箱的時(shí)候,很自然,我們需要提供用戶(hù)名和密碼,如上述代碼所示,使用非常簡(jiǎn)單。
登錄郵箱成功后,我們可以使用list方法獲取郵箱的郵件信息。我們看到list方法的定義:
def list(self, which=None):  """Request listing, return result.   Result without a message number argument is in form  ['response', ['mesg_num octets', ...], octets].   Result when a message number argument is given is a  single response: the "scan listing" for that message.  """  if which is not None:   return self._shortcmd('LIST %s' % which)  return self._longcmd('LIST') 我們看到list方法的注釋?zhuān)渲形囊馑际牵琹ist方法有一個(gè)默認(rèn)參數(shù)which,其默認(rèn)值為None,當(dāng)調(diào)用者沒(méi)有給出參數(shù)時(shí),該方法會(huì)列出所有郵件的信息,其返回形式為 [response, ['msg_number, octets', ...], octets],其中,response為響應(yīng)結(jié)果,msg_number是郵件編號(hào),octets為8位字節(jié)單位。我們看一看具體例子:
('+OK ', ['1 2424', '2 2422'], 16)
這是一個(gè)調(diào)用list()方法以后的返回結(jié)果。很明顯,這是一個(gè)tuple,第一個(gè)值sahib響應(yīng)結(jié)果'+OK',表示請(qǐng)求成功,第二個(gè)值為一個(gè)數(shù)組,存儲(chǔ)了郵件的信息。例如'1 2424'中的1表示該郵件編號(hào)為1。
下面我們?cè)倏慈绾问褂胮oplib下載郵件。
# 獲取郵件 def retrMail(self):  try:   mail_list = self.mailLink.list()[1]   if len(mail_list) == 0:    return None   mail_info = mail_list[0].split(' ')   number = mail_info[0]   mail = self.mailLink.retr(number)[1]   self.mailLink.dele(number)    subject = u''   sender = u''   for i in range(0, len(mail)):    if mail[i].startswith('Subject'):     subject = mail[i][9:]    if mail[i].startswith('X-Sender'):     sender = mail[i][10:]   content = {'subject': subject, 'sender': sender}   return content  except Exception as e:   print str(e)   return None             
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注