首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Gmail和Outlook在超链接URL中插入空格

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

Stack Overflow用户
提问于 2016-08-26 22:40:58
回答 2查看 2.2K关注 0票数 2

我有一些python代码,可以发送带有嵌入在"<a href="link">Link</a>"标记中的urls的电子邮件。

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

该链接是一个Kibana仪表板链接,因此有嵌入的Rison代码。

链接应如下所示:

代码语言:javascript
运行
复制
<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>

但它要么是'%20‘,要么是一个空格在这里被注入:

代码语言:javascript
运行
复制
query:'*')),%20uiState

我使用python的smtplib模块对消息进行编码并发送电子邮件,具体操作如下:

代码语言:javascript
运行
复制
htmlEnc = MIMEText(body, 'html')

不确定为什么空间会被注入,所以任何帮助都会非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2017-05-27 07:30:31

我在PHP中遇到了同样的问题,比如发送电子邮件。对我来说,问题是每行1000个字符的问题,它会自动导致在第1000个字符处插入换行符...这可能就是你的网址。为了修复PHP发送的电子邮件中的问题,首先我在电子邮件标题中添加了Content-Transfer-Encoding: quoted-printable。其次,我通过PHP函数quoted_printable_encode()处理我的电子邮件正文。我不知道Python等效函数,但希望我对同类问题的解决方案能为您指明正确的方向。

票数 4
EN

Stack Overflow用户

发布于 2017-05-27 07:57:19

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

您不应该发送行长于998个字符的电子邮件;事实上,标准的recommends不能超过每行78个字符。发送行长于998个字符的超文本标记语言的一种方法是使用所谓的Content-Transfer-Encoding,如quoted-printable或base64。幸运的是,如果您使用的是email Python标准模块,则可以按如下方式实现。

您应该使用指定quoted-printable的Content-Transfer-Encoding的Charset实例来调用Message.set_charset()方法。

代码语言:javascript
运行
复制
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 1.10开始,Django项目默认使用quoted-printable;请参阅Django #22561 (EmailMessage should respect RFC2822 on max line length)

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39168914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档