新版发送邮件的脚本:批量发邮件 6.0
CN
字符集统计:
“gbk”、“GBK”、“gb2312”、“GB2312”、“iso-8859-1”、“gib5”、“GIB5”、“us-ascii”、“utf-8”、“UTF-8”、“ascii”、“ASCII”
gbk、GBK、gb2312、GB2312、iso-8859-1、gib5、GIB5、us-ascii、utf-8、UTF-8、ascii、ASCII

行注意事项:
1、读取文件源码操作:根据实况而定,一般情况下eml文件定义统一,代码在运行时,若出现文件乱码,或者报错,请查看该eml文件的from、to、正文、附件、和源码(是否有:Content-Type: text/plain; charset=utf-8)
2、判断附件操作:附件可以根据自己的需求是否读取分析,一般情况下不建议读取附件,防止发送结果有影响,仅读取附件名称即可。
3、时间操作:时间获取分别有两种方式,可以根据自己的喜好而定。
4、所用的框架库,确保自己安装的pycharm装有第三方支持库:email、locale、smtplib、os、sys、time、shutil、importli。
5、运行脚本的 rootdir 指定发送样本库,确保样本库中全是eml文件,不能有文件夹、txt文件、ffs_db文件等。

#   -*- encoding=utf-8 -*-
import email
import locale
import smtplib
import os
import sys
import time
import shutil
from email.mime.text import MIMEText
from email.header import Header
import importlibx = 0  # 可以发送的邮件数量
z = 0  # 未能发送的邮件数量
c = 0  # 解析到乱码内容的邮件
c_txt = []
d = 0  # 没有字符集或者是不能解析字符集的邮件
d_txt = []
e = 0  # 主要针对的是严重的邮件解析异常
e_txt = []
g = 0  # 针对不能识别到编码格式的邮件
g_txt = []
error_eml = 0  # 针对最后的字符集,选择跳出
error_eml_txt = []
attError = []  # 针对附件文件提取时格式的问题或是提取失败做捕获'''时间操作'''
def set_timed():# timed = time.asctime(time.localtime((time.time())))# print(timed)locale.setlocale(locale.LC_ALL,'en')locale.setlocale(locale.LC_CTYPE,'chinese')zhou = time.strftime('%w',time.localtime(time.time()))if zhou == "0":zhou = "星期日"elif zhou == "1":zhou = "星期日"elif zhou == "2":zhou = "星期日"elif zhou == "3":zhou = "星期日"elif zhou == "4":zhou = "星期日"elif zhou == "5":zhou = "星期日"elif zhou == "6":zhou = "星期日"else:zhou = " "timed = time.strftime('%z %Y年%m月%d日 %H:%M:%S %p ',time.localtime(time.time()))return timed+zhoudef runPri_files(path):global x, par# global yglobal zglobal cglobal c_txtglobal dglobal d_txtglobal eglobal e_txtglobal gglobal g_txtglobal error_emlglobal error_eml_txtglobal attErrorlsdir = os.listdir(path)ok_email = "\\发送成功目录\\"dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i))]if dirs:for i in dirs:runPri_files(os.path.join(path, i))files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))]for f in files:print("\033[32m start  \t\t\t >> *************************** <<\033[0m")eml_file = os.path.join(path, f) # 文件的所在目录print(x, "\t文件目录", f, "    ", eml_file)eml_name = eml_file.split("\\")[::-1][0] # 文件名print("文件名:  ", eml_name)new_dir = ok_email + str(eml_name) # 发送成功的文件目录fp = open(eml_file, "r")try:msg = email.message_from_file(fp)except UnicodeDecodeError:print("\033[31m \n codec can't decode byte 0xf3 in position 16: ordinal not in range(128)\n邮件中包含乱码,跳出继续》》》》》》》》》》》》\033[0m")c = c + 1c_txt.append(eml_name)continuesubject = msg.get("Subject") # subjectprint("subject:  ", subject)content_type = msg.get("Content-Type") # content_typeprint("content_type:  ", content_type)charset_all = str(msg.get_charsets());print("charset_all:  ", charset_all)charset_1 = str(msg.get_charsets()[0]);print("charset_1:  ", charset_1)''' 字符集判断(已作废)try:charset = content_type.rsplit("=", 1)[::-1][0]except AttributeError:print("\033[31m AttributeError: 'NoneType' object has no attribute 'rsplit' \033[0m")d = d + 1d_txt.append(eml_name)continue'''try:h = email.header.Header(subject)except UnicodeDecodeError:print("\033[31m \n'ascii' codec can't decode byte 0xf3 in position 16: ordinal not in range(128)\n邮件中包含乱码,跳出继续》》》》》》》》》》》》\033[0m")c = c + 1c_txt.append(eml_name)continuetry:dh = email.header.decode_header(h)except email.errors.HeaderParseError:print("\033[31m 严重的邮件异常(email.errors.HeaderParseError),已经记录\n\t\tpython的base64的编码和本邮件的字符集出现冲突或者是无法解析报错!!! \033[0m")e = e + 1e_txt.append(eml_name)continuedh_charset = dh[0][1]print("dh_charset  ",dh_charset)''' 定位字符集坐标 '''if charset_1 == "None":charset_2 = str(msg.get_charsets()[1])print(" charset_2: ",charset_2)if charset_2 == "None":charset_3 = str(msg.get_charsets()[2])print(" charset_3: ", charset_3)if charset_3 == "None":print("\33[31m 错误递出.. \33[0m")continueelif charset_3 == "gbk" or charset_3 == "GBK" or charset_3 == "\"gbk\"" or charset_3 == "\"GBK\"":ok_charset = str(charset_3)print(" 已将字符集赋值到新变量... ")elif charset_3 == "iso-8859-1" or charset_3 == "\"iso-8859-1\"":ok_charset = str(charset_3)print(" 已将字符集赋值到新变量... ")elif charset_3 == "gib5" or charset_3 == "GIB5" or charset_3 == "\"gib5\"" or charset_3 == "\"GIB5\"":ok_charset = str(charset_3)print(" 已将字符集赋值到新变量... ")elif charset_3 == "us-ascii" or charset_3 == "\"us-ascii\"":ok_charset = str(charset_3)print(" 已将字符集赋值到新变量... ")elif charset_3 == "utf-8" or charset_3 == "UTF-8" or charset_3 == "\"utf-8\"" or charset_3 == "\"UTF-8\"" or charset_3 == "utf8" or charset_3 == "UTF8" or charset_3 == "\"utf8\"" or charset_3 == "\"UTF8\"":ok_charset = str(charset_3)print(" 已将字符集赋值到新变量... ")elif charset_3 == "ascii" or charset_3 == "ASCII" or charset_3 == "\"ascii\"" or charset_3 == "\"ASCII\"":ok_charset = str(charset_3)print(" 已将字符集赋值到新变量... ")elif charset_3 == "gb2312" or charset_3 == "GB2312" or charset_3 == "\"gb2312\"" or charset_3 == "\"GB2312\"":ok_charset = str(charset_3)print(" 已将字符集赋值到新变量... ")else:ok_charset = "NULL"print("\33[31m 字符集错误.. \33[0m")elif charset_2 == "gbk" or charset_2 == "GBK" or charset_2 == "\"gbk\"" or charset_2 == "\"GBK\"":ok_charset = str(charset_2)print(" 已将字符集赋值到新变量... ")elif charset_2 == "iso-8859-1" or charset_2 == "\"iso-8859-1\"":ok_charset = str(charset_2)print(" 已将字符集赋值到新变量... ")elif charset_2 == "gib5" or charset_2 == "GIB5" or charset_2 == "\"gib5\"" or charset_2 == "\"GIB5\"":ok_charset = str(charset_2)print(" 已将字符集赋值到新变量... ")elif charset_2 == "us-ascii" or charset_2 == "\"us-ascii\"":ok_charset = str(charset_2)print(" 已将字符集赋值到新变量... ")elif charset_2 == "utf-8" or charset_2 == "UTF-8" or charset_2 == "\"utf-8\"" or charset_2 == "\"UTF-8\"" or charset_2 == "utf8" or charset_2 == "UTF8" or charset_2 == "\"utf8\"" or charset_2 == "\"UTF8\"":ok_charset = str(charset_2)print(" 已将字符集赋值到新变量... ")elif charset_2 == "ascii" or charset_2 == "ASCII" or charset_2 == "\"ascii\"" or charset_2 == "\"ASCII\"":ok_charset = str(charset_2)print(" 已将字符集赋值到新变量... ")elif charset_2 == "gb2312" or charset_2 == "GB2312" or charset_2 == "\"gb2312\"" or charset_2 == "\"GB2312\"":ok_charset = str(charset_2)print(" 已将字符集赋值到新变量... ")else:ok_charset = "NULL"print("\33[31m 字符集错误.. \33[0m")elif charset_1 == "gbk" or charset_1 == "GBK" or charset_1 == "\"gbk\"" or charset_1 == "\"GBK\"":ok_charset = str(charset_1)print(" 已将字符集赋值到新变量... ")elif charset_1 == "iso-8859-1" or charset_1 == "\"iso-8859-1\"":ok_charset = str(charset_1)print(" 已将字符集赋值到新变量... ")elif charset_1 == "gib5" or charset_1 == "GIB5" or charset_1 == "\"gib5\"" or charset_1 == "\"GIB5\"":ok_charset = str(charset_1)print(" 已将字符集赋值到新变量... ")elif charset_1 == "us-ascii" or charset_1 == "\"us-ascii\"":ok_charset = str(charset_1)print(" 已将字符集赋值到新变量... ")elif charset_1 == "utf-8" or charset_1 == "UTF-8" or charset_1 == "\"utf-8\"" or charset_1 == "\"UTF-8\"" or charset_1 == "utf8" or charset_1 == "UTF8" or charset_1 == "\"utf8\"" or charset_1 == "\"UTF8\"":ok_charset = str(charset_1)print(" 已将字符集赋值到新变量... ")elif charset_1 == "ascii" or charset_1 == "ASCII" or charset_1 == "\"ascii\"" or charset_1 == "\"ASCII\"":ok_charset = str(charset_1)print(" 已将字符集赋值到新变量... ")elif charset_1 == "gb2312" or charset_1 == "GB2312" or charset_1 == "\"gb2312\"" or charset_1 == "\"GB2312\"":ok_charset = str(charset_1)print(" 已将字符集赋值到新变量... ")else:ok_charset = "NULL"print("\33[31m 字符集错误.. \33[0m")print("字符集最终确定:  ",ok_charset,"  文档解析")from_name = email.utils.parseaddr(msg.get("from_name"))print("from_name:  ",from_name)to_name = email.utils.parseaddr(msg.get("to"))print("to_name:  ",to_name)'''判断附件操作'''for par in msg.walk():if not par.is_multipart():name = par.get_param("name")if name:# h = email.Header.Header(name)try:h = email.header.Header(name)except UnicodeDecodeError:print("\033[31m\n'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)\n解析邮件内容出现乱码情况,跳出继续》》》》》》》》》》》》》》》》\033[0m")c = c + 1c_txt.append(eml_name)continueexcept AttributeError:print("\033[31m \n AttributeError: 'tuple' object has no attribute 'decode'   解析过程中提取附件为空,格式有误提取失败")attError.append(str(eml_name) + " 'tuple' object has no attribute 'decode'")continuedh = email.header.decode_header(h)fname = dh[0][0]# print('附件名::  ', fname)data = par.get_payload(decode=False)try:f = open(fname, 'wb')  # 注意一定要用wb来打开文件,因为附件一般都是二进制文件print("fname::  ", fname)except:f = open('zzzzzzzz', 'wb')f.writelines(data)f.close()''' 定位发件人和收件人 '''email_smtpserver = 'IP'email_user = '发件人账号'email_password = '发件人密码'email_sender = '发件人账号'email_receive = '收件人账号'email_subject = str(eml_name) + " *** " + set_timed()email_content = par.get_payload(decode=False)'''通过解析的字符集发送邮件'''if ok_charset == "gbk" or ok_charset == "GBK" or ok_charset == "\"gbk\"" or ok_charset == "\"GBK\"" or ok_charset == "iso-8859-1" or ok_charset == "\"iso-8859-1\"" or ok_charset == "us-ascii" or ok_charset == "\"us-ascii\"" or ok_charset == "utf-8" or ok_charset == "UTF-8" or ok_charset == "\"utf-8\"" or ok_charset == "\"UTF-8\"" or ok_charset == "utf8" or ok_charset == "UTF8" or ok_charset == "\"utf8\"" or ok_charset == "\"UTF8\"" or ok_charset == "ascii" or ok_charset == "ASCII" or ok_charset == "\"ascii\"" or ok_charset == "\"ASCII\"" or ok_charset == "gb2312" or ok_charset == "GB2312" or ok_charset == "\"gb2312\"" or ok_charset == "\"GB2312\"":print(" >>  定位字符集:", ok_charset, " <<")msg = MIMEText(email_content, 'html', ok_charset)msg['Subject'] = Header(email_subject, 'gbk')msg['From'] = '发件人账号'msg['To'] = '收件人账号'smtp = smtplib.SMTP_SSL(email_smtpserver, 端口)smtp.ehlo(email_smtpserver)smtp.login(user=email_user, password=email_password)smtp.sendmail(email_sender, email_receive, msg.as_string())smtp.quit()''' 程序运行日志 '''w_character = open('\\ 日志存在目录 \\', 'a')w_character.writelines(str(x)+"  START*****************************************\n")log_eml_name = str(set_timed()) + " : " + str(eml_name)w_character.writelines(log_eml_name+"\n")log_eml_file = str(set_timed()) + " : " + str(eml_file)w_character.writelines(log_eml_file+"\n")log_subject = str(set_timed()) + " : " + str(subject)w_character.writelines(log_subject+"\n")log_ok_charset = str(set_timed()) + " : " + str(ok_charset)w_character.writelines(log_ok_charset+"\n")log_new_dir = str(set_timed()) + " : " + str(new_dir)w_character.writelines(log_new_dir+"\n")w_character.writelines("END*****************************************\n\n")print("邮件原路径:  ", eml_file)print("发送成功后备份:  ", new_dir)shutil.copyfile(eml_file, new_dir)time.sleep(0.5)x = x + 1print("\033[32m", '*' * 20, "end", '*' * 20, x + z, '*' * 20, "\033[0m")time.sleep(2)elif ok_charset == "NULL":print(" >>  字符集定位为NULL不能通过: NULL <<")''' 程序运行日志 '''w_character = open('\\ 日志存在目录 \\', 'a')w_character.writelines(str(x)+"  START*****************************************\n")w_character.writelines(" >>  字符集定位为NULL不能通过: ERROR <<")log_eml_name = str(set_timed()) + " : " + str(eml_name)w_character.writelines(log_eml_name+"\n")log_eml_file = str(set_timed()) + " : " + str(eml_file)w_character.writelines(log_eml_file+"\n")log_subject = str(set_timed()) + " : " + str(subject)w_character.writelines(log_subject+"\n")log_ok_charset = str(set_timed()) + " : " + str(ok_charset)w_character.writelines(log_ok_charset+"\n")log_new_dir = str(set_timed()) + " : " + str(new_dir)w_character.writelines(log_new_dir+"\n")w_character.writelines("END*****************************************\n\n")z = z + 1print("\033[32m", '*' * 20, "end", '*' * 20 , x+z , '*' * 20, "\033[0m")time.sleep(2)else:print(" >>  最后定位异常,即将跳出: ERROR <<")''' 程序运行日志 '''w_character = open('\\ 日志存在目录 \\', 'a')w_character.writelines(str(x)+"  START*****************************************\n")w_character.writelines(" >>  最后定位异常,即将跳出: ERROR <<")log_eml_name = str(set_timed()) + " : " + str(eml_name)w_character.writelines(log_eml_name+"\n")log_eml_file = str(set_timed()) + " : " + str(eml_file)w_character.writelines(log_eml_file+"\n")log_subject = str(set_timed()) + " : " + str(subject)w_character.writelines(log_subject+"\n")log_ok_charset = str(set_timed()) + " : " + str(ok_charset)w_character.writelines(log_ok_charset+"\n")log_new_dir = str(set_timed()) + " : " + str(new_dir)w_character.writelines(log_new_dir+"\n")w_character.writelines("END*****************************************\n\n")z = z + 1print("\033[32m", '*' * 20, "end", '*' * 20 , x+z , '*' * 20, "\033[0m")time.sleep(2)print("\033[33m发送至对方的邮件 : ", x, " 封!\033[0m")print("\033[33m不能发送的邮件 : ", z, " 封!\033[0m")print("\033[33m共扫描的邮件 : ",x+z ," 封!\033[0m")print("\033[33m不能解析字符集或者没有字符集标识的邮件: ", d, " 封!\033[0m")print("\033[33m如下: \n", d_txt, "\033[0m")print("\033[33m乱码文件: ", c, " 封!\033[0m")print("\033[33m如下: \n", c_txt, "\033[0m")print("\033[33m出现编码冲突的邮件: ", e, " 封\033[0m")print("\033[33m如下: ", e_txt, "\033[0m")time.sleep(0.5)sys.exit()if __name__ == '__main__':rootdir = "\\ .eml 文件存在目录 \\"runPri_files(rootdir)

