简单实现python收发邮件功能

简单实现python收发邮件功能,第1张

概述今天记录一下如何使用python收发邮件,知识要点在python内置的poplib和stmplib模块的使用上。

今天记录一下如何使用python收发邮件,知识要点在python内置的poplib和stmplib模块的使用上。

1. 准备工作

首先,我们需要有一个测试邮箱,我们使用新浪邮箱,而且要进行如下设置:

在新浪邮箱首页的右上角找到设置->更多设置,然后在左边选择“客户端/pop/imap/smtp”:

最后,将Pop3/smtp服务的服务状态打开即可:

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服务器及端口。我们调用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() 

在登录邮箱的时候,很自然,我们需要提供用户名和密码,如上述代码所示,使用非常简单。
登录邮箱成功后,我们可以使用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方法的注释,其中文意思是,List方法有一个默认参数which,其默认值为None,当调用者没有给出参数时,该方法会列出所有邮件的信息,其返回形式为 [response,['msg_number,octets',octets],其中,response为响应结果,msg_number是邮件编号,octets为8位字节单位。我们看一看具体例子:
('+OK ',['1 2424','2 2422'],16)
这是一个调用List()方法以后的返回结果。很明显,这是一个tuple,第一个值sahib响应结果'+OK',表示请求成功,第二个值为一个数组,存储了邮件的信息。例如'1 2424'中的1表示该邮件编号为1。
下面我们再看如何使用poplib下载邮件。

# 获取邮件 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 

poplib获取邮件内容的接口是retr方法。其需要一个参数,该参数为要获取的邮件编号。下面是retr方法的定义:

def retr(self,which):  """RetrIEve whole message number 'which'.   Result is in form ['response',['line',octets].  """  return self._longcmd('RETR %s' % which) 

我们看到注释,可以知道,retr方法可以获取指定编号的邮件的全部内容,其返回形式为[response,octets],可见,邮件的内容是存储在返回的tuple的第二个元素中,其存储形式为一个数组。我们测试一下,该数组是怎么样的。

我们可以看到,这个数组的存储形式类似于一个dict!于是,我们可以据此找到任何我们感兴趣的内容。例如,我们的示例代码是要找到邮件的主题以及发送者,就可以按照上面的代码那样编写。当然,你也可以使用正则匹配~~~ 下面是测试结果:

嗯...大家可以自己试一下。

3. smtp发送邮件

和pop一样,使用smtp之前也要先给它提供一些需要的常量:

self.mail_Box = smtplib.SMTP(self.smtpHost,self.port) self.mail_Box.login(self.username,self.passWord) 

上面是使用smtp登录邮箱的代码,和pop类似。下面给出使用smtp发送邮件的代码,你会看到python是多么的简单优美!

# 发送邮件 def sendMsg(self,mail_body='Success!'):  try:   msg = MIMEText(mail_body,'plain','utf-8')   msg['Subject'] = mail_body   msg['from'] = self.username   self.mail_Box.sendmail(self.username,self.bossMail,msg.as_string())   print u'send mail success!'  except Exception as e:   print u'send mail fail! ' + str(e) 

这就是python用smtp发送邮件的代码!很简单有木有!很方便有木有!很通俗易懂有木有!这里主要就是sendmail这个方法,指定发送方,接收方和邮件内容就可以了。还有MIMEText可以看它的定义如下:

class MIMEText(MIMENonMultipart):  """Class for generating text/* type MIME documents."""   def __init__(self,_text,_subtype='plain',_charset='us-ascii'):   """Create a text/* type MIME document.    _text is the string for this message object.    _subtype is the MIME sub content type,defaulting to "plain".    _charset is the character set parameter added to the Content-Type   header. This defaults to "us-ascii". Note that as a sIDe-effect,the   Content-transfer-encoding header will also be set.   """   MIMENonMultipart.__init__(self,'text',_subtype,**{'charset': _charset})   self.set_payload(_text,_charset) 

看注释~~~ 这就是一个生成指定内容,指定编码的MIME文档的方法而已。顺便看看sendmail方法吧~~~

def sendmail(self,from_addr,to_addrs,msg,mail_options=[],rcpt_options=[]):  """This command performs an entire mail transaction.   The arguments are:   - from_addr : The address sending this mail.   - to_addrs  : A List of addresses to send this mail to. A bare        string will be treated as a List with 1 address.   - msg   : The message to send.   - mail_options : List of ESMTP options (such as 8bitmime) for the        mail command.   - rcpt_options : List of ESMTP options (such as DSN commands) for        all the rcpt commands. 

嗯...使用smtp发送邮件的内容大概就这样了。

4. 源码及测试

# -*- Coding:utf-8 -*- from email.mime.text import MIMEText import poplib import smtplib   class MailManager(object):   def __init__(self):   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'   self.login()   self.configMailBox()   # 登录邮箱  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()   # 获取邮件  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   def configMailBox(self):   try:    self.mail_Box = smtplib.SMTP(self.smtpHost,self.port)    self.mail_Box.login(self.username,self.passWord)    print u'config mailBox success!'   except Exception as e:    print u'config mailBox fail! ' + str(e)    quit()   # 发送邮件  def sendMsg(self,mail_body='Success!'):   try:    msg = MIMEText(mail_body,'utf-8')    msg['Subject'] = mail_body    msg['from'] = self.username    self.mail_Box.sendmail(self.username,msg.as_string())    print u'send mail success!'   except Exception as e:    print u'send mail fail! ' + str(e)  if __name__ == '__main__':  mailManager = MailManager()  mail = mailManager.retrMail()  if mail != None:   print mail   mailManager.sendMsg() 

上述代码先登录邮箱,然后获取其第一封邮件并删除之,然后获取该邮件的主题和发送方并打印出来,最后再发送一封成功邮件给另一个bossMail邮箱。

测试结果如下:

好的,大家可以把上面的代码复制一下,自己玩一下呗

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的简单实现python收发邮件功能全部内容,希望文章能够帮你解决简单实现python收发邮件功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1200792.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存