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 pass 语句使用示例
Mar 11 Python
python中list列表的高级函数
May 17 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
Python对象与引用的介绍
Jan 24 Python
如何利用python给图片添加半透明水印
Sep 06 Python
tensorflow之自定义神经网络层实例
Feb 07 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
深入理解Python 多线程
Jun 16 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
pandas 实现将NaN转换为None
May 14 Python
OpenCV-Python实现轮廓的特征值
Jun 09 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小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
如何调试异步加载页面里包含的js文件
2014/10/30 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
详解使用React进行组件库开发
2018/02/06 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python获取本机mac地址和ip地址的方法
2015/04/29 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
python实现扫描ip地址的小程序
2019/04/16 Python
python pytest进阶之fixture详解
2019/06/27 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
TCP/IP模型的分界线
2012/12/01 面试题
向国旗敬礼学生寄语大全
2014/09/30 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers