zoukankan      html  css  js  c++  java
  • Python邮箱客户端编写之接收邮件操作

    Python的POP3类有很多方法来管理邮箱。

    首先需要导入poplib库,import poplib

    POP3(server) 连接到邮箱服务器

    user(username)将用户名发送至服务器,等候服务器的正在等候用户密码的返回信息

    pass_(password)将密码发送至服务器,进行登录。如果登录失败,会引发异常。

    stat() 返回长度为2的元组:分别表示邮箱中邮件的数量、邮件消息的总大小(字节数)。

    list() 返回长度为3的元组,分别表示服务器的返回信息、消息列表、返回信息的大小。

    retr(messagenumber)返回长度为3的元组,分别表示服务器的返回信息、指定标号邮件的所有行、邮件消息的大小(字节数)。

    quit() 结束连接并退出。


    但是通过retr()方法得到的邮件的所有行消息是没有进行解码的。我们需要采用Python提供的email库来将消息转化为email的实例,从而通过email的方法对邮件进行处理。

    email.message_from_string()这个方法可以将string的邮件内容转换成email.message实例。然后通过其他方法将邮件内容(发件人、发件时间、主题、正文等)提取出来。


    将相关信息提取出来以后,可以通过cPickle.dump()方法将信息存入磁盘文件中。

    实例代码如下:

    import poplib
    import email
    import email.header
    import email.utils
    import cPickle
    
    server = "server_name"
    user = "login_name"
    password = "password"
    server = poplib.POP3(server)
    server.user(user)
    server.pass_(password)
    mailfrom = []        
    ret = server.list() #获得邮件列表
    mailcount = len(ret[1]) #获得邮件列表长度
    for num in range(1,mailcount):
        rsp,msglines,msgsize = server.retr(num) #获取邮件内容
        mail = email.message_from_string(string.join(msglines,'
    ')) #转化为email.message实例
        subject = email.Header.decode_header(mail['subject'])[0][0] #获取邮件主题内容
        mail_from = email.utils.parseaddr(mail['From'])[1] #获取发件人邮箱
        mail_time = email.Header.decode_header(mail['Date'])[0][0] #获取发件时间
        mail_object = DownMessage(mail) #获取邮件正文
        fp = file('mail.txt', 'w')
        cPickle.dump(mail_from, fp) #将获取的信息存入磁盘文件
        cPickle.dump(mail_time, fp)
        cPickle.dump(subject, fp)
        cPickle.dump(mail_object, fp)
        fp.close()    
    server.quit()
    #对邮件正文进行解码处理
    def DownMessage(self,mail):
        if mail.is_multipart():
            for part in mail.get_payload():
                self.DownMessage(part,filename)
        else:
            types = mail.get_content_type()
            charset = mail.get_content_charset()
            if types == 'text/plain' or types == 'text/html':
                try:
                    if charset == 'utf_8':
                        mailobject = unicode(mail.get_payload(decode=True),charset)
                    elif charset == None:
                        mailobject = mail.get_payload(decode=True)
                    else:
                        mailobject = mail.get_payload(decode=charset).decode(charset)
                except:
                    print 'BLANK'
            elif types == 'text/base64':
                try:
                    mailobject = unicode(base64.decodestring(mail.get_payload(),charset))
                except:
                    print 'BLANK'
         return mailobject




  • 相关阅读:
    Mac 实用工具——迁移助理
    Mac OS 的终端工具 iTerm2 的使用及设置
    Python3的异常捕获和处理
    Python3 文件的重命名
    Linux下jetty的启动和停止
    MySQL使用select查询时,在查询结果中增加一个字段并指定固定值
    使用ThreadLocal请务必remove
    Vue基础-文本显示,v-html插入html代码
    nginx之location(root/alias)&& linux 上修改了nginx.conf 怎么重新加载配置文件生效
    CentOS7开启防火墙及特定端口
  • 原文地址:https://www.cnblogs.com/pangblog/p/3253713.html
Copyright © 2011-2022 走看看