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中常用检测字符串相关函数汇总
Apr 15 Python
python返回昨天日期的方法
May 13 Python
python将.ppm格式图片转换成.jpg格式文件的方法
Oct 27 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
Jan 29 Python
Python+selenium点击网页上指定坐标的实例
Jul 05 Python
python绘制无向图度分布曲线示例
Nov 22 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
python实现吃苹果小游戏
Mar 21 Python
ipython jupyter notebook中显示图像和数学公式实例
Apr 15 Python
Python中zip函数如何使用
Jun 04 Python
如何通过安装HomeBrew来安装Python3
Dec 23 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
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
JavaScript中的数值范围介绍
2014/12/29 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python cx_freeze打包工具处理问题思路及解决办法
2016/02/13 Python
浅谈python中的实例方法、类方法和静态方法
2017/02/17 Python
python Celery定时任务的示例
2018/03/13 Python
python 文件转成16进制数组的实例
2018/07/09 Python
python中join()方法介绍
2018/10/11 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
2020/07/20 Python
CSS3中几个新增加的盒模型属性使用教程
2016/03/01 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
教师学习培训邀请函
2014/02/04 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
《金子》教学反思
2014/04/13 职场文书
致共产党员倡议书
2014/04/16 职场文书
争做文明公民倡议书
2014/08/29 职场文书
2014年维修电工工作总结
2014/11/20 职场文书