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入门者的一些编程建议
Jun 15 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
Python 类的继承实例详解
Mar 25 Python
import的本质解析
Oct 30 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
导入tensorflow时报错:cannot import name 'abs'的解决
Oct 10 Python
Python while true实现爬虫定时任务
Jun 08 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
Python+Xlwings 删除Excel的行和列
Dec 19 Python
python实现简单文件读写函数
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
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
PHP strtotime函数详解
2009/12/18 PHP
php实现文件下载代码分享
2014/08/19 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
Laravel下生成验证码的类
2017/11/15 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
Python定义函数功能与用法实例详解
2019/04/08 Python
Python八皇后问题解答过程详解
2019/07/29 Python
vim自动补全插件YouCompleteMe(YCM)安装过程解析
2019/10/21 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
写给保洁员表扬信
2014/01/08 职场文书
初中生自我评价
2014/02/01 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python