python3.7 pop3 请求过于频繁报错

Python018

python3.7 pop3 请求过于频繁报错,第1张

根据我个人经验来看,这个应该是163邮箱的一种限制策略,因为正常人不会这么频繁地去刷新邮箱信息,只有程序或者机器人能达到这个频率,所以被他的后台程序识别出来了,如果想模仿正常人的操作,可以在你的程序里调用random模块,然后让它随礼取一个1-3的数字,然后程序暂停对应的时间,这样的操作就会让163的后台检测程序认为你这是真人在操作,而不是程序在操作。同时也要保证你的程序不能一天24小时都在刷新邮箱信息,一想也知道正常人是不会以这样的频率操作的。

不知道我说清楚了没有,希望可以帮助到你。

由上篇文章我们已经得知邮件从发送到接收的过程:

发件人->MUA->MTA->若干MTA->MDA->MUA->收件人

本节接收邮件主要就是编写一个 MUA 客户端,从 MDA 将邮件取回本地。

收取邮件最常用的是 POP协议 ,目前版本是第三版,也称 POP3 。python内置了 poplib 模块,支持POP3协议。

回想上一节 SMTP ,我们对要发送的邮件内容进行了各种编码,包括添加MIME header,编码之后再进行发送。

因此,我们通过POP3协议接收的也不是原内容,而是经过一系列编码等处理的文本。

所以,要想把POP3收取的文本变为可阅读的邮件对象,就需要利用 email 模块对原始邮件进行解析。

所以,邮件收取的流程就是:

由上一篇 文章 最后总结部分可知。邮件由字符到发送到网络经历了如下的格式转化:

纯文本:

str->bytes->base64->str->bytes

二进制文件:

binary code->base64->str->bytes

我们解析邮件也是按这个思路,逆序解析出内容。

这里的 decode('utf-8') 先把字节流转化为字符串,再将字符串转化为 message 结构的对象。这步与发送邮件的 as_string 函数相反。

先从上一节结构化的 msg 中取出信件头,打印出来。

如果是 multipart 结构, get_payload 函数会返回一个包含不同part的list,然后对每一part递归调用 print_info ,打印子信件头和子信件内容。

不是 multipart 时,之后再依据 Content-Type 作不同处理:

如果是 text :

利用 get_payload(decode = Ture) 取出子信件的内容, decode 为True,则按照 Content-Transfer-Type 将 base64 或 QP 解码为 bytes 。

再 guess_charset 猜出编码方式,之后将其解码为字符显示。

如果不是 Text 对象,则为附件:

打印出附件的 Content-Type 。

不是很理解,你是要把收邮件改成发邮件吗?

发邮件用的是smtp服务,然后填的是smtp服务器地址,然后是一个收件人地址

import smtplib

然后发邮件的示例代码如下

#!/usr/bin/python

# -*- coding: UTF-8 -*-

 

import smtplib

from email.mime.text import MIMEText

from email.utils import formataddr

 

my_sender='[email protected]'    # 发件人邮箱账号

my_pass = 'xxxxxxxxxx'              # 发件人邮箱密码

my_user='[email protected]'      # 收件人邮箱账号,我这边发送给自己

def mail():

    ret=True

    try:

        msg=MIMEText('填写邮件内容','plain','utf-8')

        msg['From']=formataddr(["FromRunoob",my_sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号

        msg['To']=formataddr(["FK",my_user])              # 括号里的对应收件人邮箱昵称、收件人邮箱账号

        msg['Subject']="菜鸟教程发送邮件测试"                # 邮件的主题,也可以说是标题

 

        server=smtplib.SMTP("smtp.qq.com", 25)  # 发件人邮箱中的SMTP服务器,端口是25

        server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱密码

        server.sendmail(my_sender,[my_user,],msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件

        server.quit()  # 关闭连接

    except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False

        ret=False

    return ret

 

ret=mail()

if ret:

    print("邮件发送成功")

else:

    print("邮件发送失败")