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程序运行效率的6个方法
Mar 31 Python
Python中的异常处理简明介绍
Apr 13 Python
django1.11.1 models 数据库同步方法
May 30 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
Aug 16 Python
python 切换root 执行命令的方法
Jan 19 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
python 实现多线程下载视频的代码
Nov 15 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
python字典和json.dumps()的遇到的坑分析
Mar 11 Python
序列化Python对象的方法
Aug 01 Python
用python写一个带有gui界面的密码生成器
Nov 06 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 日常开发小技巧
2009/09/23 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
jQuery实用函数用法总结
2014/08/29 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
如何动态加载外部Javascript文件
2015/12/02 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
jQuery联动日历的实例解析
2016/12/02 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
德购商城:德国进口直邮商城
2017/06/13 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
大学生自我鉴定
2013/12/08 职场文书
环保倡议书范文
2014/05/12 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技