8.2.1---Python入门之邮箱登录查询

2021/4/24 1:25:16

本文主要是介绍8.2.1---Python入门之邮箱登录查询,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

'''
思路:
    1.收件邮箱地址:
        pop.qq.com(端口:110) [收件地址]
    2.账户密码:

    3.接收邮件的类库包:
        import poplib
    4.登录邮件服务器:

    5.获取数据 [将获取的数据,按照指定格式进行解析,得到自己相要的数据]

    6.解析目标邮件:
==============邮箱服务器地址================
QQ邮箱:
    POP3服务器地址:pop.qq.com(端口:110) [收件地址]
    SMTP服务器地址:smtp.qq.com (端口:25)[发件地址]

腾讯企业邮箱:
    POP3/SMTP协议:
        接收邮件服务器:pop.exmail.qq.com (端口 110),使用SSL,端口号995      [收件地址]
        发送邮件服务器:smtp.exmail.qq.com (端口 25),使用SSL,端口号465或587 [发件地址]
    IMAP协议:
        接收邮件服务器:imap.exmail.qq.com (端口 143),使用SSL,端口号993
        发送邮件服务器:smtp.exmail.qq.com (端口 25),使用SSL,端口号465或587
==============================
'''
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

##########################################
### 一. 登录邮箱服务器的准备
##
## 1.收件邮箱地址:
import poplib
from email.header import decode_header
from email.parser import Parser
from email.utils import parseaddr

server_info = "pop.qq.com"
## 2.账户密码:
user = "登录的邮箱地址"
pwd = "Password"

##########################################
### 二. 连接邮箱
##
## 1.创建邮箱服务器连接: [poplib是登录邮箱服务器的包,需要导包]
##   调用方法 .POP3(self, host="邮箱服务器的收件地址", port=POP3_PORT,(POP3_PORT默认值110)
##                timeout=socket._GLOBAL_DEFAULT_TIMEOUT)
##   进行邮箱服务器的连接基本信息绑定:
client = poplib.POP3(host=server_info,port=110) ## port可不填,默认值就是110
## 2.登录服务器:
client.user(user=user)
client.pass_(pswd=pwd)

## 3.获取邮件信息:
## 3.1 通过list 方法,获取所有的邮件信息 ,得到本次请求可以获取到多少个邮件
# resp  : 状态信息,有多少封邮件
# list  : 返回每一份邮件,以及邮件大小
# octets: 邮件字节
resp, list, octets = client.list()
# print(resp)
# print(list)
# print(octets)
## 3.2 获取最后一封邮件的信息 用lin方法,得到list中总共有多少邮件,并获取最后一个
##     此处 the_mail的值是 bytes 字节类型 .该类型需要转换为String类型进行处理
the_mail= client.retr(len(list)-1)[1]
# print(the_mail) # 打印下刚拿到邮件时的信息
## 3.3 解析邮件
### 3.3.1 [这里在对 bytes 字节类型转String时,需要将每个元素用分隔符\r,换行符\n 进行分隔,否则工具类无法识别]
mail_str =  b'\r\n'.join(the_mail).decode('utf-8')
# print(mail_str) # 打印下对邮件进行字Bytes转String后的格式,指定分隔;
### 3.3.2 导入工具类:Parser, 对邮件进行解析,(输入文件或字符串)
message = Parser().parsestr(mail_str)
### 3.3.2.1 得到发件人 : message.get("From") 即得到标题:谁发的,返回一个tuple元组("发件人","email地址")
### 3.3.2.1.1 将字符串转为tuple 方法: parseaddr()
#                       将addr解析为其组成的realname和email地址部分。
#                       返回一个实名和电子邮件地址的元组,除非解析失败,在
#                       这种情况下返回一个二元组(",")
from_tuple = parseaddr(message.get("From"))
print("from_email: ", from_tuple[1]) ## 获取索引位为1的信息,得到发件人的邮箱;
### 3.3.2.1.2 调用标题解析方法:decode_header() ;对得到的标题tuple 值进行编码解析,(解码消息头值而不转换字符集):
#                 返回一个list列表,["字符串"、"字符集"]
from_name_list = decode_header(from_tuple[0])[0]
print("原字符编码: ", from_name_list[1])
from_name = from_name_list[0].decode('utf-8') ## 获取索引位为0的字符串信息,谁发的邮件,并指定字符编码;
print("from_name: ", from_name) ## 打印谁发的邮件
### 3.3.2.2 得到收件人
to_tuple = parseaddr(message.get("To"))
### 3.3.2.2.1 调用标题解析方法:decode_header()
to_tuple_list = decode_header(to_tuple[0])[0]
to_name = to_tuple_list[0]#.decode("utf-8") ## 获取索引位为0的字符串信息,谁发的邮件,并指定字符编码;[注意:只有命名是中文时才能指定字符集,否则报错]
print("to_name: ", to_name) ## 打印发给谁的邮件
print("to_email: ", to_tuple[1]) ## 获取索引位为1的信息,得到发件人的邮箱;
### 3.3.2.3 得到标题
print(message.get("Subject"))

### 3.3.2.4 得到内容
## get_payload() 方法默认会对文章内容进行解析,即decode
## 如果不需要默认解析,则设置(decode=True),表示需要自定义解析,并指定字符编码即可.
print(message.get_payload(decode=True).decode('utf-8'))


这篇关于8.2.1---Python入门之邮箱登录查询的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程