Python 使用企业邮箱发邮件被识别为外部邮箱的问题及解决方案

博客讲述了作者在使用Python脚本发送统计报告邮件时遇到的问题,即邮件被公司邮箱服务器标记为外部邮件并带有警告。作者通过查看官方文档,将原始代码从使用`email.mime`模块改为使用`email.message.EmailMessage`,并调整了发送邮件的流程,成功解决了这个问题。新代码中包含了使用`starttls()`、`ehlo()`方法以及`add_attachment()`来添加邮件附件,确保了邮件发送的安全性和正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 写了个脚本实现定时发送统计报告, 生产环境中遇到的问题是发出的邮件被公司邮箱服务器识别为外部邮件从而带上警告标识. 如图:

CAUTION: This email originated from outside the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.

在这里插入图片描述
实现的代码大致如下, 端口用的 587:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header
'''
    发送Excel到指定邮箱
'''
def sendEmail():
    global summaryFilePath
    global today
    message = MIMEMultipart()
    message['From'] = Header("eflow", 'utf-8')
    message['To'] =  Header(EMAIL_RECEIVERS, 'utf-8')
    subject = '费用归口汇总表_{date}'.format(date=today)
    message['Subject'] = Header(subject, 'utf-8')
    message.attach(MIMEText('附件是{subject}, 请查收'.format(subject=subject), 'plain', 'utf-8'))
    
    att = MIMEApplication(open('./{path}'.format(path=summaryFilePath), 'rb').read())
    att.add_header('Content-Disposition', 'attachment', filename = summaryFilePath)
    message.attach(att)
    
    try:
        smtpObj = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        smtpObj.starttls()
        smtpObj.login(EMAIL_SENDER, EMAIL_PWD)
        smtpObj.sendmail(EMAIL_SENDER, EMAIL_RECEIVERS.split(';'), message.as_string())
        logger.info("邮件发送成功")
    except smtplib.SMTPException as e:
        logger.error(e)

用的是从网上拷的代码, 发现有识别问题后又搜了很久没找到另外的版本, 习惯的拿来主义不管用了. 没办法, 最后在官方找到了合适的方案.

参考: https://docs.python.org/3/library/email.examples.html#email-examples

修改后的代码如下:

def sendEmail():
    global summaryFilePath
    global today
    subject = '费用归口汇总表_{date}'.format(date=today)
    try:
        msg = EmailMessage()
        msg.set_content('附件是{subject}, 请查收'.format(subject=subject))
        msg['Subject'] = subject
        msg['From'] = EMAIL_SENDER
        msg['To'] = EMAIL_RECEIVERS.split(';')
        msg['Bcc'] = BCC_EMAIL_RECEIVERS.split(';')
        with open(summaryFilePath, 'rb') as content_file:
            content = content_file.read()
            msg.add_attachment(content, maintype='application', subtype='excel', filename=summaryFilePath)
        smtpObj = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        smtpObj.ehlo(SMTP_SERVER)
        smtpObj.starttls()
        smtpObj.login(EMAIL_SENDER, EMAIL_PWD)
        smtpObj.send_message(msg)
        smtpObj.quit()
        logger.info("邮件发送成功")
    except smtplib.SMTPException as e:
        logger.error(e)

完美解决问题.
最后吐槽一下, 网上的代码抄来抄去并且有时效性问题, 以后还是尽量看官方的文档优先吧.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值