将 .eml 后缀的文件以邮件形式发送相关推荐

  1. 【ABAP系列】SAP ABAP模块-任意report作为附件以邮件形式发送

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP模块-任意rep ...

  2. Word处理控件Aspose.Words功能演示:在Java中将Word文档以邮件形式发送

    在大多数情况下,电子邮件按照特定模板以格式正确的布局发送.但是,各种电子邮件编辑器不提供增强的格式选项.在这种情况下,可以在Word文档中创建一条消息,并将其用作电子邮件正文.在本文中,将学习如何使用 ...

  3. 使用phpword实现php生成word文件同时以邮件的形式发送word附件

    新版的phpword支持中文不用再修改插件代码 应客户需求需要在用户创建简历后把简历以附件的形式发送到其指定邮箱,所有想到 先把数据存储到数据库,然后把数据读取出来处理后保存为word文档,然后在以附 ...

  4. 处理乱码文件,邮件,应用程序。。。。。。

    当我们浏览网页.打开文档或邮件,运行软件时,经常会看到乱码,通常是由于源文件编码,Windows不 能正确识别造成的的,也可能是其他原因.乱码给我们带来了太多的烦恼,为了帮助大家彻底摆脱乱码 ,下面我 ...

  5. linux下后缀为so的文件怎么打开,linux中.so后缀的文件怎么使用啊

    参考1:http://zhidao.baidu.com/link?url=Zx0t6DMIpPvMNhIKZEudJOmDR4MXcr-B5_KbELCIoNz1jnJ7A_--J-qIaiVkYIi ...

  6. python应用系列教程——python使用smtp协议发送邮件:html文本邮件、图片邮件、文件附件邮件

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python使用smtp协议发送电子邮件.包含发送html文本邮件.包含图片附件的邮件,包含其他文件附件的邮件.可设置邮件的收发人,主题,内容 ...

  7. SQLSERVER 数据库邮件发送以表格形式发送(存储过程内容发邮件)

    SQLSERVER 数据库邮件发送以表格形式发送 直接开始不哔哔! 一.数据库配置(以图文展现) 1.以sa或者windows身份登录数据库 2.选择数据库管理下面的数据库邮件: 3.选择数据库邮件左 ...

  8. lz zstd 后缀的文件解压以及压缩应用

                                                  lz zstd 后缀的文件解压以及压缩应用 Linux的复杂可能在压缩文件以及解压缩方面有所体现,Linux ...

  9. python使用正则表达式寻找具有特定后缀的文件

    python使用正则表达式寻找具有特定后缀的文件 # python使用正则表达式寻找具有特定后缀的文件 # import library import re# list of different ty ...

