|
@@ -1,13 +1,20 @@
|
|
|
+import imaplib
|
|
|
+import shutil
|
|
|
+import smtplib
|
|
|
+from email.mime.multipart import MIMEMultipart
|
|
|
+from email.mime.text import MIMEText
|
|
|
+
|
|
|
import boto3
|
|
|
from boto3 import Session
|
|
|
from django.views import View
|
|
|
|
|
|
-
|
|
|
from model.models import EmailSortModel, EmailConfigModel
|
|
|
from Utils.NeteaseMail import NeteaseMail
|
|
|
from django.views.generic import TemplateView
|
|
|
|
|
|
from object.ResponseObject import ResponseObject
|
|
|
+import os
|
|
|
+import csv
|
|
|
|
|
|
|
|
|
class ComprehendView(TemplateView):
|
|
@@ -31,10 +38,28 @@ class ComprehendView(TemplateView):
|
|
|
return self.createSort(request_dict, response)
|
|
|
elif operation == 'doStartSortWord':
|
|
|
return self.doStartSortWord(request_dict, response)
|
|
|
+ elif operation == 'write_csv':
|
|
|
+ return self.write_csv(request_dict, response)
|
|
|
+ elif operation == 'upload_csv':
|
|
|
+ return self.upload_csv(request_dict, response)
|
|
|
+ elif operation == 'create_document_classifier':
|
|
|
+ return self.create_document_classifier(request_dict, response)
|
|
|
+ elif operation == 'create_endpoint':
|
|
|
+ return self.create_endpoint(request_dict, response)
|
|
|
+ elif operation == 'describe_document_classifier':
|
|
|
+ return self.describe_document_classifier(request_dict, response)
|
|
|
+ elif operation == 'describe_endpoint':
|
|
|
+ return self.describe_endpoint(request_dict, response)
|
|
|
+ elif operation == 'delete_endpoint':
|
|
|
+ return self.delete_endpoint(request_dict, response)
|
|
|
+ elif operation == 'delete_document_classifier':
|
|
|
+ return self.delete_document_classifier(request_dict, response)
|
|
|
elif operation == 'getDocumentClassifier':
|
|
|
return self.get_document_classifier(request_dict, response)
|
|
|
+ elif operation == 'email':
|
|
|
+ return self.email(request_dict, response)
|
|
|
|
|
|
- def createSort(self,request_dict, response):
|
|
|
+ def createSort(self, request_dict, response):
|
|
|
client = boto3.client('comprehend', region_name='region')
|
|
|
|
|
|
# Create a document classifier
|
|
@@ -57,8 +82,7 @@ class ComprehendView(TemplateView):
|
|
|
list_response = client.list_document_classifiers()
|
|
|
print("List response: %s\n", list_response)
|
|
|
|
|
|
-
|
|
|
- def doStartSortWord(self,request_dict, response):
|
|
|
+ def doStartSortWord(self, request_dict, response):
|
|
|
client = boto3.client('comprehend', region_name='region')
|
|
|
|
|
|
start_response = client.start_document_classification_job(
|
|
@@ -84,66 +108,501 @@ class ComprehendView(TemplateView):
|
|
|
list_response = client.list_document_classification_jobs()
|
|
|
print("List response: %s\n", list_response)
|
|
|
|
|
|
+ def write_csv(self, request_dict, response):
|
|
|
+ file_path = os.path.join(os.path.dirname(__file__) + '/../emailtrainfile/emailtrain.csv')
|
|
|
+ with open(file_path, "w", newline='') as f:
|
|
|
+ sort = EmailSortModel.objects.values('sort', 'clientquestion')
|
|
|
+ for a in sort:
|
|
|
+ text = [a['sort'], a['clientquestion']]
|
|
|
+ csv_writer = csv.writer(f)
|
|
|
+ for i in range(50):
|
|
|
+ csv_writer.writerow(text)
|
|
|
+ return response.json(0)
|
|
|
|
|
|
- def get_document_classifier(self,request_dict, response):
|
|
|
- # aws_key = "AKIA2E67UIMD45Y3HL53" # 【你的 aws_access_key】
|
|
|
- # aws_secret = "ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw" # 【你的 aws_secret_key】
|
|
|
- # session = Session(aws_access_key_id=aws_key,
|
|
|
- # aws_secret_access_key=aws_secret,
|
|
|
- # region_name="us-east-1") # 此处根据自己的 s3 地区位置改变
|
|
|
- # client = session.client("asj-amazon-comprehend")
|
|
|
- # client = boto3.client(
|
|
|
- # 'asj-amazon-comprehend',
|
|
|
- # aws_access_key_id='AKIA2E67UIMD45Y3HL53',
|
|
|
- # aws_secret_access_key='ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw',
|
|
|
- # region_name='us-east-1'
|
|
|
- # )
|
|
|
- #client = boto3.client(service_name='comprehend',region_name='us-east-1',aws_access_key_id='AKIA2E67UIMD45Y3HL53',aws_secret_access_key='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')
|
|
|
-
|
|
|
- # response = client.describe_document_classifier(
|
|
|
- # DocumentClassifierArn='arn:aws:comprehend:us-east-1:697864307463:document-classifier/txttwo'
|
|
|
- # )
|
|
|
- # print(response)
|
|
|
- ec_qs =EmailConfigModel.objects.filter(emailtag=1) #获取总邮件
|
|
|
+ def upload_csv(self, request_dict, response):
|
|
|
+ file_path = os.path.join(os.path.dirname(__file__) + '/../emailtrainfile/emailtrain.csv')
|
|
|
+ bucket_name = "asj-amazon-comprehend"
|
|
|
+ upload_key = "location/emailtrain.csv"
|
|
|
+ with open(file_path, "rb") as f:
|
|
|
+ NeteaseMail().s3_login().upload_fileobj(f, bucket_name, Key=upload_key)
|
|
|
+ return response.json(0)
|
|
|
+
|
|
|
+ def create_document_classifier(self, request_dict, response):
|
|
|
+ try:
|
|
|
+ response1 = NeteaseMail().aws_login().create_document_classifier(
|
|
|
+ DocumentClassifierName='lhq',
|
|
|
+ DataAccessRoleArn='arn:aws:iam::697864307463:role/service-role/AmazonComprehendServiceRoleS3FullAccess-admin',
|
|
|
+ # Tags=[{'Key': 'string','Value': 'string'},],
|
|
|
+ InputDataConfig={
|
|
|
+ 'DataFormat': 'COMPREHEND_CSV',
|
|
|
+ # | 'AUGMENTED_MANIFEST',
|
|
|
+ 'S3Uri': 's3://asj-amazon-comprehend/location/emailtrain.csv',
|
|
|
+ # 'LabelDelimiter': 'string',
|
|
|
+ # 'AugmentedManifests': [
|
|
|
+ # {
|
|
|
+ # 'S3Uri': 'string',
|
|
|
+ # 'AttributeNames': ['string', ]
|
|
|
+ # },
|
|
|
+ # ]
|
|
|
+ },
|
|
|
+ OutputDataConfig={
|
|
|
+ 'S3Uri': 's3://asj-amazon-comprehend/output/lhq/'},
|
|
|
+ # 'KmsKeyId': 'string'},
|
|
|
+ # ClientRequestToken='string',
|
|
|
+ LanguageCode='en',
|
|
|
+ # | 'es' | 'fr' | 'de' | 'it' | 'pt' | 'ar'
|
|
|
+ # | 'hi' | 'ja' | 'ko' | 'zh' | 'zh-TW',
|
|
|
+ # VolumeKmsKeyId='string',
|
|
|
+ # VpcConfig={
|
|
|
+ # 'SecurityGroupIds': ['string', ],
|
|
|
+ # 'Subnets': ['string', ]
|
|
|
+ # },
|
|
|
+ Mode='MULTI_CLASS' # 'MULTI_LABEL'
|
|
|
+ )
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(404, repr('模型正在训练或已存在'))
|
|
|
+ else:
|
|
|
+ print(response1)
|
|
|
+ return response.json(0)
|
|
|
+
|
|
|
+ def create_endpoint(self, request_dict, response):
|
|
|
+ try:
|
|
|
+ response1 = NeteaseMail().aws_login().create_endpoint(
|
|
|
+ EndpointName='lhq',
|
|
|
+ ModelArn='arn:aws:comprehend:us-east-1:697864307463:document-classifier/lhq',
|
|
|
+ # Document classifier arn
|
|
|
+ DesiredInferenceUnits=1,
|
|
|
+ # ClientRequestToken='string',
|
|
|
+ # Tags=[{'Key': 'string','Value': 'string'},]
|
|
|
+ )
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(404, repr('模型正在训练或不存在,请等待模型训练完再创建端点'))
|
|
|
+ else:
|
|
|
+ print(response1)
|
|
|
+ return response.json(0)
|
|
|
+
|
|
|
+ def describe_document_classifier(self, request_dict, response):
|
|
|
+ try:
|
|
|
+ # classifier_name = request_dict.get('classifier_name', None)
|
|
|
+ a = NeteaseMail().aws_arn()[0]
|
|
|
+ # classifier_arn = a + str(classifier_name)
|
|
|
+ classifier_arn = a + 'lhq'
|
|
|
+ response1 = NeteaseMail().aws_login().describe_document_classifier(
|
|
|
+ DocumentClassifierArn=classifier_arn
|
|
|
+ )
|
|
|
+ a1 = {"Status": response1['DocumentClassifierProperties']['Status']}
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(404, repr('模型不存在'))
|
|
|
+ else:
|
|
|
+ return response.json(0, a1)
|
|
|
+
|
|
|
+ def describe_endpoint(self, request_dict, response):
|
|
|
+ try:
|
|
|
+ # endpoint_name = request_dict.get('endpoint_name', None)
|
|
|
+ a = NeteaseMail().aws_arn()[1]
|
|
|
+ # endpoint_arn = a + str(endpoint_name)
|
|
|
+ endpoint_arn = a + 'lhq'
|
|
|
+ response1 = NeteaseMail().aws_login().describe_endpoint(
|
|
|
+ EndpointArn=endpoint_arn
|
|
|
+ )
|
|
|
+ a1 = {"Status": response1['EndpointProperties']['Status']}
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(404, repr('端点不存在'))
|
|
|
+ else:
|
|
|
+ return response.json(0, a1)
|
|
|
+
|
|
|
+ def delete_endpoint(self, request_dict, response):
|
|
|
+ try:
|
|
|
+ # endpoint_name = request_dict.get('endpoint_name', None)
|
|
|
+ a = NeteaseMail().aws_arn()[1]
|
|
|
+ # endpoint_arn = a + str(endpoint_name)
|
|
|
+ endpoint_arn = a + 'lhq'
|
|
|
+ response1 = NeteaseMail().aws_login().delete_endpoint(
|
|
|
+ EndpointArn=endpoint_arn)
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(404, repr('端点不存在或正在删除中'))
|
|
|
+ else:
|
|
|
+ return response.json(0)
|
|
|
+
|
|
|
+ def delete_document_classifier(self, request_dict, response):
|
|
|
+ try:
|
|
|
+ # classifier_name = request_dict.get('classifier_name', None)
|
|
|
+ a = NeteaseMail().aws_arn()[0]
|
|
|
+ # classifier_arn = a + str(classifier_name)
|
|
|
+ classifier_arn = a + 'lhq'
|
|
|
+ response1 = NeteaseMail().aws_login().delete_document_classifier(
|
|
|
+ DocumentClassifierArn=classifier_arn)
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(404, repr('模型不存在或正在删除中'))
|
|
|
+ else:
|
|
|
+ return response.json(0)
|
|
|
|
|
|
+ def get_document_classifier(self, request_dict, response):
|
|
|
+ ec_qs = EmailConfigModel.objects.filter(emailtag=1) # 获取总邮件
|
|
|
+ emailsum = 0
|
|
|
+ replyemailsum = 0
|
|
|
for ec in ec_qs:
|
|
|
email_server = NeteaseMail().loginEmail(ec.emailserver, ec.fromaddr, ec.password, ec.emailserverport)
|
|
|
- subject_list, from_list, bodydata_list = NeteaseMail().getEmailContext(email_server)
|
|
|
- print("标题:", subject_list)
|
|
|
- print("发件人:", from_list)
|
|
|
- print("邮件内容:", bodydata_list)
|
|
|
- if subject_list == []:
|
|
|
- print("邮箱内无邮件")
|
|
|
+ subject_list, from_list, bodydata_list, uid_list, results, email_body, fujian_list, image_list = NeteaseMail().getEmailContext(
|
|
|
+ email_server)
|
|
|
+ emailsum += len(results)
|
|
|
+ print("标题:", len(subject_list), subject_list)
|
|
|
+ print("发件人:", len(from_list), from_list)
|
|
|
+ print("邮件内容:", len(bodydata_list), bodydata_list)
|
|
|
+ print("邮件uid:", len(uid_list), uid_list)
|
|
|
+ print("附件判断:", len(fujian_list), fujian_list)
|
|
|
+ print('图片数量:', len(image_list), image_list)
|
|
|
+ if not bodydata_list:
|
|
|
+ print("邮箱内无未读邮件")
|
|
|
else:
|
|
|
- print('成功拿到邮箱数据')
|
|
|
- # NeteaseMail().closeEmail(email_server)
|
|
|
+ print('成功拿到邮件数据')
|
|
|
+ for i, v in enumerate(subject_list):
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ print("邮件标题:", subject_list[i])
|
|
|
+ if not bodydata_list[i] or not subject_list[i]:
|
|
|
+ print("邮件无正文或无标题,不进行回复")
|
|
|
+ continue
|
|
|
|
|
|
- for i ,v in enumerate(subject_list):
|
|
|
+ if fujian_list[i] == 'have':
|
|
|
+ reply_model = bodydata_list[i]
|
|
|
+ image = image_list
|
|
|
+ shoujianren = 'liehaoquan2021@163.com'
|
|
|
+ fajianren = from_list[i].split()[1]
|
|
|
+ NeteaseMail().sentemail(None, uid_list[i],reply_model, image, subject_list[i], fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ file_path = os.path.join(os.path.dirname(__file__) + '/../emailtrainfile/image/')
|
|
|
+ shutil.rmtree(file_path)
|
|
|
+ os.mkdir(file_path)
|
|
|
+ print('邮件含有图片或附件,已转发到zendesk')
|
|
|
+ email_server.set_flags(uid_list[i], b'\\Seen', silent=False)
|
|
|
+ continue
|
|
|
|
|
|
- client = boto3.client(service_name='comprehend', region_name='us-east-1',
|
|
|
- aws_access_key_id='AKIA2E67UIMD45Y3HL53',
|
|
|
- aws_secret_access_key='ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw')
|
|
|
- response1 = client.classify_document(
|
|
|
- Text=bodydata_list[i],
|
|
|
- EndpointArn='arn:aws:comprehend:us-east-1:697864307463:document-classifier-endpoint/test'
|
|
|
+ response1 = NeteaseMail().aws_login().classify_document(
|
|
|
+ Text=bodydata_list[i].split('\n\n\n\n\n')[0],
|
|
|
+ EndpointArn='arn:aws:comprehend:us-east-1:697864307463:document-classifier-endpoint/lhq'
|
|
|
+ # EndpointArn='arn:aws:comprehend:us-east-1:697864307463:document-classifier-endpoint/test'
|
|
|
)
|
|
|
- #print(response.index(max(response['Classes']['Score'])))
|
|
|
+ # print(response.index(max(response['Classes']['Score'])))
|
|
|
nums = []
|
|
|
+ print('emailsort:')
|
|
|
for cls in response1['Classes']:
|
|
|
print(cls['Name'])
|
|
|
nums.append(cls['Score'])
|
|
|
+ print("识别种类及命中率:", response1['Classes'][nums.index(max(nums))])
|
|
|
+ if response1['Classes'][nums.index(max(nums))]['Score'] >= 0.95:
|
|
|
+ reply_sort = EmailSortModel.objects.filter(
|
|
|
+ sort=response1['Classes'][nums.index(max(nums))]['Name']).values('autoreplymodel')
|
|
|
+ if reply_sort.exists():
|
|
|
+ reply_model = reply_sort[0]['autoreplymodel'] + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + \
|
|
|
+ 'At' + email_body[i]['Date'] + from_list[i].split()[0] + \
|
|
|
+ from_list[i].split()[1] + \
|
|
|
+ 'wrote:\n ' + bodydata_list[i]
|
|
|
+ print(reply_model)
|
|
|
+ shoujianren = from_list[i].split()[1].replace('<', '').replace('>', '')
|
|
|
+ a = NeteaseMail().sentemail(None, uid_list[i], reply_model, None, subject_list[i], ec.fromaddr, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ email_server.set_flags(uid_list[i], b'\\Seen', silent=False)
|
|
|
+ if a == 'fail':
|
|
|
+ print("此邮件被判定为垃圾邮件,不进行回复")
|
|
|
+ email_server.remove_flags(uid_list[i], b'\\Seen', silent=False)
|
|
|
+ else:
|
|
|
+ replyemailsum += a
|
|
|
+ else:
|
|
|
+ print("无此转发分类,不进行回复")
|
|
|
+ else:
|
|
|
+ reply_model = bodydata_list[i]
|
|
|
+ shoujianren = 'liehaoquan2021@163.com'
|
|
|
+ fajianren = from_list[i].split()[1]
|
|
|
+ NeteaseMail().sentemail(reply_model, None, subject_list[i], fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ email_server.set_flags(uid_list[i], b'\\Seen', silent=False)
|
|
|
+ print("命中率低于0.95,已转发到zendesk")
|
|
|
+ # es_qs = EmailSortModel.objects.filter(sort=response1['Classes'][nums.index(max(nums))]['Name'])
|
|
|
+ # if es_qs.exists():
|
|
|
+ # uemail_qs = EmailConfigModel.objects.filter(userid=es_qs[0]['userid'], langconfig__langcode='en')
|
|
|
+ # if uemail_qs.exists():
|
|
|
+ # for uem in uemail_qs:
|
|
|
+ # NeteaseMail().sentemail(bodydata_list[i], subject_list[i], from_list[i], uem.fromaddr, ec.fromaddr, ec.password)
|
|
|
+ NeteaseMail().closeEmail(email_server)
|
|
|
+ emaildict = {
|
|
|
+ "邮箱内获取到未读邮件数": emailsum,
|
|
|
+ "已自动回复的邮件数": replyemailsum
|
|
|
+ }
|
|
|
+ return response.json(0, emaildict)
|
|
|
+
|
|
|
+ def email(self, request_dict, response):
|
|
|
+ from imapclient import IMAPClient
|
|
|
+ import email
|
|
|
+ import time
|
|
|
+ import email.parser
|
|
|
+ from nntplib import decode_header
|
|
|
+ from email.header import Header
|
|
|
+ import chardet
|
|
|
+
|
|
|
+ ec_qs = EmailConfigModel.objects.filter(emailtag=1) # 获取总邮件
|
|
|
+ for ec in ec_qs:
|
|
|
+ global a, email_server
|
|
|
+
|
|
|
+ #邮件登录
|
|
|
+ try:
|
|
|
+ email_server = IMAPClient(ec.emailserver, ssl=True, port=ec.emailserverport)
|
|
|
+ # email_server = imaplib.IMAP4_SSL(IMAP_SERVER, 993) # 网易企业邮箱服务器及SSL端口
|
|
|
+ print("imap4 服务器连接成功")
|
|
|
+ email_server.login(ec.fromaddr, ec.password)
|
|
|
+ email_server.id_({"name": "IMAPClient", "version": "2.1.0"})
|
|
|
+ # email_server.login(FROM_ADDR, PASSWORD)
|
|
|
+ print("imap4 (%s)账号密码正确,登录成功" % ec.fromaddr)
|
|
|
+ except:
|
|
|
+ print("imap4 服务器连接失败")
|
|
|
+
|
|
|
+ email_server.select_folder('INBOX')
|
|
|
+ results = email_server.search('UNSEEN') # 读取未读邮件
|
|
|
+ print("邮箱内获取到未读邮件:", len(results))
|
|
|
+ subject_list = []
|
|
|
+ from_list = []
|
|
|
+ uid_list = []
|
|
|
+ email_body = []
|
|
|
+ fujian_list = []
|
|
|
+ image_list = []
|
|
|
+ plain_list = []
|
|
|
+ html_list = []
|
|
|
+ a = 0
|
|
|
+
|
|
|
+ # 对每一封邮件进行内容解析
|
|
|
+ for uid in results:
|
|
|
+ msgdict = email_server.fetch(uid, ['Body[]', 'ENVELOPE'], '(RFC822)')
|
|
|
+ mailbody = msgdict[uid][b'BODY[]']
|
|
|
+ envelope = msgdict[uid][b'ENVELOPE']
|
|
|
+ message = email.message_from_bytes(mailbody)
|
|
|
+ text = message.as_string()
|
|
|
+ body = email.parser.Parser().parsestr(text)
|
|
|
+
|
|
|
+ nowtime = time.asctime(time.localtime(time.time()))
|
|
|
+ nowmonth = nowtime.split()[1]
|
|
|
+ nowday = nowtime.split()[2]
|
|
|
+ emailmonth = body['Date'].split()[2]
|
|
|
+ emailday = body['Date'].split()[1]
|
|
|
+ print('email',emailmonth,emailday)
|
|
|
+ print('now', nowmonth, nowday)
|
|
|
+ # if emailmonth != nowmonth or emailday != nowday:
|
|
|
+ # email_server.remove_flags(uid, b'\\Seen', silent=False)
|
|
|
+ # continue
|
|
|
+
|
|
|
+ email_body.append(body)
|
|
|
+ subject_list.append(decode_header(body['Subject']))
|
|
|
+ from_list.append(decode_header(body['from']))
|
|
|
+ uid_list.append(uid)
|
|
|
+ print("标题:", subject_list)
|
|
|
+
|
|
|
+ attlist = {}
|
|
|
+ try:
|
|
|
+ for part in body.walk():
|
|
|
+ if not part.is_multipart():
|
|
|
+ file = part.get_filename() # 附件名
|
|
|
+ if file:
|
|
|
+ a = 1
|
|
|
+ filename = email.header.decode_header(file)[0][0] # 附件名
|
|
|
+ charset = email.header.decode_header(file)[0][1] # 编码
|
|
|
+ if part.get_all("Content-ID"):
|
|
|
+ content_id = part.get_all("Content-ID")[0][1:-1]
|
|
|
+ else:
|
|
|
+ content_id = "" # 附件ID,也就是邮件源码里面的cid
|
|
|
+ ''' 多个附件时将附件名和ID对应保存到dict里面,后面将正文中的cid替换为本地保存路径 '''
|
|
|
+ attlist[content_id] = filename
|
|
|
+ ''' 附件文件名为中文或有编码的时候要进行转码 '''
|
|
|
+ if str(charset) != "None":
|
|
|
+ filename = filename.decode(charset)
|
|
|
+ filedata = part.get_payload(decode=True) # 附件内容
|
|
|
+ ''' 把附件写到文件里面,附件一定要用wb打开,二进制 '''
|
|
|
+ file_path = os.path.join(os.path.dirname(__file__) + '/../emailtrainfile/image/')
|
|
|
+ image_list.append(file_path + filename)
|
|
|
+ with open(file_path + filename, "wb") as fw:
|
|
|
+ fw.write(filedata)
|
|
|
+ fw.close()
|
|
|
+
|
|
|
+ elif part.get_content_type() == 'text/plain':
|
|
|
+ con3 = part.get_payload(decode=True).strip()
|
|
|
+ print('plain:', chardet.detect(con3))
|
|
|
+ if chardet.detect(con3)['encoding'] == 'utf-8':
|
|
|
+ plain_list.append(con3.decode('utf-8'))
|
|
|
+ continue
|
|
|
+ # if chardet.detect(con3)['encoding'] == 'ISO-8859-1':
|
|
|
+ # plain_list.append(con3.decode('ISO-8859-1')) # .decode('gbk').encode('utf8')
|
|
|
+ # continue
|
|
|
+ else:
|
|
|
+ plain_list.append(con3.decode('gbk'))
|
|
|
+ continue
|
|
|
+ elif part.get_content_type() == 'text/html':
|
|
|
+ con3 = part.get_payload(decode=True).strip()
|
|
|
+ print('html', chardet.detect(con3))
|
|
|
+ if chardet.detect(con3)['encoding'] == 'utf-8':
|
|
|
+ html_list.append(con3.decode('utf-8'))
|
|
|
+ continue
|
|
|
+ # if chardet.detect(con3)['encoding'] == 'ISO-8859-1':
|
|
|
+ # html_list.append(con3.decode('ISO-8859-1'))
|
|
|
+ # continue
|
|
|
+ else:
|
|
|
+ html_list.append(con3.decode('gbk'))
|
|
|
+ continue
|
|
|
+ except Exception as e:
|
|
|
+ print(e)
|
|
|
+ print('获取邮件内容失败')
|
|
|
+ email_server.remove_flags(uid, b'\\Seen', silent=False)
|
|
|
+ subject_list.clear()
|
|
|
+ from_list.clear()
|
|
|
+ uid_list.clear()
|
|
|
+ email_body.clear()
|
|
|
+ fujian_list.clear()
|
|
|
+ image_list.clear()
|
|
|
+ plain_list.clear()
|
|
|
+ html_list.clear()
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ continue
|
|
|
+
|
|
|
+
|
|
|
+ if a == 1:
|
|
|
+ fujian_list.append('have')
|
|
|
+ a = 0
|
|
|
+ else:
|
|
|
+ fujian_list.append('none')
|
|
|
+ email_server.remove_flags(uid, b'\\Seen', silent=False)
|
|
|
+ print("发件人:", from_list)
|
|
|
+ print("邮件内容:")
|
|
|
+ print("plain形式:",plain_list)
|
|
|
+ print("html形式:",html_list)
|
|
|
+ print("邮件uid:", uid_list)
|
|
|
+ print("邮件是否含有图片或附件:", fujian_list)
|
|
|
+ print('图片或附件名字:', image_list)
|
|
|
+ if not html_list and not plain_list:
|
|
|
+ print("邮箱内无未读邮件")
|
|
|
+ else:
|
|
|
+ print('成功拿到邮件数据')
|
|
|
+
|
|
|
+ # 对邮件类型进行判断处理
|
|
|
+ for i, v in enumerate(uid_list):
|
|
|
+ print("邮件标题:", subject_list[i])
|
|
|
+ if html_list and not plain_list:
|
|
|
+ print('此邮件仅含有html')
|
|
|
+ reply_model = html_list[i]
|
|
|
+ fajianren = from_list[i]
|
|
|
+ shoujianren = 'liehaoquan2021@163.com' # 写zendesk邮箱
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i],reply_model, None, subject_list[i], fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
+
|
|
|
+ if plain_list[i] == '':
|
|
|
+ print('此邮件无正文')
|
|
|
+ reply_model = ''
|
|
|
+ fajianren = from_list[i]
|
|
|
+ shoujianren = 'liehaoquan2021@163.com' # 写zendesk邮箱
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i],reply_model, None, subject_list[i], fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
+
|
|
|
+ if not subject_list[i]:
|
|
|
+ print('此邮件无主题')
|
|
|
+ if html_list and not plain_list:
|
|
|
+ print('此邮件无主题且仅含有html')
|
|
|
+ reply_model = html_list[i]
|
|
|
+ fajianren = from_list[i]
|
|
|
+ shoujianren = 'liehaoquan2021@163.com' # 写zendesk邮箱
|
|
|
+ biaoti = '(无主题)'
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i],reply_model, None, biaoti, fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
+ elif plain_list:
|
|
|
+ print('此邮件无主题且含有正文')
|
|
|
+ reply_model = plain_list[i]
|
|
|
+ fajianren = from_list[i]
|
|
|
+ shoujianren = 'liehaoquan2021@163.com' # 写zendesk邮箱
|
|
|
+ biaoti = '(无主题)'
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i], reply_model, None, biaoti, fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
+
|
|
|
+ # 处理含有图片或附件的邮件
|
|
|
+ if fujian_list[i] == 'have':
|
|
|
+ print('此邮件含有图片或附件或视频或压缩包')
|
|
|
+ reply_model = html_list[i]
|
|
|
+ image = image_list
|
|
|
+ fajianren = from_list[i]
|
|
|
+ shoujianren = 'liehaoquan2021@163.com' # 写zendesk邮箱
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i], reply_model, image, subject_list[i], fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ file_path = os.path.join(os.path.dirname(__file__) + '/../emailtrainfile/image/')
|
|
|
+ shutil.rmtree(file_path)
|
|
|
+ os.mkdir(file_path)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
|
|
|
- print(response1['Classes'][nums.index(max(nums))])
|
|
|
+ if fujian_list[i] == 'none':
|
|
|
+ # 处理无图片或附件的邮件
|
|
|
+ # 进行种类判断
|
|
|
+ print("识别内容:", plain_list[i].split('\n\n')[0]) # plain
|
|
|
+ if len(plain_list[i].split('\n\n\n')[0]) < 1000:
|
|
|
+ response1 = NeteaseMail().aws_login().classify_document(
|
|
|
+ Text=plain_list[i].split('\n\n\n')[0],
|
|
|
+ EndpointArn='arn:aws:comprehend:us-east-1:697864307463:document-classifier-endpoint/lhq'
|
|
|
+ # EndpointArn='arn:aws:comprehend:us-east-1:697864307463:document-classifier-endpoint/test'
|
|
|
+ )
|
|
|
+ # print(response.index(max(response['Classes']['Score'])))
|
|
|
+ nums = []
|
|
|
+ print('emailsort:')
|
|
|
+ for cls in response1['Classes']:
|
|
|
+ print(cls['Name'])
|
|
|
+ nums.append(cls['Score'])
|
|
|
+ print("识别种类及命中率:", response1['Classes'][nums.index(max(nums))])
|
|
|
+ # 命中率高于0.95时
|
|
|
+ if response1['Classes'][nums.index(max(nums))]['Score'] >= 0.95:
|
|
|
+ reply_sort = EmailSortModel.objects.filter(
|
|
|
+ sort=response1['Classes'][nums.index(max(nums))]['Name']).values('autoreplymodel')
|
|
|
+ if reply_sort.exists():
|
|
|
+ reply_model = reply_sort[0]['autoreplymodel'] + '\n' + '\n' + '\n' + '\n' + '\n' + '\n' + \
|
|
|
+ 'At' + email_body[i]['Date'] + str(from_list[i].split()[0:-1]) + \
|
|
|
+ from_list[i].split()[-1] + \
|
|
|
+ 'wrote:\n ' + plain_list[i]
|
|
|
+ print(reply_model)
|
|
|
+ shoujianren = from_list[i].split()[1].replace('<', '').replace('>', '')
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i], reply_model, None, subject_list[i], ec.fromaddr, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ print("此邮件命中率低于0.95")
|
|
|
+ reply_model = html_list[i] # html
|
|
|
+ fajianren = from_list[i]
|
|
|
+ print(fujian_list)
|
|
|
+ shoujianren = 'liehaoquan2021@163.com' # 写zendesk邮箱
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i], reply_model, None, subject_list[i],
|
|
|
+ fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
|
|
|
- es_qs = EmailSortModel.objects.filter(sort=response1['Classes'][nums.index(max(nums))]['Name'])
|
|
|
- if es_qs.exists():
|
|
|
- uemail_qs = EmailConfigModel.objects.filter(userid=es_qs[0]['userid'], langconfig__langcode='en')
|
|
|
- if uemail_qs.exists():
|
|
|
- for uem in uemail_qs:
|
|
|
- NeteaseMail().sentemail(bodydata_list[i], subject_list[i], from_list[i], uem.fromaddr, ec.fromaddr, ec.password)
|
|
|
+ else:
|
|
|
+ print("识别内容过长")
|
|
|
+ reply_model = html_list[i] # html
|
|
|
+ fajianren = from_list[i]
|
|
|
+ print(fujian_list)
|
|
|
+ shoujianren = 'liehaoquan2021@163.com' # 写zendesk邮箱
|
|
|
+ NeteaseMail().sentemail(email_server, uid_list[i], reply_model, None, subject_list[i], fajianren, shoujianren,
|
|
|
+ ec.fromaddr, ec.password)
|
|
|
+ print('-------------------------------------------------------------------------')
|
|
|
+ break
|
|
|
+ subject_list.clear()
|
|
|
+ from_list.clear()
|
|
|
+ uid_list.clear()
|
|
|
+ email_body.clear()
|
|
|
+ fujian_list.clear()
|
|
|
+ image_list.clear()
|
|
|
+ plain_list.clear()
|
|
|
+ html_list.clear()
|
|
|
NeteaseMail().closeEmail(email_server)
|
|
|
return response.json(0)
|
|
|
- #print(response)
|
|
|
|
|
|
# if __name__ == '__main__':
|
|
|
# ComprehendAction().get_document_classifier()
|