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 = 0
    for 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"]
        )

 

posted on 2025-12-01 13:41  momingliu11  阅读(0)  评论(0)    收藏  举报