POP3接收邮件

本文介绍了如何通过Python的poplib模块实现POP3协议接收网易163邮箱的邮件。首先开启邮箱的POP3服务并获取授权码,然后编写Python代码,包括连接邮件服务器、身份验证、获取邮件信息等步骤,最终在控制台输出邮件的From、To、Subject、Date以及内容。示例代码展示了如何解析和打印邮件的各个部分,包括纯文本和HTML格式的邮件内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POP3接收邮件

POP3(Pst Office Protocol 3),即邮局协议的第3个版本,是TCP/IP协议族的一员,适用于C/S构架结构,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。而Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮地址解析协议。本实验目的是了解POP协议接收邮件的实现过程。

实现步骤:
1、使用网易163邮箱,在设置/常规设置页面开启POP3/SMTP服务,复制记录下此时的授权码,此授权码只出现一次,后续的编程需要用到。
在这里插入图片描述
2、编写代码实现POP3接收邮件,并将邮件信息输出。用Python的poplib模块收取邮件分两步:第一步是用POP3协议把邮件获取到本地,第二步是用email模块把原始邮件解析为Message对象,然后,用适当的形式把邮件内容展示给用户即可。代码如下:

import poplib   #导入smtplib模块
from email.header import decode_header  #专门构建邮件标题的,这样可以支持标题中文
from email.parser import Parser  #解析邮件内容

def print_msg(msg, indent=0):
    if indent == 0:
        for header in ["From", "To", "Subject", "Date"]:
            value = msg[header]
            if value:
                value = decode_str(value)
            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_msg(part, indent + 1)
    else:
        content_type = msg.get_content_type()
        if content_type == "text/plain" or content_type == "text/html":  #plain 代表纯文本
            content = msg.get_payload(decode=True)
            charset = get_charset(msg)
            if charset:
                content = content.decode(charset)
            print("%sText: %s" % (" " * indent, content))
        else:
            print("%sAttachment: %s" % (" " * indent, content_type))


def decode_str(s):
    l = decode_header(s)
    value, charset = l[0]
    if charset:
        value = value.decode(charset)

    if len(l) == 2:
        value_tmp = l[1][0]
        value = value + value_tmp.decode(charset)
    return value


def get_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

from_email = "C1362019****@163.com"  #邮箱账号
from_email_pwd = "ZDXKBZBNHQMG****"  #授权码
pop_server = "pop.163.com"   #pop服务器

server = poplib.POP3(pop_server) #连接邮件服务器pop3.com
server.set_debuglevel(1) #查看实时登录日志信息,可以打开或关闭调试信息
print(server.getwelcome().decode("utf-8")) #获取服务器的输出,可选:打印POP3服务器的欢迎文字:

#身份验证
server.user(from_email)
server.pass_(from_email_pwd)

print("Messages: %s Size: %s" % (server.stat())) # stat()返回邮件数量和占用空间

resp, mails, octets = server.list()  # list()返回所有邮件的编号
index = len(mails)  # 获取最新一封邮件, 注意索引号从1开始
resp, lines, octets = server.retr(index)  # lines存储了邮件的原始文本的每一行
msg_content = b"\r\n".join(lines).decode("utf-8") # 可以获得整个邮件的原始文本
msg = Parser().parsestr(msg_content)  # 稍后解析出邮件
print_msg(msg)   #打印邮件信息
server.quit()  # 关闭连接

3、把上面的代码整理好,我们就可以来试试收取一封邮件。先往自己的邮箱发一封邮件,然后用浏览器登录邮箱,看看邮件收到没,如果收到了,我们就来用Python程序把它收到本地,在控制台上输出。运行结果如下:
在这里插入图片描述
+OK Welcome to coremail Mail Pop3 Server (163coms[10774b260cc7a37d26d71b52404dcf5cs])
该信息由代码中print(server.getwelcome().decode(“utf-8”)) 打印输出,改语句的功能是获取服务器的输出,打印POP3服务器的欢迎文字。
Messages: 4 Size: 19317
该信息由代码中print(“Messages: %s Size: %s” % (server.stat()))打印输出,其中 stat()返回邮件数量和占用空间。
Subject: test2
Date: Sat, 27 Mar 2021 14:40:45 +0800
part 0
Text: hello
part 1
Text: <meta http-equiv="Content-Type"content=“text/html;charset=GB18030”>
该邮件的标题是test2,发送时间是2021.2.37,星期六,14:40,邮件内容为hello。其中邮件内容输出有两种格式,一种是plain纯文本输出,另一个是html格式输出。

程序实现流程
在这里插入图片描述

### 解决 JavaMail POP3 接收邮件中文乱码问题 当使用JavaMail API通过POP3协议接收电子邮件时,可能会遇到字符编码不匹配导致的中文乱码问题。为了确保接收到的邮件能够正确显示中文内容,需要采取一些措施来处理字符集转换。 #### 设置正确的字符编码 在读取邮件内容之前,应该先尝试检测并设置合适的字符编码方式。通常情况下,默认采用UTF-8作为通用字符集可以有效减少乱码现象的发生。对于特定情况下的GBK或GB2312编码,则需特别指定: ```java // 获取消息体内容 Object content = message.getContent(); if (content instanceof String) { // 如果是字符串形式的消息体,则重新按照utf-8解码 byte[] bytes = ((String) content).getBytes("ISO-8859-1"); String decodedContent = new String(bytes, "UTF-8"); // 或者试用 "GBK", "GB2312" } else if (content instanceof Multipart){ // 对于多部分邮件,遍历各个子部件进行相同操作... } ``` #### 处理MimeMessage中的文本内容 针对包含HTML或者富文本格式的邮件,在解析这些类型的邮件内容时也需要考虑其内部可能存在的不同编码声明。可以通过`setText()`方法为每个BodyPart设定恰当的内容类型和编码参数[^4]: ```java MimeMultipart multipart = (MimeMultipart)message.getContent(); for(int i=0;i<multipart.getCount();i++){ BodyPart bodyPart=multipart.getBodyPart(i); if(bodyPart.isMimeType("text/plain")){ Object o = bodyPart.getContent(); if(o instanceof String){ String s=(String)o; System.out.println(s); } // 设定文本内容及其编码 bodyPart.setText(decodedText,"UTF-8"); } else if(bodyPart.isMimeType("text/html")) { // 同样地调整html内容的编码 bodyPart.setContent(decodedHtml,"text/html;charset=UTF-8"); } } ``` #### 调整Session属性配置 另外一种常见的做法是在创建会话实例时就定义好默认使用的字符集,这样可以在一定程度上简化后续的操作流程。例如,在初始化`Properties`对象时加入如下设置[^2]: ```properties props.put("mail.mime.charset","UTF-8"); ``` 以上就是解决JavaMail POP3邮件过程中可能出现的中文乱码的一些常见策略和技术细节说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值