"""
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')

(Python)email 邮件发送的更多相关文章

  1. Python 基于Python实现邮件发送

    基于Python实现邮件发送   by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7   注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...

  2. 用Python实现邮件发送Hive明细数据

    代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...

  3. C# Email邮件发送,功能是密码找回或者重置功能。

    原文:C# Email邮件发送,功能是密码找回或者重置功能. 最近根据公司需求,写个邮件发送.   这里面的传入的地址信息的参数都是经过加密的.  主要是保证用户信息的安全. 帮助类   using ...

  4. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  5. python实现邮件发送完整代码(带附件发送方式)

    实例一:利用SMTP与EMAIL实现邮件发送,带附件(完整代码) __author__ = 'Administrator'#coding=gb2312 from email.Header import ...

  6. python实现邮件发送

    实例补充: #**************************利用STMP自动发送邮件******************************import smtplibsmtp = smtp ...

  7. Python SMTP邮件发送

    SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块: email负责构造邮件 ...

  8. 基于Python实现邮件发送

    import smtplibfrom email.mime.text import MIMETextemail_host = 'smtp.163.com' # 邮箱地址email_user = 'sz ...

  9. Python之邮件发送

    Python的smtplib提供了一种很方便的途径用来发送电子邮件,它有SMTP协议进行简单的封装,可以使用SMTP对象的sendmail方法发送邮件,通过help()查看SMTP所提供的方法如下: ...

  10. 如何用python进行邮件发送

    使用Python调用邮件服务器发送邮件,使用的协议是SMTP(Simple Mail Transfer Protocol),下图为使用TCP/IP基于SMTP发送邮件的过程示意图: SMTP协议工作原 ...

随机推荐

  1. 使用云服务器配置MariaDB环境,Navicat远程连接一直出错误代码 "2002 - Can't connect to server on '' (10060)"

    使用腾讯云或者阿里云的服务器配置MariaDB数据库环境的时候,用Navicat远程连接在Centos7的Linux上配置MariaDB数据库环境的时候一直出错误代码 "2002 - Can ...

  2. 如何让别人pip install自己写的库?

    一. 构建项目目录结构 结构如图所示: 文件介绍:LICENSE和README.md在git建仓库时选上,克隆下来就会有,license最好选择MIT的.sort.py文件里随便写个方法用于直接调用: ...

  3. 与 Flutter 共创未来 | Flutter Forward 活动精彩回顾

    作者 / Google 开发者框架和语言 (含 Flutter.Dart 和 Go) 产品经理 & 用户体验总监 Tim Sneath 我们很高兴可以在 Flutter Forward 活动 ...

  4. [Ynoi2016] 掉进兔子洞

    \(\text{Solution}\) 莫队配合 \(\text{bitset}\) 发现答案困难的部分在于同一个数在三个区间出现次数的最小值 考虑强行拆开看,用莫队处理出每个区间每个数的出现次数,这 ...

  5. 【USACO 2021 US Open, Gold】Permutation

    \(\text{Solution}\) 发现每个时刻的状态一定是所有点在一个最外围三角形的内部 设 \(f_{i,j,k,p}\) 表示排列填到第 \(p\) 位,此时图形最外围的三角形是以编号为 \ ...

  6. JZOJ 4366. 【GDKOI2016】项链

    \(\text{Problem}\) 给出一个项链,删去连续的一部分,使剩下的对称,且长度最长 \(\text{Analysis}\) 可以发现,剩下的合法项链一定是由两个回文串接起来(由对称性质可知 ...

  7. 大规模 IoT 边缘容器集群管理的几种架构-5-总结

    前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s 大规模 IoT 边缘容器集群管理的几种架构-2-H ...

  8. Prime Distance

    Description The branch of mathematics called number theory is about properties of numbers. One of th ...

  9. 跳板攻击之:Socks 代理转发

    跳板攻击之:Socks 代理转发 目录 跳板攻击之:Socks 代理转发 1 Socks 代理转发原理 2 实验环境 2.1 客户端配置 2.2 服务端配置 2.3 利用 Socks 代理扫描内网主机 ...

  10. ABP微服务系列学习-对接前端界面

    前面我们把后端的微服务架子基本搭建完成并成功启动了,现在我们可以对接前端界面了.这里我们直接用ABP模板里面的Angular的前端界面. 创建应用程序模板 使用ABPCli创建一个应用程序模板,前端选 ...