Python Gmail和Outlook在超链接URL中插入空格

Python Gmail和Outlook在超链接URL中插入空格,python,email,url,kibana,smtplib,Python,Email,Url,Kibana,Smtplib,我有一些python代码,它发送电子邮件时将URL嵌入“标记中 单击来自Gmail或Outlook 365 web mail客户端的链接会导致页面断开,因为这两个链接似乎都在URL中插入了原始空格字符或“%20”。有趣的是,这似乎发生在两个客户端的同一位置 该链接是Kibana仪表板链接,因此有嵌入式代码 链接应如下所示: <a href="http://localhost:5601/app/kibana?#/visualize/edit/BetterPie?_g=(refreshInte

我有一些python代码,它发送电子邮件时将URL嵌入
标记中

单击来自Gmail或Outlook 365 web mail客户端的链接会导致页面断开,因为这两个链接似乎都在URL中插入了原始空格字符或“%20”。有趣的是,这似乎发生在两个客户端的同一位置

该链接是Kibana仪表板链接,因此有嵌入式代码

链接应如下所示:

<a href="http://localhost:5601/app/kibana?#/visualize/edit/BetterPie?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-60d,mode:quick,to:now))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:breed,negate:!f,value:'lion'),query:(match:(breed:(query:lion,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:age,negate:!f,value:'2'),query:(match:(age:(query:2,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:name,negate:!f,value:'nala'),query:(match:(name:(query:nala,type:phrase))))),linked:!f,query:(query_string:(analyze_wildcard:!t,query:'*')),uiState:(spy:(mode:(fill:!f,name:!n))),vis:(aggs:!((id:'1',params:(),schema:metric,type:count),(id:'2',params:(field:breed,order:desc,orderBy:'1',size:5),schema:segment,type:terms),(id:'3',params:(field:age,order:desc,orderBy:'1',size:5),schema:segment,type:terms),(id:'4',params:(field:name,order:desc,orderBy:'1',size:5),schema:segment,type:terms)),listeners:(),params:(addLegend:!t,addTooltip:!t,isDonut:!f,shareYAxis:!t),title:'BetterPie',type:pie))">Dashboard Link</a>
htmlEnc = MIMEText(body, 'html')
我使用python的模块对消息进行编码并发送电子邮件,方法如下:

<a href="http://localhost:5601/app/kibana?#/visualize/edit/BetterPie?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-60d,mode:quick,to:now))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:breed,negate:!f,value:'lion'),query:(match:(breed:(query:lion,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:age,negate:!f,value:'2'),query:(match:(age:(query:2,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:'animals',key:name,negate:!f,value:'nala'),query:(match:(name:(query:nala,type:phrase))))),linked:!f,query:(query_string:(analyze_wildcard:!t,query:'*')),uiState:(spy:(mode:(fill:!f,name:!n))),vis:(aggs:!((id:'1',params:(),schema:metric,type:count),(id:'2',params:(field:breed,order:desc,orderBy:'1',size:5),schema:segment,type:terms),(id:'3',params:(field:age,order:desc,orderBy:'1',size:5),schema:segment,type:terms),(id:'4',params:(field:name,order:desc,orderBy:'1',size:5),schema:segment,type:terms)),listeners:(),params:(addLegend:!t,addTooltip:!t,isDonut:!f,shareYAxis:!t),title:'BetterPie',type:pie))">Dashboard Link</a>
htmlEnc = MIMEText(body, 'html')

我不知道为什么会注入空间,所以非常感谢您的帮助。

我在PHP中遇到了发送电子邮件的相同问题。对我来说,问题是每行1000个字符,这会自动导致在第1000个字符处插入换行符。。。这可能只是你的URL。为了解决PHP发送电子邮件中的问题,首先我在电子邮件标题中添加了内容传输编码:quoted printable。其次,我通过PHP函数quoted_printable_encode()处理电子邮件正文。我不知道Python的等效函数,但希望我对同一类型问题的解决方案能帮助您找到正确的方向。

问题是电子邮件行最多只能包含998个字符。如果您向Postfix服务器发送的电子邮件行较长,Postfix将在将邮件转发到最终目的地之前在邮件中插入换行符。换行符在HTML电子邮件中被视为空格

你不应该发送超过998个字符的电子邮件;事实上,标准每行最多78个字符。发送行长超过998个字符的HTML的一种方法是使用所谓的
内容传输编码
,例如引号可打印或base64。幸运的是,如果您使用的是
email
Python标准模块,那么可以通过以下方式实现

您应该使用一个实例调用该方法,该实例指定引用的printable的内容传输编码

from email.charset import Charset, QP
import email.message
def fix_content_transfer_encoding(message: email.message.Message):
    charset = Charset('utf-8')
    charset.body_encoding = QP
    message.set_charset(charset)
Django项目默认使用Django 1.10以后的可打印报价;看



关于电子邮件中的行长度限制:并非所有邮件服务器都像Postfix软件那样严格遵守998字符的限制。事实上,Yahoo webmail客户端很乐意发送带有引用的无效电子邮件:-标题长度超过998个字符。由于Yahoo严格的DMARC策略要求引用:中间邮件服务器不会更改标题,这将导致合法的雅虎邮件被DMACC拒绝,如果它通过一个不经意的后缀服务器转发。

是否可以考虑中间URL缩短/重定向作为隐藏来自Webmail客户端的真正URL的方法?默认情况下,出于跟踪目的,电子邮件服务提供商在所有电子邮件链接上都这样做。@Revert这是一个选项,但我不确定这是否能100%解决问题。由于电子邮件正文的长度,客户端可能正在插入空格,因此即使url链接较短,空格也可能会出现,因为html中添加了其他信息。我无法100%确认,但如果我没记错的话,电子邮件中的url限制为256个字符。甚至可能更少。但由于您的URL没有被截断,情况就不同了。关于电子邮件中的空格,它是文字渲染引擎,在假想的纸张结尾处添加空格,但同样,当您添加%20时,它也是不同的,这是不同的..@Revert Right,看起来文字渲染引擎中的空格不是“”字符,而是分页符和格式问题您是否使用
email
Python标准模块来格式化电子邮件?请在您的问题中说明这一点,因为解决方案将取决于您如何格式化和编码您的电子邮件。
smtplib
标准模块不进行任何电子邮件编码,它只负责SMTP通信。