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通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 Python
Python实现遍历数据库并获取key的值
May 17 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
Python中import机制详解
Nov 14 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
Django 路由控制的实现代码
Nov 08 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
200行python代码实现2048游戏
Jul 17 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
python获取引用对象的个数方式
Dec 20 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
python基于tkinter制作无损音乐下载工具
Mar 29 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生成随机密码类分享
2014/06/25 PHP
smarty表格换行实例
2014/12/15 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
python采集百度百科的方法
2015/06/05 Python
Python实现堆排序的方法详解
2016/05/03 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
Python 字符串与数字输出方法
2018/07/16 Python
CentOS 7下安装Python3.6 及遇到的问题小结
2018/11/08 Python
NumPy 数组使用大全
2019/04/25 Python
python区块及区块链的开发详解
2019/07/03 Python
Django 开发环境配置过程详解
2019/07/18 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python更换pip源方法过程解析
2020/05/19 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
配置管理计划的主要内容有哪些
2014/06/20 面试题
大四毕业生学习总结的自我评价
2013/10/31 职场文书
教师业务学习制度
2014/01/25 职场文书
个人存款证明书
2014/10/18 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书