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的Django框架与认证系统整合的方法
Jul 24 Python
python中input()与raw_input()的区别分析
Feb 27 Python
Python环境变量设置方法
Aug 28 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
python逆序打印各位数字的方法
Jun 25 Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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的FTP学习(一)
2006/10/09 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP生成自定义长度随机字符串的函数分享
2014/05/04 PHP
javascript smipleChart 简单图标类
2011/01/12 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
JavaScript实现输入框(密码框)出现提示语
2016/01/12 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
react-router实现按需加载
2017/05/09 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
2018/03/06 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
Django中处理出错页面的方法
2015/07/15 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
美国庭院家具购物网站:AlphaMarts
2019/04/10 全球购物
父母对孩子说的话
2014/04/12 职场文书
大学生英语演讲稿
2014/04/24 职场文书
环保宣传标语
2014/06/12 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
2014年教师党员自我评价范文
2014/09/22 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
解除同居协议书
2015/01/29 职场文书
个人党性分析总结
2015/03/05 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
SQL Server表分区删除详情
2021/10/16 SQL Server
vue实现Toast组件轻提示
2022/04/10 Vue.js