python发送多人邮件没有展示收件人问题的解决方法


Posted in Python onJune 21, 2019

背景:

工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人

问题:

使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容

问题代码示例:

# -*- coding:utf-8 -*-
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
 
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
 server = 'mail.****.com'
 user = '*****'
 password = '********'
 
 strFrom = fromAdd
 strTo = toAdd
 
 msgRoot = MIMEMultipart('related')
 msgRoot['Subject'] = subject
 msgRoot.preamble = 'This is a multi-part message in MIME format.'
 
 msgAlternative = MIMEMultipart('alternative')
 msgRoot.attach(msgAlternative)
 
 msgText = MIMEText(html_text, 'html', 'utf-8')
 msgAlternative.attach(msgText)
 
 smtp = smtplib.SMTP()
 smtp.connect(server)
 smtp.login(user, passwd)
 
 att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
 att5["Content-Type"] = 'application/octet-stream'
 att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
 msgRoot.attach(att5)
 
 smtp.sendmail(strFrom, strTo, msgRoot.as_string())
 smtp.quit()
 return

成功代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr
from email.utils import formataddr
from email.header import Header
 
 
def __format_addr__(addr):
 # 解析邮件地址,以保证邮有别名可以显示
 alias_name, addr = parseaddr(addr)
 # 防止中文问题,进行转码处理,并格式化为str返回
 return formataddr((Header(alias_name,charset="utf-8").encode(),
      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
 
 
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
 
 SERVER = 'mail.***.com'
 USER = '******'
 PASSWD = '***'
 
 strFrom = __format_addr(fromAdd)
 
 strTo = list()
 # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
 try:
  for a in toAdd:
   strTo.append(__format_addr(a))
 except Exception as e:
  # 没有对a和toadd进行type判断,出错就直接还原
  strTo = toAdd
 
 msgRoot = MIMEMultipart('related')
 msgRoot.preamble = 'This is a multi-part message in MIME format.'
 
 msgAlternative = MIMEMultipart('alternative')
 msgRoot.attach(msgAlternative)
 
 # 邮件对象 
 msgText = MIMEText(html_text, 'html', 'utf-8')
 msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
 msgRoot['From'] = strFrom  # 发件人也是被格式化过的
 msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
 msgAlternative.attach(msgText)
 
 smtp = smtplib.SMTP(SERVER, 11)
 smtp.set_debuglevel(0)
 # smtp.connect(SERVER)
 smtp.login(USER, PASSWD)
 # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
 smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
 smtp.quit()

总结:

看到 msgRoot['to'] = ','.join(strTo)  与  msgRoot['to'] = strTo

实验过程中发现这个["to"]一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”

同时也发现["to"]的数据类型与sendmail(from_addrs,to_addrs,...)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型

还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,["From"]、["to"]等这些属性给谁都行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python中dict与set的使用
Aug 10 Python
django实现用户登陆功能详解
Dec 11 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
python将视频转换为全字符视频
Apr 26 Python
Python二元赋值实用技巧解析
Oct 25 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
Jan 06 Python
python用opencv完成图像分割并进行目标物的提取
May 25 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
Jun 23 Python
Python获取百度热搜的完整代码
Apr 07 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 #Python
django框架使用orm实现批量更新数据的方法
Jun 21 #Python
python字典改变value值方法总结
Jun 21 #Python
python如何以表格形式打印输出的方法示例
Jun 21 #Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 #Python
对pyqt5之menu和action的使用详解
Jun 20 #Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 #Python
You might like
php修改文件上传限制方法汇总
2015/04/07 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Python函数的迭代器与生成器的示例代码
2020/06/18 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
纯CSS实现设置半个字符的样式
2014/07/03 HTML / CSS
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
Java模拟试题
2014/11/10 面试题
公司总经理工作职责管理办法
2014/02/28 职场文书
党员十八大心得体会
2014/09/12 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
运动与健康自我评价
2015/03/09 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android