栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

将 .eml 后缀的文件以邮件形式发送

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将 .eml 后缀的文件以邮件形式发送

新版发送邮件的脚本 批量发邮件 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)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/266739.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号