python 收发邮件

今天记录一下如何使用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 = '[email protected]'
        self.passWord = 'xxxxxx'
        self.bossMail = '[email protected]'

我们需要如上一些常量,用于指定登录邮箱以及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, [‘line‘, ...], 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 = '[email protected]'
        self.passWord = 'xxxxxx'
        self.bossMail = '[email protected]'
        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, '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)

if __name__ == '__main__':
    mailManager = MailManager()
    mail = mailManager.retrMail()
    if mail != None:
        print mail
        mailManager.sendMsg()

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

测试结果如下:

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

时间: 2024-10-15 01:02:48

python 收发邮件的相关文章

利用python收发邮件功能实现远程电脑的控制

功能并非原创, 只是重复实现了 http://codecloud.net/python-control-128.html 中描述的功能. 实现功能: 通过给固定邮件地址发送命令(包含在主题中)的方式控制远程电脑实现相应功能(譬如关机等, 可以根据实际需要实现更复杂的功能) 实现原理: 远程电脑不断(每隔10s)利用 python 脚本检查邮件服务器是否有新邮件, 如有则对邮件进行分析, 如果包含可执行命令, 则执行相应命令 你需要的: 装有 PYTHON 的 PC; 最好两个邮箱(一个用于接收命

JavaMail实现收发邮件(五)使用SSL实现加密传输

一 概念简介 Secure Socket Layer,为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听.一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境.只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL.当前版本为3.0.它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输.(PS:来至百度百科) 二 在JavaM

2015第34周二能收发邮件但不能打开网页解决方法

晚上电脑可以正常收发邮件,ping同 www.baidu.com,但用IE就是不能打开网页,尝试把无限关掉再打开,网卡禁用再启用还是不行,很郁闷,问在同一网络的其它人也能正常上网,最后通过以下方法解决IE浏览器的Internet选项->连接->局域网设置->去掉勾选使用自动配置脚本,勾选自动检测设置,并且去掉下面代理服务器的勾选后能正常上网.出现此问题可能是因为今天调试拦截http请求时,应用了代理设置导致的. 在默认情况下,Fiddler不能监听Java HttpURLConnecti

在命令行上 使用 mutt, fetchmail, maildrop, msmtp 收发邮件

基于shell 现在已经有了 Mail.app, Thunderbird, Outlook 这些图形化工具能很方便的处理邮件,为啥还需要 mutt 这种命令行文本方式的邮件工具呢?mutt 的一个优势是占用资源小,可以很好的运行在低配置的虚拟机或古老的电脑上(应该不会有人想在 256MB 内存的虚拟机或 VPS 上用 X Window/Gnome/Thunderbird 这种组合吧).那为什么要在虚拟机上收发邮件呢,不能在自己电脑上处理邮件吗?可能有多个电脑而且电脑经常换,电脑可能被盗,硬盘可能

python发邮件

import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方 SMTP 服务 mail_host="smtp.qq.com" #设置服务器 mail_user="xxxxxx" #用户名 mail_pass="plcfthkdtpoxcabh" #口令QQ需要授权码 sender = '[email protected]' rec

ASP.NET收发邮件

在.NET中常见到在线发邮件的实例,网站加上这个功能可以方便站长与用户的交流. NET 中发邮件有时候会用到IIS组件中的邮件服务器,不过复杂.对虚拟主机的配置也较麻烦, 也可用第三方组件比如Jmail,但.net本身就已经封装了发邮件的类:WebMail; 不过要首先引入这个类:using System.Web.Mail;//导入邮件发送类using System.IO;//文件上传类型 这个类中包含了一些常用的对象常用的有From ,To,Subject,Body,Attchments(附件

使用JavaMail收发邮件

概述 邮件相关的标准 厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol):即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. POP3(Post Office Protocol - Version 3):即邮局协议版本3,用于接收电子邮件的标准协议. IMAP(Internet Mail Access Protocol):即Internet邮件访问

python的邮件模块smtplib&email

import smtplib import string from email.mime.text import MIMEText def send_mail(host, sender, sender_passwd, receiver, content_file, port="25"):     # print "create smtp object"     server = smtplib.SMTP()     # print "conncect sm

python 发邮件乱码

来自:http://outofmemory.cn/code-snippet/1464/python-send-youjian-resolve-suoyou-luanma-question 使用python发邮件很简单,但是遇到乱码问题很烦恼. 乱码问题有几种:有发件人名称乱码,有标题乱码,也有正文乱码的问题. 要解决发件人名称乱码问题,必须使用Header,如下代码: from email.header import Header from = ("%s<[email protected]