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操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
解决Django migrate No changes detected 不能创建表的问题
May 27 Python
Python骚操作之动态定义函数
Mar 26 Python
Python netmiko模块的使用
Feb 14 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
pycharm实现在子类中添加一个父类没有的属性
Mar 12 Python
pyinstaller打包找不到文件的问题解决
Apr 15 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
Jul 01 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 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
Memcache 在PHP中的使用技巧
2010/02/08 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
php中的登陆login实例代码
2016/06/20 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
jQueryUI Sortable 应用Demo(分享)
2017/09/07 jQuery
深入理解Vue nextTick 机制
2018/04/28 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
Python translator使用实例
2008/09/06 Python
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
Python常用随机数与随机字符串方法实例
2015/04/09 Python
不要用强制方法杀掉python线程
2017/02/26 Python
python中字符串的操作方法大全
2018/06/03 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
django数据库自动重连的方法实例
2019/07/21 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
pycharm2020.2 配置使用的方法详解
2020/09/16 Python
python 进程池pool使用详解
2020/10/15 Python
python递归函数用法详解
2020/10/26 Python
医药类个人求职的自我评价
2014/02/12 职场文书
大学生个人自荐信
2014/02/24 职场文书
财务务虚会发言材料
2014/10/20 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python