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