python通过代理发送邮件(Python操作Exchange邮箱发送邮件)

pip install Exchangelib下面是使用Outlook邮箱给QQ邮箱发送消息和附件的案例:,我来为大家科普一下关于python通过代理发送邮件?以下内容希望对你有帮助!

python通过代理发送邮件(Python操作Exchange邮箱发送邮件)

python通过代理发送邮件

安装包

pip install Exchangelib

代码

下面是使用Outlook邮箱给QQ邮箱发送消息和附件的案例:

# -*- coding: utf-8 -*- import urllib3 import logging from exchangelib import Credentials, Account, DELEGATE, Configuration, NTLM, Message, Mailbox, HTMLBody, \ FileAttachment, Build, Version, BASIC from exchangelib.Protocol import BaseProtocol, NoVerifyHTTPAdapter from exchangelib.errors import ErrorNonExistentMailbox, UnauthorizedError from django.conf import settings Outlook_ADMIN_USERNAME = getattr(settings, "OUTLOOK_ADMIN_USERNAME") OUTLOOK_ADMIN_PASSWORD = getattr(settings, "OUTLOOK_ADMIN_PASSWORD") OUTLOOK_SERVER = getattr(settings, "OUTLOOK_SERVER") OUTLOOK_EXCHANGE_VERSION = getattr(settings, "OUTLOOK_EXCHANGE_VERSION") class OutlookServer: """ 为了兼容outlook邮箱,对outlook做了简单的封装。 """ def __init__(self): # 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 urllib3.disable_warnings() self.username = OUTLOOK_ADMIN_USERNAME self.password = OUTLOOK_ADMIN_PASSWORD self.server = OUTLOOK_SERVER self.exchange_version = OUTLOOK_EXCHANGE_VERSION version = Version( build=Build(*map(int, self.exchange_version.split('.'))) ) credentials = Credentials( self.username.split("@")[0], self.password ) config = Configuration( server=self.server, credentials=credentials, version=version, auth_type=NTLM ) self.account = Account(self.username, config=config, access_type=DELEGATE) @property def is_outlook_address(self): try: self.account.calendar.id except (ErrorNonExistentMailbox, UnauthorizedError): return False except Exception as e: logging.exception(e) return False else: return True def send_email(self, recipients, subject, body, attach_file_path_list=[], attach_file_dict={}, pic_list=[]): """ :param recipients: 收件人/收件人列表 :param subject: 邮件标题 :param body: 邮件正文 :param attach_file_path_list: 附件列表(文件路径形式,例如 ["/data/pdf/a.pdf"] ) :param attach_file_dict: 附件列表(文件二进制内容,list,例如 ["/data/pdf/a.pdf"],附件名称自动取文件名称) :param pic_list: 图片列表(图片二进制内容,dict,例如 {"附件1.pdf","231234wewqe","附件2.rar","231234wewqe"} ) :return: """ if isinstance(recipients, str): recipients = [recipients] msg = Message( account=self.account, subject=subject, body=HTMLBody(body), to_recipients=[Mailbox(email_address=recipient) for recipient in recipients] ) # 文件附件 for file_path in attach_file_path_list: with open(file_path, 'rb') as f: attachment_name = file_path.split("/")[-1] file_attachment = FileAttachment( name=attachment_name, content=f.read() ) msg.attach(file_attachment) for name, content in attach_file_dict.items(): file_attachment = FileAttachment(name=name, content=content) msg.attach(file_attachment) msg.send_and_save() if __name__ == "__main__": # outlook_server = OutlookServer("xxxxxx@outlook.com", "", "outlook.office365.com", "15.1") outlook_server = OutlookServer() if outlook_server.is_outlook_address: outlook_server.send_email("xxxxxxx@qq.com", "消息发送", "调试调用发送邮件") # 测试调用发送邮件 else: print("Error not outlook server")

其他

当然,除了发送邮件消息和附件之外,还可以抄送,密送给某人。只需要修改不同的参数即可

msg = Message( folder=self.account.sent, account=self.account, subject=subject, body=HTMLBody(body), to_recipients=to_recipients, # 要发送的收件人邮箱地址列表 cc_recipients=cc_recipients, # 要发送的抄送人邮箱地址列表 bcc_recipients=bcc_recipients # 要发送的密送人邮箱地址列表 )

注意

注意,不同版本的Exchange有不同版本的version,可以在Exchange管理后台查看

注意:因为版本的不同很可能导致诸多问题,小编在客户那遇到了Exchange2007版本的,踩了不少坑,消息能发送,附件却发送不了,等等,大家使用中有遇到问题可关注小编,助你一臂之力

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页