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 相关文章推荐
python使用any判断一个对象是否为空的方法
Nov 19 Python
python实现用于测试网站访问速率的方法
May 26 Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 Python
python fabric实现远程部署
Jan 05 Python
Python3处理HTTP请求的实例
May 10 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
解析python的局部变量和全局变量
Aug 15 Python
PyCharm 无法 import pandas 程序卡住的解决方式
Mar 09 Python
django序列化时使用外键的真实值操作
Jul 15 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 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使用qr生成二维码的示例分享
2014/01/20 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
Python的Django框架使用入门指引
2015/04/15 Python
python如何查看微信消息撤回
2018/11/27 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
CSS3 box-sizing属性
2009/04/17 HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
事业单位竞聘上岗实施方案
2014/03/28 职场文书
学生违反校规检讨书
2014/10/28 职场文书
财务人员个人工作总结
2015/02/27 职场文书
劳动保障事务所个人工作总结
2015/08/12 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL