Python自动转发exchange邮件(exchangelib)
自动转发邮件,不作为附件
#导入exchangelib库模块 from exchangelib import NTLM, IMPERSONATION, Account, Credentials, Configuration, DELEGATE, Mailbox, Folder, Message, HTMLBody, FileAttachment, ItemAttachment from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapter import sys,base64,time,random import requests, urllib3 from datetime import datetime,timedelta #定义个人隔离区邮件密送邮箱地址、账号、密码,用于读取该邮箱邮件 usermail = "username@yx.com" username_appimp = "domain\\username" password_appimp = "password" mail_server = "mail.yx.com"######### 取消SSL安全连接警告 ##################################### urllib3.disable_warnings() # Tell exchangelib to use this adapter class instead of the default # exchangelib provides a sample adapter which ignores TLS validation errors. # Use at own risk. NTML is NT LAN Manager. BaseProtocol.HTTP_ADAPTER_CLS = NoVerifyHTTPAdapter ######### 取消SSL安全连接警告 ######################################通过EWS连接到Exchange credentials = Credentials(username=username_appimp, password=password_appimp) config = Configuration(server=mail_server, credentials=credentials, auth_type = NTLM, max_connections=3) try:account = Account(primary_smtp_address=usermail, autodiscover=False,config=config,access_type=DELEGATE, #IMPERSONATION, ) except Exception as e:print(f'Error with connect to Exchange,Exit: {e}')exit(1)# print(account)def forward_email(original_message, forward_to_emails):"""转发邮件,原始邮件内容不作为附件Parameters:original_message: 原始邮件对象forward_to_emails: 转发目标邮箱列表"""# from_sender = original_message.sender.name if original_message.sender else '未知'# to_recipients = ','.join([recipient.name for recipient in original_message.to_recipients])# cc_recipients = ','.join([recipient.name for recipient in original_message.cc_recipients]) if original_message.cc_recipients else " "# send_time = original_message.datetime_received.strftime('%Y-%m-%d %H:%M:%S')forward_body = original_message.body if original_message.body else original_message.text_body# # 构建转发邮件内容# forward_body = f'''# {mail_body}# '''# 创建转发邮件forward_msg = Message(account=original_message.account,folder=original_message.account.sent,subject=f"转发: {original_message.subject}",body=HTMLBody(forward_body),to_recipients=[Mailbox(email_address=email) for email in forward_to_emails])attachment_count = 0for attachment in original_message.attachments:if isinstance(attachment, FileAttachment):# if self._is_signature_attachment(attachment):# signature_attachment_count += 1# continue# 创建新的附件对象new_attachment = FileAttachment(name=attachment.name,content_type=attachment.content_type,content=attachment.content,content_id=attachment.content_id, # 保留 content_id 用于 cid 引用is_inline=attachment.is_inline # 保留是否内嵌 )forward_msg.attachments.append(new_attachment)attachment_count += 1# 发送邮件 forward_msg.send_and_save()print(f"邮件已成功转发至: {', '.join(forward_to_emails)}")#遍历exchange的隔离区邮箱,获取5分钟前 - 最近24小时内的邮件 end = (datetime.now() - timedelta(minutes=0)).replace(tzinfo=account.default_timezone) start = (datetime.now() - timedelta(hours=100)).replace(tzinfo=account.default_timezone) filter_items = account.inbox.all().filter(datetime_received__range=(start, end)) print(f'待处理邮件数量: {filter_items.count()} 封') if filter_items.count() > 0:print(f'待处理邮件数量: {filter_items.count()} 封,开始处理')i = 1 for item in filter_items[:3]:print(item.sender.email_address)print(item.subject)forward_email(original_message=item,forward_to_emails=["48359@qq.com", "mom@163.com"])