python实现自动发送邮件发送多人、群发、多附件的示例


Posted in Python onJanuary 23, 2018

1、最近公司实现部分数据统计、分析的报表进行每天定时发送到相关人员的邮箱之中的配置代码被人为删除了,需要重新恢复该功能,由于原先是在linux上使用shell配置发送,实在是太繁琐,所以准备使用python来实现该功能,不过发现网上各种文档都是未经过整理,代码写的很不友善,比如发送多人的只能发送前一个邮箱,附件写死不灵活等等,故特写一遍比较记录。

主要会遇到的几个问题:

      1、smtplib.SMTPAuthenticationError: (550, b'User has no permission')

      2、smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed')

             这两个错误是你的密码用的不是授权码导致,授权码生成自行百度。

      3、554 DT:SPM 163 smtp5

这属于网易邮箱的一个退回检测机制导致,貌似跟发送比较频繁有关,我再发送的时候有遇到过,直到添加了一个网易邮箱作为收件箱之后才能发送成功,不知道是不是这个原因导致,具体原因未知,如果有人知道请在私信或者评论下告知,谢谢!!

前期准备查看系统上python版本号:

python实现自动发送邮件发送多人、群发、多附件的示例

显示如图表示已经安装好了。

2、实现代码如下(这是在Windows上的IDEL下编辑测试代码,linux上只有改下附件路径就好了)

# -*- coding: utf-8 -*-
from email import encoders
import os
import traceback
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# 中文处理
def _format_addr(s):
 name, addr = parseaddr(s)
 return formataddr((Header(name, 'utf-8').encode(), addr))
def send_email(to_addr_in,filepath_in):
 # 邮件发送和接收人配置
 from_addr = '*******@163.com'
 smtp_server = 'smtp.163.com'
 password = '********' #这是你邮箱的第三方授权客户端密码,并非你的登录密码
 to_addr = to_addr_in
 to_addrs = to_addr.split(',')
 msg = MIMEMultipart()
 msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)  # 显示的发件人
 # msg['To'] = _format_addr('管理员 <%s>' % to_addr)    # 单个显示的收件人
 msg['To'] = ",".join(to_addrs)         # 多个显示的收件人
 msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()  # 显示的邮件标题
 # 需要传入的路径
 # filepath = r'D:\test'
 filepath = filepath_in
 r = os.path.exists(filepath)
 if r is False:
  msg.attach(MIMEText('no file...', 'plain', 'utf-8'))
 else:
  # 邮件正文是MIMEText:
  msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
  # 遍历指定目录,显示目录下的所有文件名
  pathDir = os.listdir(filepath)
  for allDir in pathDir:
   child = os.path.join(filepath, allDir)
   print child.decode('gbk') # .decode('gbk')是解决中文显示乱码问题
   # 添加附件就是加上一个MIMEBase,从本地读取一个文件
   with open(child, 'rb') as f:
    # 设置附件的MIME和文件名,这里是txt类型:
    mime = MIMEBase('file', 'xls', filename=allDir)
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename=allDir)
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart:
    msg.attach(mime)
 try:
  server = smtplib.SMTP(smtp_server, 25)
  # server.starttls()
  server.set_debuglevel(1) # 用于显示邮件发送的执行步骤
  server.login(from_addr, password)
  # print to_addrs
  server.sendmail(from_addr, to_addrs, msg.as_string())
  server.quit()
 except Exception, e:
  print "Error: unable to send email"
  print traceback.format_exc()
if __name__ == '__main__':
 send_email('*******@qq.com,*******@163.com','D:\\test')

3、在 PyCharm 里面执行结果如下

python实现自动发送邮件发送多人、群发、多附件的示例

显示邮件已经发送成功了,可在相应的邮箱里面查看,相应的文件夹下存在附件文本

python实现自动发送邮件发送多人、群发、多附件的示例

如果不存在附件文本(这是截图的网易邮箱,上面截图的是QQ邮箱表示两个邮箱都已经收到邮件):

python实现自动发送邮件发送多人、群发、多附件的示例

以上这篇python实现自动发送邮件发送多人、群发、多附件的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
python编写网页爬虫脚本并实现APScheduler调度
Jul 28 Python
让Python代码更快运行的5种方法
Jun 21 Python
python之消除前缀重命名的方法
Oct 21 Python
Python网页正文转换语音文件的操作方法
Dec 09 Python
Python实现将多个空格换为一个空格.md的方法
Dec 20 Python
django框架两个使用模板实例
Dec 11 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
python正则表达式面试题解答
Apr 28 #Python
Django中使用celery完成异步任务的示例代码
Jan 23 #Python
python3 发送任意文件邮件的实例
Jan 23 #Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 #Python
Python实现PS图像明亮度调整效果示例
Jan 23 #Python
matplotlib绘图实例演示标记路径
Jan 23 #Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
Jan 23 #Python
You might like
领悟php接口中interface存在的意义
2013/06/27 PHP
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
基于jQuery的日期选择控件
2009/10/27 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
关于js对textarea换行符的处理方法浅析
2018/08/03 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
js实现表格单列按字母排序
2020/08/12 Javascript
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
使用python绘制温度变化雷达图
2019/10/18 Python
Pycharm修改python路径过程图解
2020/05/22 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
优秀班集体获奖感言
2014/02/03 职场文书
拆迁委托协议书
2014/09/15 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
交警失职检讨书
2015/01/26 职场文书
政府会议通知范文
2015/04/15 职场文书
对公司的意见和建议
2015/06/04 职场文书
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电