我有一些python代码,可以发送带有嵌入在"<a href="link">Link</a>"标记中的urls的电子邮件。
单击来自Gmail或Outlook 365 web邮件客户端的链接会导致页面断开,这是因为它们似乎都在URL中插入了原始空格字符或'%20‘。有趣的是,这似乎发生在两个客户端的相同位置。
该链接是一个Kibana仪表板链接,因此有嵌入的Rison代码。
链接应如下所示:
<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‘,要么是一个空格在这里被注入:
query:'*')),%20uiState我使用python的smtplib模块对消息进行编码并发送电子邮件,具体操作如下:
htmlEnc = MIMEText(body, 'html')不确定为什么空间会被注入,所以任何帮助都会非常感谢。
发布于 2017-05-27 07:30:31
我在PHP中遇到了同样的问题,比如发送电子邮件。对我来说,问题是每行1000个字符的问题,它会自动导致在第1000个字符处插入换行符...这可能就是你的网址。为了修复PHP发送的电子邮件中的问题,首先我在电子邮件标题中添加了Content-Transfer-Encoding: quoted-printable。其次,我通过PHP函数quoted_printable_encode()处理我的电子邮件正文。我不知道Python等效函数,但希望我对同类问题的解决方案能为您指明正确的方向。
发布于 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()方法。
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服务器转发的。
https://stackoverflow.com/questions/39168914
复制相似问题