新版发送邮件的脚本 批量发邮件 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 importlib x 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 zhou def runPri_files(path): global x, par # global y global z global c global c_txt global d global d_txt global e global e_txt global g global g_txt global error_eml global error_eml_txt global attError lsdir 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( 33[32m start ttt *************************** 33[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( 33[31m n codec can t decode byte 0xf3 in position 16: ordinal not in range(128)n邮件中包含乱码 跳出继续》》》》》》》》》》》》 33[0m ) c c 1 c_txt.append(eml_name) continue subject msg.get( Subject ) # subject print( subject: , subject) content_type msg.get( Content-Type ) # content_type print( 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( 33[31m AttributeError: NoneType object has no attribute rsplit 33[0m ) d d 1 d_txt.append(eml_name) continue try: h email.header.Header(subject) except UnicodeDecodeError: print( 33[31m n ascii codec can t decode byte 0xf3 in position 16: ordinal not in range(128)n邮件中包含乱码 跳出继续》》》》》》》》》》》》 33[0m ) c c 1 c_txt.append(eml_name) continue try: dh email.header.decode_header(h) except email.errors.HeaderParseError: print( 33[31m 严重的邮件异常(email.errors.HeaderParseError) 已经记录nttpython的base64的编码和本邮件的字符集出现冲突或者是无法解析报错!!! 33[0m ) e e 1 e_txt.append(eml_name) continue dh_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 ) continue elif 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( 33[31mn ascii codec can t decode byte 0xd0 in position 0: ordinal not in range(128)n解析邮件内容出现乱码情况 跳出继续》》》》》》》》》》》》》》》》 33[0m ) c c 1 c_txt.append(eml_name) continue except AttributeError: print( 33[31m n AttributeError: tuple object has no attribute decode 解析过程中提取附件为空 格式有误提取失败 ) attError.append(str(eml_name) tuple object has no attribute decode ) continue dh 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*****************************************nn ) print( 邮件原路径 , eml_file) print( 发送成功后备份 , new_dir) shutil.copyfile(eml_file, new_dir) time.sleep(0.5) x x 1 print( 33[32m , * * 20, end , * * 20, x z, * * 20, 33[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*****************************************nn ) z z 1 print( 33[32m , * * 20, end , * * 20 , x z , * * 20, 33[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*****************************************nn ) z z 1 print( 33[32m , * * 20, end , * * 20 , x z , * * 20, 33[0m ) time.sleep(2) print( 33[33m发送至对方的邮件 , x, 封 33[0m ) print( 33[33m不能发送的邮件 , z, 封 33[0m ) print( 33[33m共扫描的邮件 ,x z , 封 33[0m ) print( 33[33m不能解析字符集或者没有字符集标识的邮件 , d, 封 33[0m ) print( 33[33m如下 n , d_txt, 33[0m ) print( 33[33m乱码文件 , c, 封 33[0m ) print( 33[33m如下 n , c_txt, 33[0m ) print( 33[33m出现编码冲突的邮件 , e, 封 33[0m ) print( 33[33m如下 , e_txt, 33[0m ) time.sleep(0.5) sys.exit() if __name__ __main__ : rootdir \ .eml 文件存在目录 \ runPri_files(rootdir)



