python给指定csv表格中的联系人群发邮件(带附件的邮件)


Posted in Python onDecember 31, 2019

以下为使用python给指定路径的csv表格中的联系人群发带附件的邮件(csv表格的第一列为联系人姓名,第二列为联系人邮箱账号)的代码,详情见注释。

import time
import csv #用于读取收件人列表
import smtplib #用于发送邮件
from email.header import Header #Header用于构造邮件头
from email.mime.text import MIMEText #MIMEText用于构造文本邮件
from email.mime.image import MIMEImage #MIMEImage用于构造图片邮件
from email.mime.multipart import MIMEMultipart #MIMEMultipart用于构造复杂邮件(带附件的邮件)
#收件人信息创建
def receive_info():
  # 可以是一个列表,支持多个邮件地址同时发送,测试改成自己的邮箱地址
  to_addrs = []
  #to = input('请输入收件人邮箱:')
  with open('收件人邮箱.csv','r',encoding='utf-8') as f:
    reader = csv.reader(f)
    try:
      for row in reader:
        to_addrs.append(row[1])
      print('收件人信息读取完毕!')
      time.sleep(1)
      print('以下为收件人邮箱列表:\n',to_addrs)
      receivers = ','.join(to_addrs)
    except Exception as e:
      print('读取收件人信息失败!原因如下:')
      print(e)
  return to_addrs,receivers
#发件人信息创建
def send_info():
  print('开始输入发件人信息...')
  time.sleep(1)
  try:
    sender_mail = input('请输入发件人邮箱:')
    sender_pass = input('请输入发件人邮箱授权码(不要加空格):')#同样是乱打的
    smtp_server = 'smtp.qq.com' #邮箱服务器
    time.sleep(1)
    print('发件人信息录入成功!')
  except Exception as e:
    print('发件人信息输入失败!以下为失败原因:')
    print(e)
  return sender_mail,sender_pass,smtp_server
#构造邮件
def mail_body(to):
  # 设置总的邮件体对象,对象类型为mixed,可以构造带附件的复杂邮件
  msg_root = MIMEMultipart('mixed')
  # 邮件添加的头尾信息等
  msg_root['From'] = Header(sender_mail)
  msg_root['To'] = Header(receivers) #Header的参数不能为列表
  # 邮件的主题,显示在接收邮件的预览页面
  subject = 'python sendemail test successful'
  msg_root['subject'] = Header(subject, 'utf-8') #第一个参数为邮件主题,第二个参数为编码方式
  # 构造正文文本内容
  text_info = 'hello world'
  text_sub = MIMEText(text_info, 'plain', 'utf-8') #第一个参数为文本内容,第二个参数为格式(‘plain'为纯文本,第三个参数为编码方式)
  msg_root.attach(text_sub)
  # 构造超文本附件
  url = "https://blog.csdn.net/m0_45654959"
  html_info = """
  <p>点击以下链接,你会去向一个更大的世界</p>
  <p><a href="%s" rel="external nofollow" >click me</a></p>
  <p>i am very galsses for you</p>
  """% url
  html_sub = MIMEText(html_info, 'html', 'utf-8') #超文本邮件体
  # 如果不加下边这行代码的话,上边的文本是不会正常显示的,会把超文本的内容当做文本显示
  html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"' #将超文本邮件体作为附件
  # 把构造的内容(超文本附件)写到邮件体中
  msg_root.attach(html_sub)
  # 构造图片附件
  image_file = open(r'D:\Anaconda\programm_my\little_programm\test.gif', 'rb').read()
  image = MIMEImage(image_file) #图片邮件体
  image.add_header('Content-ID', '<image1>') #将图片在邮件中的目录ID设为<image1>,只有一张图片时此句可以省略
  # 如果不加下边这行代码的话,会在收件方方面显示乱码的bin文件,下载之后也不能正常打开
  image["Content-Disposition"] = 'attachment; filename="hua_ji.gif"'
  #把构造的内容(图片附件)写入邮件体当中
  msg_root.attach(image)
  # 构造文本附件(base64数据流)
  txt_file = open(r'D:\Anaconda\programm_my\little_programm\hello_word.txt', 'rb').read()
  txt = MIMEText(txt_file, 'base64', 'utf-8')
  txt["Content-Type"] = 'application/octet-stream' #Content-Type默认为application/octet-stream,此句可以不加
  #以下代码可以重命名附件为hello_world.txt 
  txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')
  #把构造的内容(文本附件)写入邮件体当中
  msg_root.attach(txt)
  return msg_root
#邮件发送函数
def send_mail():
  time.sleep(1)
  print('开始发送邮件...')
  try:
    server =smtplib.SMTP_SSL(smtp_server)#QQ邮箱采用SSL方式加密;仅在python3.7中才需要给smtplib.SMPT_SSL()方法传入发件人邮箱地址参数
    server.connect(smtp_server,465)
    server.login(sender_mail, sender_pass)
    server.sendmail(sender_mail, to_addrs, msg.as_string())
    server.quit()
    print('恭喜你!邮件发送成功!')
  except Exception as e:
    print('邮件发送失败!以下为失败原因:')
    print(e)
#主函数:
def main():
  send_mail()
if __name__ == '__main__':
  #初始化收件人、发件人、邮件体数据
  to_addrs,receivers = receive_info()
  sender_mail,sender_pass,smtp_server = send_info()
  msg = mail_body(to_addrs)
  #调用主函数,发送邮件
  main()

总结

以上所述是小编给大家介绍的python给指定csv表格中的联系人群发邮件,希望对大家有所帮助!

Python 相关文章推荐
python中 ? : 三元表达式的使用介绍
Oct 09 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
详解python中的Turtle函数库
Nov 19 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
Python return语句如何实现结果返回调用
Oct 15 Python
Python 多进程、多线程效率对比
Nov 19 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 Python
python中tkinter复选框使用操作
Nov 11 Python
Python面向对象封装操作案例详解
Dec 31 #Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 #Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 #Python
Pycharm最新激活码2019(推荐)
Dec 31 #Python
python ftplib模块使用代码实例
Dec 31 #Python
深入了解如何基于Python读写Kafka
Dec 31 #Python
Python面向对象之继承原理与用法案例分析
Dec 31 #Python
You might like
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
实践Vim配置python开发环境
2018/07/02 Python
python中scikit-learn机器代码实例
2018/08/05 Python
Form表单及django的form表单的补充
2019/07/25 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
中学教师岗位职责
2013/11/26 职场文书
小学毕业感言50字
2014/02/16 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
场地使用证明模板
2014/10/25 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技