热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flask邮件安全性不符合MicrosoftOutlook的安全性要求吗?

如何解决《Flask邮件安全性不符合MicrosoftOutlook的安全性要求吗?》经验,为你挑选了1个好方法。

我们有一个Web应用程序,它向客户端发送电子邮件,并且该Web应用程序正在使用Flask邮件框架进行处理。大约2周前,我们的Web应用程序未能将电子邮件发送给客户和我们自己的团队。我们使用Office 365的Outlook作为发件人。

远程服务器返回'554 5.6.0损坏的消息内容;STOREDRV.Deliver.Exception:ConversionFailedException; 由于消息内容转换的永久异常而无法处理消息:TNEF摘要内容已损坏。ConversionFailedException:内容转换:概要TNEF内容已损坏。[阶段:PromoteCreateReplay]'原始邮件标题:

这是发件人被指示发送电子邮件后收到的错误消息。我们联系了Office 365管理员,Microsoft告诉他我们的Web应用程序具有的安全性不符合Microsoft的要求/协议。

问题是Flask邮件使用的旧版安全协议或配置无法与Microsoft Outlook很好地配合吗?



1> Martijn Piet..:

Outlook.com / Office365错误消息没有多大用处,因为它可以指示许多问题。这表明Microsoft邮件服务器对电子邮件包装的某些方面(标头,附件等)不满意,并且其解析器在某处出错。否则,它们的错误消息在提供的细节上几乎是无用的。我认为这是一个安全问题,这是胡说八道。Flask-Mail使用经过良好测试的Python标准库emailsmtplib程序包,以通过TLS加密连接发送电子邮件。

对于Heroku上的Flask-Mail,我将问题追溯到在Heroku Dyno机器上生成的Message-ID标头。该问题不仅限于Heroku,但是,在主机名较长的任何主机上都会看到此问题。典型的Heroku dyno主机名以完整的UUID开头,外加另外5个组件,例如aaf39fce-569e-473a-9453-6862595bd8da.prvt.dyno.rt.heroku.com

该主机名用于为每封电子邮件生成的Message-ID标头中。Flask-Mail软件包使用标准email.utils.make_msgid()函数生成标头,并且默认情况下使用当前主机名。然后,产生一个Message-ID标头,例如:

Message-ID: <154810422972.4.16142961424846318784@aaf39fce-569e-473a-9453-6862595bd8da.prvt.dyno.rt.heroku.com>

这是一个110个字符长的字符串。对于电子邮件标题,这是一个小问题,因为电子邮件RFC规定标题限制为78个字符。但是,有多种方法可以解决此问题。为标题超过77个字符值越长,你可以使用在规定RFC 5322到折叠头。折叠可以在多行上使用多个RFC 2047 编码的单词。这就是这里发生的情况,上面的电子邮件标题变为

Message-ID: =?utf-8?q?=3C154810422972=2E4=2E16142961424846318784=40aaf39fce-?=
 =?utf-8?q?569e-473a-9453-6862595bd8da=2Eprvt=2Edyno=2Ert=2Eheroku=2Ecom=3E?=

其中78和77个字符现在适合电子邮件MIME标准。

在我看来,所有这些似乎都符合标准并且是处理邮件头的有效方法。或至少其他邮件提供商可以容忍和正确处理的内容,但是Microsoft的邮件服务器没有此功能。他们真的不喜欢上面的RFC2047编码的Message-ID标头,并尝试将正文包装在TNEF winmail.dat附件中。这并不总是有效,因此最终会得到非常神秘的554 5.6.0损坏的消息内容错误消息。我认为这是Microsoft的错误;我不是100%肯定电子邮件RFC允许使用编码的单词折叠Message-ID标头,但是MS通过向收件人发送无意义的错误而不是在接收时拒绝消息来处理错误,这是很糟糕的。

您可以通过将模块设置为global 来设置供Flask-Mail使用的替代电子邮件策略flask_mail.message_policy,或者我们可以生成其他message-ID。

仅当您使用Python 3.3或更高版本时,电子邮件策略才可用,但是它是处理折叠的策略对象,因此使我们能够更改如何处理Message-ID和其他RFC 5322标识符标头。这是一个不会折叠Message-ID标头的子类;该标准实际上允许一行上最多998个字符,并且此子类仅对此标头使用该限制:

import flask_mail
from email.policy import EmailPolicy, SMTP

# Headers that contain msg-id values, RFC5322
MSG_ID_HEADERS = {'message-id', 'in-reply-to', 'references', 'resent-msg-id'}

class MsgIdExcemptPolicy(EmailPolicy):
    def _fold(self, name, value, *args, **kwargs):
        if (name.lower() in MSG_ID_HEADERS and
            self.max_line_length <998 and
            self.max_line_length - len(name) - 2 

在Python 2.7或Python 3.2或更旧的版本上,您必须诉诸于替换Message-Id标头,只需使用硬编码域名重新生成标头即可:

from flask import current_app
from flask_mail import Message as _Message

# set this to your actual domain name
DOMAIN_NAME = 'example.com'

class Message(_Message):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # work around issues with Microsoft Office365 / Outlook.com email servers
        # and their inability to handle RFC2047 encoded Message-Id headers. The
        # Python email package only uses RFC2047 when encoding *long* message ids,
        # and those happen all the time on Heroku, where the hostname includes a
        # full UUID as well as 5 more components, e.g.
        # aaf39fce-569e-473a-9453-6862595bd8da.prvt.dyno.rt.heroku.com
        # The work-around is to just use our own domain name, hard-coded, but only
        # when the message-id length exceeds 77 characters (MIME allows 78, but one
        # is used for a leading space)
        if len(self.msgId) > 77:
            domain = current_app.config.get('MESSAGE_ID_DOMAIN', DOMAIN_NAME)
            self.msgId = make_msgid(domain=domain)

然后,您将使用上述Message类而不是flask_mail.Message()该类,它将生成一个较短的Message-ID标头,该标头不会与Microsoft有问题的标头解析器发生冲突。

我向Python项目提交了一个错误报告,以跟踪msg-id令牌的处理,因为我怀疑这确实应该在那里解决。


推荐阅读
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
灰色头像6888
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有