• 使用Python自动发送邮件(群发,加密等)
  • 在工作中很多公司没有购买专业的OA系统,发工资条,发通知,有时很不方便,要么专人做这个事,一个一个发 ,太麻烦,耗费很多工时。这个程序只需要整理发送信息的excel就可以实现群发功能,还可以加密,大大缩减相关人员的工时。
# coding: utf-8
import tkinter as tk
from tkinter import filedialog
from datetime import datetime
import pandas as pd
import numpy as np
# import matplotlib.pyplot as plt
import os, calendar, time, copy, openpyxl, re, datetime
from openpyxl import load_workbook
import win32com.client, hashlib, logging, smtplib
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
# email 用于构建邮件内容
from email.header import Header
# 发送附件
from email.mime.application import MIMEApplication
# 发送多个部分
from email.mime.multipart import MIMEMultipart
# 专门发送文本的!MIMEText
from email.mime.text import MIMETextlogging.basicConfig(level=logging.DEBUG,format='%(asctime)s  line:%(lineno)d  %(levelname)s : %(message)s',datefmt=' %Y-%m-%d %H:%M:%S',filename='邮件发送程序报错日志.log',filemode='w')todayDate = datetime.datetime.now().strftime("%Y-%m-%d")
str_email = input('请输入发件人邮箱:')
password = input('请输入发件人邮箱密码:')
sheet_name = input('请输入发送内容的类型(例如:排班考勤,社保公积金,等等):')class Config():def __init__(self):# 发信方的信息:发信邮箱,QQ 邮箱授权码self.from_addr = '%s' % str_emailself.password = '%s' % password# 发信服务器self.smtp_server = 'smtp.exmail.qq.com'self.port = 465email_conf = Config()wd = tk.Tk()
wd.withdraw()print('请选择需要拆分的数据')
data_path = filedialog.askopenfilename()
print('请选择需要发送邮件的名单表')
send_path = filedialog.askopenfilename()pd_info = pd.read_excel(data_path, header=0)
title_names = [i for i in pd_info.columns.values]
all_index = list(set(i for i in pd_info[u'拆分项']))if u'工号\n(必填项)' in title_names:pd_data = pd.read_excel(data_path, index_col=1, header=1, converters={u'工号\n(必填项)': str})pd_data = pd_data.fillna(value='')pd_data.set_index(u'拆分项', drop=True, append=False, inplace=True)
elif u'员工编码' in title_names:pd_data = pd.read_excel(data_path, index_col=1, header=1, converters={u'员工编码': str})pd_data = pd_data.fillna(value='')pd_data.set_index(u'拆分项', drop=True, append=False, inplace=True)
elif u'工号' in title_names:pd_data = pd.read_excel(data_path, index_col=1, header=1, converters={u'工号': str})pd_data = pd_data.fillna(value='')pd_data.set_index(u'拆分项', drop=True, append=False, inplace=True)
elif u'证件号' in title_names:pd_data = pd.read_excel(data_path, index_col=1, header=1, converters={u'证件号': str})pd_data = pd_data.fillna(value='')pd_data.set_index(u'拆分项', drop=True, append=False, inplace=True)
else:pd_data = pd.read_excel(data_path, header=0)pd_data = pd_data.fillna(value='')
#     pd_data.set_index(u'拆分项', drop=True, append=False, inplace=True)try:pd_emails = pd.read_excel(send_path, sheet_name=u'邮箱配置', converters={u'邮件加密密码': str})pd_emails = pd_emails.fillna(value='')
#     pd_emails.set_index(u'拆分项', drop=True, append=False, inplace=True)
except:logging.info('读取邮件发送表中邮箱配置表失败')try:pd_msg = pd.read_excel(send_path, sheet_name=u'邮件正文配置')pd_msg = pd_msg.fillna(value='')
#     pd_msg.set_index(u'拆分项', drop=True, append=False, inplace=True)
except:logging.info('读取邮件发送表中邮箱配置表失败')# excel加密或更换密码
def pwd_xlsx(old_filename, new_filename, pwd_str, pw_str=''):''':param old_filename: 需要加密Excel, 绝对路径:param new_filename: 加密后的Excel,绝对路径:param pwd_str: 加密密码:param pw_str: 打开文件密码,默认无密码:return:无'''xcl = win32com.client.Dispatch("Excel.Application")# pw_str为打开密码, 若无 访问密码, 则设为 ''wb = xcl.Workbooks.Open(old_filename, False, False, None, pw_str)xcl.DisplayAlerts = False# 保存时可设置访问密码.wb.SaveAs(new_filename, None, pwd_str, '')xcl.Quit()os.remove(old_filename)# 邮件加密
def general_excel(data, department, sheet_name, pwd):excel_path = os.path.join(os.getcwd(), '%s.xlsx' % department)pwd_excel = os.path.join(os.getcwd(), '%s.xlsx' % (department + sheet_name + todayDate))writer = pd.ExcelWriter(excel_path)data.to_excel(writer, '%s' % sheet_name, index=False)writer.save()pwd_xlsx(excel_path, pwd_excel, pwd)try:os.remove(excel_path)except Exception as e:logging.info(e)return pwd_exceldef send_email(address: list, cc_addr: list, pwd_excel: list, msg:str, pwd:str):logging.info("  send_email   working......")# 邮件标题titletitle = "%s" % sheet_name# 邮件正文内容text = "%s" % msg + '\n' +  "您的附件密码为:" + pwd# # 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码# msg = MIMEText(msg, 'plain', 'utf-8')# 构建邮件体msg = MIMEMultipart()msg['From'] = email_conf.from_addrmsg['To'] = ','.join(address)msg['Cc'] = ','.join(cc_addr)msg['Subject'] = Header(title, 'utf-8')# 构建正文part_text = MIMEText(text)msg.attach(part_text)if len(pwd_excel) > 0:for i in pwd_excel:# 构建邮件附件part_attach = MIMEApplication(open(i, 'rb').read())  # 打开附件filename = i.split("\\")[-1]part_attach.add_header('Content-Disposition', 'attachment', filename=filename)  # 为附件命名msg.attach(part_attach)  # 添加附件time.sleep(2)# 开启发信服务,这里使用的是加密传输# server = smtplib.SMTP_SSL()server = smtplib.SMTP_SSL(host=email_conf.smtp_server)server.connect(email_conf.smtp_server, email_conf.port)try:# 登录发信邮箱5server.login(email_conf.from_addr, email_conf.password)# 发送邮件server.sendmail(email_conf.from_addr, address + cc_addr, msg.as_string())logging.info("邮件发送成功,发件人:%s 收件人:%s " % (email_conf.from_addr, address + cc_addr))print("邮件发送成功,发件人:%s 收件人:%s " % (email_conf.from_addr, address + cc_addr))except Exception as err:logging.info("邮件发送失败:%s" % (err))exit()finally:# 关闭服务器server.quit()for path in pwd_excel:os.remove(path)def get_emails(emails):if len(emails) > 5:new_emails = emails.replace(';', ',').replace(';', ',').replace('。', ',').replace(',', ',')email_list = new_emails.split(',')lt_emails = [i for i in email_list if len(i) > 15]return lt_emailselse:lt_emails = []return lt_emailsdef get_index(index):if len(index) >= 13:new_index = index.replace(';', ',').replace(';', ',').replace('。', ',').replace(',', ',')index_list = new_index.split(',')lt_index = [i for i in index_list if len(i) >= 1]return lt_indexelse:lt_index = []return lt_indexdef get_name(names):if len(names) >= 3:new_index = names.replace(';', ',').replace(';', ',').replace('。', ',').replace(',', ',').replace('、', ',')index_list = new_index.split(',')lt_name = [i for i in index_list if len(i) >= 1]return lt_nameelse:lt_name = []return lt_namefor item in all_index:try:pwd_excel = []lt_emails = []lt_cc_emails = []item_data = pd_data[pd_data[u'拆分项'] == item]item_email = pd_emails[pd_emails[u'拆分项'] == item]pwd = pd_emails[pd_emails[u'拆分项'] == item].iat[0, 3]msg = pd_msg[pd_msg[u'拆分项'] == item].iat[0, 1]for i, row in item_email.iterrows():try:emails = row[u'收件人邮箱']cc_emails = row[u'抄送人邮箱']sd_emails = get_emails(emails)sd_cc_emails = get_emails(cc_emails)if sd_emails:for em in sd_emails:if em not in lt_emails:lt_emails.append(em)if sd_cc_emails:for cc in sd_cc_emails:if cc not in lt_cc_emails:lt_cc_emails.append(cc)except Exception as e:logging.info(e)pwd_file = general_excel(item_data, str(item), u'%s' % sheet_name, pwd)pwd_excel.append(pwd_file)if len(pwd_excel) > 0:send_email(lt_emails, lt_cc_emails, pwd_excel, msg, pwd)else:passexcept Exception as e:logging.info(e)# break

