POP3接收邮件

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格式输出。

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POP3(Post Office Protocol version 3)是一种用于接收电子邮件的协议。以下是 POP3 接收邮件的基本流程: 1. 建立连接:使用 TCP/IP 协议建立与邮件服务器的连接。 2. 发送身份验证:发送用户名和密码以进行身份验证。 3. 发送命令:发送命令以执行邮件接收操作。常用的命令包括: * USER:指定用户名。 * PASS:指定密码。 * STAT:获取邮箱中的邮件总数和总大小。 * LIST:获取邮件的编号和大小。 * RETR:获取指定邮件的详细内容。 * DELE:标记指定邮件为删除状态。 * QUIT:关闭与服务器的连接。 4. 获取邮件:使用 RETR 命令获取指定邮件的详细内容,然后将其保存到本地计算机上。 5. 删除邮件:使用 DELE 命令将邮件标记为删除状态。 6. 关闭连接:使用 QUIT 命令关闭与服务器的连接。 以下是使用 C++ 实现 POP3 接收邮件的基本代码框架: ```c++ #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { // 初始化 Winsock 库 WSADATA wsaData; int err = WSAStartup(MAKEWORD(2, 2), &wsaData); if (err != 0) { cout << "WSAStartup failed: " << err << endl; return -1; } // 创建套接字 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { cout << "socket failed: " << WSAGetLastError() << endl; WSACleanup(); return -1; } // 设置服务器地址和端口号 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr("邮件服务器地址"); serverAddr.sin_port = htons(110); // 连接服务器 err = connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)); if (err == SOCKET_ERROR) { cout << "connect failed: " << WSAGetLastError() << endl; closesocket(sock); WSACleanup(); return -1; } // 发送身份验证信息和命令,接收服务器响应 // ... // 关闭连接 closesocket(sock); WSACleanup(); return 0; } ``` 注意:上述代码仅为参考,具体实现过程需要根据 POP3 协议规范进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值