首页 > 编程语言 >(Python)email 邮件发送

(Python)email 邮件发送

时间:2022-10-11 21:56:17浏览次数:65  
标签:addr get Python self report email 邮件

"""
1. 发送邮件的几个步骤:
    1)与邮件服务器建立会话连接
    2)指定用户的登录
    3)发送邮件

2. 一个标准邮件包含:
    1)邮件头:标题;收件人、发送人、抄送cc、密送bcc、时间
    2)邮件体:正文、附件


3. 常见的 MIME 格式
    -------------------------------------------------
    文件格式       |   对应的 MIME 格式 (可通过抓包查看)
    -------------------------------------------------
    html            text/html
    xml             text/xml
    text            text/plain
    图片             image/jpg、image/png、image/jpeg...
    应用程序         application/ms-word、application/ms-excel、application/flash...
    二进制流         application/octet-stream

4. 实际 MIME 内容包含:Content-ID、Content-Description、Content-Text、Content-Type、Content-Disposition等
"""
import smtplib
import sys
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from Public_Layer.Read_Ini import ReadIni
from Get_Path import GET_PATH


class SendEmail(object):
    # 完成邮件用户信息的初始化
    def __init__(self):
        __read_ini = ReadIni()
        __ini_path = GET_PATH + "\Public_Layer\Ini\MailIni.ini"
        # 读取邮件配置信息,并以 dict 存储
        self.get_email_config = __read_ini.read_ini(__ini_path, "mail_config")
        self.get_cc = self.get_email_config["cc"]
        self.get_bcc = self.get_email_config["bcc"]

    # 处理收件人信息
    def to_addrs(self):
        try:
            get_to_addr = self.get_email_config['to_addrs']
            # 收件人列表,将 to_addr,cc, bcc 的所有收件人整合在一个列表中
            # 完成后,将列表传给 SMTP().sendmail() 方法中的 to_addrs,真实发送给列表中的收件人
            get_to_addrs_list = get_to_addr.split(",")
            if len(self.get_cc) != 0:
                get_to_addrs_list += self.get_cc.split(",")
            if len(self.get_bcc) != 0:
                get_to_addrs_list += self.get_bcc.split(",")
            return get_to_addrs_list
        except:
            print("收件人信息处理失败")

    # 处理发件人信息
    def from_addr(self):
        try:
            get_from_addr = self.get_email_config['from_addr']
            # 将邮箱中的 发件人,由原来的”我“,显示成为常规的邮箱名
            return get_from_addr.split("@")[0] + "<%s>" % get_from_addr
        except:
            print("发件人信息处理失败")

    # 创建一个完整的邮件
    def create_email(self, subject, message, report_name, report_path):
        # 创建 MIMEMultipart 对象
        email = MIMEMultipart()
        # 1)创建 email 的头,下面的 from,to,cc,bcc 的部分仅仅是显示
        email["Subject"] = subject
        email["From"] = self.from_addr()
        # 将收件人从 list 转成 string 格式
        email["To"] = self.get_email_config["to_addrs"]
        email["Cc"] = self.get_cc
        email["Bcc"] = self.get_bcc
        # 2)添加 email 正文
        email.attach(self.create_email_payload(message))
        # 3)添加 email 附件
        email.attach(self.create_email_attachment(report_name, report_path))
        return email

    # 创建邮件附件
    def create_email_attachment(self, report_name, report_path):
        with open(report_path, mode="rb") as fp:
            email_attach = MIMEText(fp.read(),
                                    _subtype="base64",
                                    _charset="utf-8")
            email_attach["Content_Type"] = "application/octet-stream"
            email_attach.add_header(_name='Content-Disposition',
                                    _value='attachment',
                                    filename='%s' % report_name)

        return email_attach

    # 创建邮件文本
    def create_email_payload(self, message):
        return MIMEText(_text=message, _charset="utf-8")

    # 创建会话、登录并发送邮件
    def send_email(self, subject, message, report_name, report_path):
        try:
            # 创建 SMTP 会话连接对象
            get_smtp = smtplib.SMTP(host=self.get_email_config["mail_server"])
            # SMTP 邮件登录
            get_smtp.login(user=self.get_email_config["mail_user"],
                           password=self.get_email_config["mail_password"])
            # 发送邮件
            # !!此处的 from_addr,to_addrs 是真实的发件人和收件人,与 create_email() 方法的不一样,后者仅是显示
            get_smtp.sendmail(from_addr=self.from_addr(),
                              to_addrs=self.to_addrs(),
                              msg=self.create_email(subject, message, report_name, report_path).as_string()
                              )
        except:
            print(sys.exc_info())


if __name__ == '__main__':
    send_email = SendEmail()
    send_email.send_email("CRM test report", "message", "CRM_Project20221011114522.html",
                          'C:\\Users\\Google_he\\PycharmProjects\\trunk\\Lesson_FullStack_TD\\CRM_Project\\Main_Layer'
                          '\\Report\\CRM_Project20221011114522.html')

 

标签:addr,get,Python,self,report,email,邮件
From: https://www.cnblogs.com/bruce-he/p/16782736.html

相关文章

  • 【python】ERA5逐小时降水数据计算逐日降水
    自用简单方法参考代码:ERA5:Howtocalculatedailytotalprecipitation-CopernicusKnowledgeBase-ECMWFConfluenceWiki1、先从官网(ERA5-Landhour......
  • Python之斐波那契数列的实现
    1.斐波那契数列的概念斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这......
  • Python学习路程——Day12
    Python学习路程——Day12global与nonlocal'''global: 是一个内置方法,它的作用是在函数体内声明一个全局名称空间,让这个全局名称空间可以在函数体内的局部名称空间中被......
  • python基础之闭包函数与装饰器
    python基础之闭包函数与装饰器目录一、global与nonlocal二、函数名的多种用法1.可以当变量名2.可以当函数的参数3.可以当函数的返回值三、闭包函数1.闭包函数的实际应用四......
  • python重点之装饰器
    global与nonlocal函数名的多种用法闭包函数装饰器简介无参装饰器有参装饰器装饰器模板装饰器语法糖今日详细内容global与nonlocalmoney=666defind......
  • python进阶之路11 闭包函数 装饰器
    函数名的多种用法函数名其实绑定的也是一块内存地址只不过该地址里面存放的不是数据值而是一段代码函数名加括号就会找到该代码并执行1.可以当作变量名赋值defindex......
  • Python爬虫-scrapyd框架部署
    爬虫项目部署1脚本文件部署linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题。1.1crontab的使用crontab[-uusername]/......
  • Python基础12
    今日内容概要global与nonlocal函数名的多种用法闭包函数装饰器简介装饰器推导流程装饰器模板装饰器语法糖今日内容详细global与nonlocal'''通过global声明可......
  • 装饰器+闭包掌握(python一大重要功能)
    目录global与nonlocal函数名的多种用法闭包函数装饰器简介1.概念2.本质3.口诀4.超前知识time模块装饰器推导装饰器模板装饰器语法糖作业global与nonlocalglobal#提升......
  • 各大运营商的邮件服务器配置方法
    常见错误:501badaddresssyntax收件地址错误,在系统设置里面配置收件人501badsyntax基本上属于邮件参数错误451Error:queuefilewriteerror网络错误吧,重试......