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代码检查工具pylint 让你的python更规范
Sep 05 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
Django数据库操作之save与update的使用
Apr 01 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 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生成二维码的两种方法(带logo图像)
2014/03/14 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
2015/10/21 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
Python实现一个简单的验证码程序
2017/11/03 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
python爬取内容存入Excel实例
2019/02/20 Python
python爬虫中多线程的使用详解
2019/09/23 Python
python图形用户接口实例详解
2019/12/16 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
Yahoo-PHP面试题2
2014/12/06 面试题
介绍一下linux的文件权限
2012/02/15 面试题
在校硕士自我鉴定
2014/01/23 职场文书
写给女朋友的检讨书
2014/01/28 职场文书
小学生成长感言
2014/01/30 职场文书
老公爱的承诺书
2014/03/31 职场文书
高效课堂标语
2014/06/26 职场文书
委托证明书
2014/09/17 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
redis sentinel监控高可用集群实现的配置步骤
2022/04/01 Redis