自动邮件发送(群发,加密等)相关推荐

  1. 自动发送邮件的服务器,自动邮件发送_任何情况立刻通知你

    原标题:自动邮件发送_任何情况立刻通知你 Python自动邮件发送 在日常工作中,我们经常需要收发邮件,不知大家可曾想过,如果能够实现自动发送,那岂不是爽歪歪~ 就像跑图像检测的模型经常跑一两天,如果 ...

  2. Py自动化办公—Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送实战案例...

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 平阳歌舞新承宠,帘外春寒赐锦袍. ...

  3. python-基于yagmail库开发自动邮件发送程序

    目录: 前言: 一,准备工作; 1.安装第三方库 2.邮箱设置步骤 二,编写程序 1.发送单个邮件的程序 2.发送单个邮件的进阶程序 前言: 很多时候,我们发送网络邮件都需要进入邮箱网站或App,可能 ...

  4. python实现12306抢票以及自动邮件发送提醒付款

    #写在前面,这个程序我已经弄出来了,但是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹就是技术交流. 只做技术交流..... 嗯,程序结束后,自己还是得手动付款. 废话不多说,下面就直 ...

  5. DF、Png、Tableau转化HTML自动邮件发送

    参考文1|参考文2 一.Tableau仪表盘-->online 数据 --->HTML 1.Tableau Desktop 2.上传Tableau Online 注册账号(tableau ...

  6. javamail发送html正文文件_Python实现-生成测试报告amp;自动邮件发送

    之前单独介绍了生成测试报告和自动发送邮件,那么现在把两者整合到一起:生成测试报告后然后自动发送邮件,这里只是简单的整合实现功能,其实还可以优化的,先用吧,后面再慢慢优化 先看下目录,其实目录还是一样, ...

  7. python可以自动拆分表格吗_如何利用Python一键拆分表格并进行邮件发送~

    因为平时经常要将 一张表 拆成工作簿,拆完还要发给不同的对象,工作又使用outlook发邮件,所以本文调用outlook账号进行邮件的发送作为示例:在 一张表拆成多个sheet的基础上,修改了代码,可 ...

  8. 表格某一列不固定其余全固定_如何利用Python一键拆分表格并进行邮件发送~

    因为平时经常要将 一张表 拆成工作簿,拆完还要发给不同的对象,工作又使用outlook发邮件,所以本文调用outlook账号进行邮件的发送作为示例:在 一张表拆成多个sheet的基础上,修改了代码,可 ...

  9. SpringBoot 实现邮件发送功能

    1.知识点疏通 邮件再项目中经常会被用到,比如邮件发送通知,比如通过邮件注册,认证,找回密码,系统报警通知,报表信息等. 接下来先了解一下邮件协议. 1.1 SMTP.POP.IMAP4协议 SMIP ...

最新文章

  1. linux孤立cpu,Linux 抛弃旧款 CPU,一下子少 50 万行代码
  2. 单片机利用蜂鸣器如何输出音乐
  3. DTO数据传输对象详解
  4. 200718C语言及C程序概念
  5. 无线移动通信—文章导航
  6. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(9)签到题4题
  7. C# 八种方案打印PDF文档
  8. 电机与电力拖动系统的仿真技术matlab/simulink(1)
  9. DMP文件的导入,导出
  10. Oracle9i的1467错误
  11. 异步加载loading
  12. 集大计算机与科学的研究生,明天,我是研究生丨感谢集大,我遇见了更好的自己...
  13. 2023前端面试题集(持续更新中~),祝大家早日拿到心仪offer
  14. 服务器cpu怎么选,E5-2670 or i9-9900K
  15. laravel-pay支付接入流程
  16. QT网格线的颜色设置
  17. 【摄影】如何利用手机拍摄好的摄影作品
  18. k8s部署zookeeper集群 运行 ZooKeeper, 一个 CP 分布式系统
  19. 使用ROS开源代码和激光雷达进行小车的定位导航
  20. 腾讯企业邮箱单点登录 php,新版QQ企业邮箱接口PHP SDK

热门文章

  1. 用php打出2020年是庚子鼠年,关于2020庚子鼠年,你应该知道的事儿
  2. 不使用form表单提交方式提交文件
  3. 【无标题】180-187笔记1月19日李游精品前端课程笔记
  4. 卖水果如何通过闲鱼引流?如何利用好闲鱼庞大的流量池?
  5. Highlight出包含特定文本的单元格-search函数与条件格式的应用实例
  6. day1--遗忘的重要性-from nature 2019
  7. handlebar基本使用
  8. 微服务8 Feign远程调用
  9. win7桌面的计算机在哪里,win7桌面小工具在哪里
  10. windows服务器2012,ftp用File zilla连接不上是怎么回事???