最新文章

  1. 有5个学生,4门课程,用子函数的方法显示平均分最高的学生的所有成绩
  2. 老生常谈:文字常量区的那点事
  3. MongoDB sharding迁移那些事(一)
  4. Error: ENOSPC: System limit for number of file watchers reached, watch'所在文件路径'
  5. 个人笔记本上win10+yolov3+python+tensorflow+keras训练自己的识别模型
  6. 数据中心行业哪个证书含金量最高?对职业最有帮助?
  7. 二、CSS知识总结(上篇)
  8. 【NetApp】ROOT VOLUME NOT WORKING PROPERLY: RECOVERY REQUIRED
  9. JVM 内存示意图(内存结构图/内存解析图)
  10. .net开发常用工具备忘录
  11. 四张照片合成一张怎么弄_我在朋友圈发了这张照片后,所有人都求问教程
  12. 数据结构和算法——八种常用的排序算法----交换排序(冒泡排序和快速排序)
  13. 事半功倍,在JCreator中查询java API
  14. WebService框架简介
  15. 服务器故障与主板维修,服务器主板故障
  16. 使用Yomail的时候出现的错误解决方案
  17. 计算机网络谢希仁(1)
  18. hdu 4417 Super Mario
  19. foxmail发生RCPT错误
  20. 服务器如何修改vt,云服务器vt

热门文章

  1. CorelDRAW2020工作室版下载及新增功能介绍
  2. CTR 预测理论(九):Boosting 集成算法中 Adaboost, GBDT 与 XGBoost 的区别
  3. 80老翁谈人生(11):高考查分的往事
  4. YunOS@Home落地,智能家居离照顾衣食起居还有多远
  5. 《笨办法学Python》——习题5
  6. 递归神经网络之父讲述现代人工智能简史
  7. 【STM32】GPIO详细介绍
  8. leetcode刷题总结(主要是各个博主的总结链接)
  9. “变态”的JavaScript 发明人--布兰登·艾奇
  10. pip豆瓣源安装方法