110.网络编程-mail

网络编程-mail

  • MUA:MailUserAgent 邮件用户代理
  • MTA:MailTransferAgent 邮件传输代理
  • MDA:MailDeliveryAgent 邮件投递代理
  • 流程
    • QQ_MUA -> QQ_MTA -> SINA_MTA -> SINA_MDA -> SINA_MUA
  • 程序流程
    • 发送:MUA -> MTA with SMTP
    • 接收:MDA -> MUA with POP3 and IMAP

python for mail

  • SMTP协议负责发送邮件

    • email模块构建邮件
      • 纯文本邮件
    • HTML格式发送邮件
      • 准备html代码内容
      • 把邮件的subtpye设定为html
    • 发送带附件的邮件
      • 可以看作是一个文本邮件和一个附件邮件的合体
      • 一封信设计多个部分,需要MINEMultipart(格式构建)
      • 添加一个MIMEText正文
      • 添加一个MINMEBase或者MINMEText作为附件
    • 添加邮件头,抄送等信息
      • 属性:mail["From"] 表示发送者的信息,包括姓名和邮件
      • 属性:mail["To"] 表示接收者信息,包括姓名和邮件地址
      • 属性:mail["Subject"] 表示摘要或者主题信息
    • 同时支持html和text格式
      • 若对方支持html,对方就用html,若不支持就用,对方就用text
      • 构建一个MIMEMultipart格式邮件
      • MIMEMultipart的subtype属性设置成alternative
      • 添加html和text邮件
    • smtplib模块发送邮件
  • 写邮件

#构建一个纯文本的邮件
import socket
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#MIMEText写一封邮件的内容
#三个参数
#1.邮件内容
#2.MIME子类型,(plain 为text类型)(html 为html类型)
#3.编码类型
neirong = MIMEText("你好~~", "plain", "utf-8")
#添加发送者信息属性
neirong["From"] = Header("发送者信息", "utf-8")
#添加接收者信息属性
neirong["To"] = Header("接收者信息", "utf-8")
#添加摘要信息属性
neirong["Subject"] = Header("摘要或主题信息", "utf-8")

#准备参数
from_addr = "自己的邮箱"
from_pwd = "自己邮箱的授权码"
to_addr = "对方邮箱"
smtp_addr = "STMP服务器地址" #自己SMTP服务器一般是smtp.qq.com

try:
    #生成一个服务器实例
    #第一个参数 服务器地址要编码
    #第二个参数 服务器接收访问的端口 465是默认的ssl端口
    youjian = smtplib.SMTP_SSL(smtp_addr.encode(), 465)

    #登录自己的邮箱邮箱
    youjian.login(from_addr, from_pwd)

    #发送邮件
    #三个参数
    #1. 自己的地址
    #2. 接收的地址,必须是list类型,其中可填多个地址
    #3. 发送的内容,作为字符串发送
    youjian.sendmail(from_addr, [to_addr], neirong.as_string())
    
    #关闭通道
    youjian.quit()

except Exception as err:
    print(err)
#构建一个有附件的邮件

from email.mime.text import MIMEText
from email.mime.multipart import MIMEBase, MIMEMultipart

#构建一个邮件内容实例
#alternative意思是 若对方支持html,对方就用html,若不支持就用,对方就用text
youjian = MIMEMultipart("alternative")

#构建一个文本内容邮件实例
youjian_t = MIMEtext("你好~~", "plain", "utf-8")
#加入内容实例中
youjian.attach(youjian_t)

#构建一个邮件其他内容实例
with open("xx.html", "rb") as f:
    
    #构建一个html内容邮件实例
    youjian_f = MIMEText(f.read(), "base64", "utf-8")
    #设置属性
    youjian_f["Content-Type"] = "application/octet-stream"
    youjian_f["Content-Disposition"] = "attachment; filename='xx.html'"
    #加入内容实例中
    youjian.attach(youjian_f)

#其他和发文本邮件一样
  • POP3协议负责收邮件
    • 本质上是要给MDA到MUA的一个过程
    • 从MDA下载下来的是一个完整的邮件结构,需要解析

    • 解析过程

      1. 用poplib下载邮件结构体原始内容
        1. 准备相应内容
        2. 身份认证
        3. 得到邮箱内的邮件完整列表
        4. 根据相应序号,得到某一封邮件的数据流
        5. 利用解析函数解析出相应的邮件结构体
      2. 用email解析邮件的具体内容
#负责从MDA到MUA下载
import poplib

#负责解析邮件结构
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr

#得到邮件
def getMsg():

    #建立ssl安全通道
    server = poplib.POP3_SSL("pop服务器地址") #一般是"pop.qq.com"
    server.user("对方邮件地址")
    server.pass_("授权码")

    #.stat()返回一个tupole,内容是 邮件数量 占用空间
    msgs, counts = server.stat()
    print("数量:{0}, 占用空间:{1}".format(msgs, counts))

    #.list()返回所有邮件编号列表
    #rsp 响应信息
    #mails 所有邮件编号
    #octets 返回的数据大小
    rsp, mails, octets = server.list()

    #获取最新邮件的编号,邮件索引号是从1开始,越新越大
    index = len(mails)
    
    #获取最新一封邮件
    #rsp 相应信息
    #retr 返回一个具体索引号的一封信的内容,此内容不具可读性
    #lines 存储邮件的最原始文本的每一行
    #octets 返回的数据大小
    rsp, lines, octets = server.retr(index)

    #加入回车等,并解码,形成整个邮件的原始文本,内容不可读
    msg_count = b"\r\n".join(lines)decode("utf-8")

    #解析出邮件整个结构体
    neirong = Patser().parsestr(msg_count)

    #关闭连接
    server.quit()

    return neirong

#笔记未完待续

猜你喜欢

转载自www.cnblogs.com/TK-tank/p/12332253.html