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抓取Discuz!用户名脚本代码
Dec 30 Python
用Python从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
介绍Python中的一些高级编程技巧
Apr 02 Python
python通过smpt发送邮件的方法
Apr 30 Python
在Django框架中设置语言偏好的教程
Jul 27 Python
Python中常见的数据类型小结
Aug 29 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
Python实现程序判断季节的代码示例
Jan 28 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
Python datetime 格式化 明天,昨天实例
Mar 02 Python
python多线程实现同时执行两个while循环的操作
May 02 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
一个实用的php验证码类
2017/07/06 PHP
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
45个JavaScript编程注意事项、技巧大全
2015/02/11 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
Python迭代器和生成器介绍
2015/03/06 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python实现八大排序算法(2)
2017/09/14 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
pytorch中的卷积和池化计算方式详解
2020/01/03 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
2014年基层党组织公开承诺书
2014/03/29 职场文书
中班幼儿评语大全
2014/04/30 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
撤诉书怎么写
2015/05/19 职场文书