zoukankan      html  css  js  c++  java
  • 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"
    ".join(lines)decode("utf-8")
    
        #解析出邮件整个结构体
        neirong = Patser().parsestr(msg_count)
    
        #关闭连接
        server.quit()
    
        return neirong
    
    #笔记未完待续
    
  • 相关阅读:
    POJ 2418 Hardwood Species
    用Excel打开csv格式文件并生成相应图形
    虚拟内存(Virtual Memory)
    POJ 3984 迷宫问题 (Dijkstra)
    算法导论16.22 01背包问题
    POJ 1019 Number Sequence
    POJ 1458 Common Subsequence (最长公共子序列)
    Java处理文件BOM头的方式推荐
    web开发中的中文编码问题
    struts2学习笔记之spring整合
  • 原文地址:https://www.cnblogs.com/TK-tank/p/12332253.html
Copyright © 2011-2022 走看看