POP3邮件客户端程序

POP3(Post Office Protocol - Version 3)邮件客户端程序

1.简介:

之前我们写过smtp程序来发送邮件,但是不能接受邮件并查看。这次我们学习的POP3协议是解决这个问题的,主要用来登录服务器,查看收件箱邮件,进行一些简单的操作。

2.环境调试:

跟smtp协议一样。

3.过程:

1、特许阶段,用户代理发送用户名和口令

2、事务处理阶段:用户代理取回报文;还可以对报文做删除标记,取消报文删除标记,以及获取邮
件的统计信息

3、更新阶段:结束该POP3会话;这个时候该邮件服务器删除那些被标记的删除的报文。

4. 简单处理的代码(还可以再加其他功能):

主要参考一下几个相关函数的使用:

import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr

def login_in():#登录阶段
    email=input('Email:')
    password=input('Password:')
    pop_server=input('Pop3 server:')

    global server
    server=poplib.POP3(pop_server)
    server.set_debuglevel(1)
    print(server.getwelcome().decode('utf-8'))

    server.user(email)
    server.pass_(password)

def handle_command(user_cmd,email_title):#处理命令
    if user_cmd=='1':
        #list the main information
        print('Total message number: %s; Total size: %s;' % server.stat())
    elif user_cmd=='2':
        resp,lines,octets=server.retr(email_title)
        msg_content=b'\r\n'.join(lines).decode('utf-8')
        msg=Parser().parsestr(msg_content)
        print_infor(msg)
    else :
        print('error command!\n')

def print_infor(msg,indent=0):#输出信息
    if indent==0:
        for header in ['From','To','Subject']:
            value=msg.get(header,'')
            if value:
                if header=='Subject':
                    value=decode_str(value)
                else :
                    hdr,addr=parseaddr(value)
                    name=decode_str(hdr)
                    value=u'%s <%s>'%(name,addr)
            print('%s%s: %s'%('  '*indent,header,value))

    if msg.is_multipart():
        parts=msg.get_payload()
        for n,part in enumerate(parts):
            print('%spart %s'%('  '*indent,n))
            print('%s---------------'%('  '*indent))
            print_infor(part,indent+1)
    else:
        content_type=msg.get_content_type()
        if content_type=='text/plain' or content_type=='text/html':
            content=msg.get_payload(decode=True)
            charset=guess_charset(msg)
            if charset:
                content=content.decode(charset)
            print('%sText: %s'%('  '*indent,content+'...'))
        else:
            print('%sAttachment :%s'%('  '*indent,content_type))


def decode_str(s):#解码
    value,charset=decode_header(s)[0]
    if charset:
        value=value.decode(charset)
    return value;

def guess_charset(msg):
    charset=msg.get_charset()
    if charset is None:
        content_type=msg.get('Content-Type','').lower()
        pos=content_type.find('charset=')
        if pos>=0:
            charset=content_type[pos+8:].strip()
    return charset

def start():#开始
    login_in()

    resp,mails,octets=server.list()
    print(mails)
    index=len(mails)

    print('\n--------------------------------------------')
    print('input "0" you can quit\ninput "1" you can get the whole information.\ninput "2" you can see a specific email\n')
    print('--------------------------------------------\n')

    while(1):
        command=input("please input your commands:\n")
        if command=='0':
            break;
        elif command=='2':
            email_num=input("please input the email number you want to see:")
            handle_command(command,email_num)
        else:
            handle_command(command,0)
        print("\n")

    server.quit()
    print('you quit the pop3 successfully!')

if __name__ == '__main__':
    start()

5.结果:

这里写图片描述

附:命令码(摘抄自百度百科):

这里写图片描述

注:以上所有操作均在作者在网上搜集资料后,在个人电脑上实验成功,若读者实验时失败,可能由一些未知因素导致,可与作者联系。编写的教程可能由于疏忽出错,请与作者联系。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值