python 如果消息包含某些字符,smtplib将发送空白消息

yrdbyhpb  于 2022-11-21  发布在  Python
关注(0)|答案(3)|浏览(135)

我当前的脚本允许我发送电子邮件,但它不喜欢某些字符,特别是本示例中的':'

import smtplib, sys

mensaje = sys.argv[1]
def mailto(toaddrs, msg):
    fromaddr = 'myemailblabla'

    username = 'thisismyemail'
    password = '122344'

    server = smtplib.SMTP('smtp.gmail.com:587')
    server.starttls()
    server.login(username, password)
    server.sendmail(fromaddr, toaddrs, msg)
    server.quit()

mailto('test@gmail.com', mensaje)

如果我写了一个示例邮件,比如"Hi there\n how are you?",它工作正常,但是假设我试图发送一个url http://www.neopets.com,电子邮件发送空白。我认为':'导致了这个问题,所以我尝试逃避它,但没有任何结果。

disho6za

disho6za1#

问题是smtplib没有在消息头和消息正文之间放置空行,如我的测试的“Show Original”表单中所示:

Return-Path: <me@gmail.com>
Received: **REDACTED**
        Fri, 03 Aug 2012 06:56:20 -0700 (PDT)
Message-ID: <501bd884.850c320b@mx.google.com>
Date: Fri, 03 Aug 2012 06:56:20 -0700 (PDT)
From: me@gmail.com
http: //www.example.com

虽然这是一个法律的的邮件标头,但是邮件传输代理和邮件用户代理应该忽略它们不理解的明显标头字段。而且因为RFC822标头一直延续到第一个空行,并且http:看起来像一个标头行,所以它被解析为一个标头。如果给定一个换行符:

mensaje = '\nhttp://www.example.com'

虽然电子邮件技术上只需要smtplib提供的“信封”,但是如果你希望你的收件人(和他们的发件人)能很好地处理邮件,邮件的内容应该更完整,你可能应该使用email模块来生成正文。

已添加

根据smtplib.py中的doctest,看起来这似乎是一个有意的特性,允许sendmail()的调用者附加到头部:

>>> msg = '''\\
     ... From: Me@my.org
     ... Subject: testin'...
     ...
     ... This is a test '''
     >>> s.sendmail("me@my.org", tolist, msg)

其中From:Subject:行是我上面提到的“nice”头文件的一部分。

t8e9dugd

t8e9dugd2#

正确的解决方案是使用Python email库来创建有效的消息,而不是煞费苦心地学习(或胡乱猜测)如何通过将文本片段连接在一起来构造有效的MIME消息结构。
只包含ASCII码的简单RFC822消息可以很容易地用

"From: {0}\nTo: {1}\nSubject: {2}\n\n{3}".format(
    fromaddr, toaddr,
    "Hello, I am the exiled prince of Ubandingba",
    "http://clickme.example.net/scam/")

但是,如果您需要其他字符集、超过80个字符的行、非纯文本的内容类型,或者比1990年的纯文本英语电子邮件更高级的任何内容,则代码应该如下所示

from email.message import EmailMessage

msg = EmailMessage()
msg["from"] = fromaddr
msg["to"] = toaddr
msg["subject"] = "You have been nominated for the Nobel prize"
msg.set_content("http://scam.example.org/clickme")

这是公认的稍微冗长一点,但也是无限通用、健壮和可扩展的。
这使用了Python 3.6中正式引入的EmailMessage API。新代码可能应该针对这个平台,而不是早期版本的遗留email.Message模块(或MIMEMultipartMIMEText等组件),尽管你能找到的大多数在线代码示例都是针对旧Python库的。请参见the Python email examples documentation了解一些快速示例。

yqyhoc1h

yqyhoc1h3#

我不认为这是关于冒号,但它是关于http://开始的消息。

mailto('test@gmail.com', 'http://www.url.com')
mailto('test@gmail.com', 'http://www.url.com that is a url')
mailto('test@gmail.com', ' http://www.url.com')

全部失败,但是:

mailto('test@gmail.com', 'Here is a url http://www.url.com')

一切顺利。

相关问题