我当前的脚本允许我发送电子邮件,但它不喜欢某些字符,特别是本示例中的':'
。
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
,电子邮件发送空白。我认为':'
导致了这个问题,所以我尝试逃避它,但没有任何结果。
3条答案
按热度按时间disho6za1#
问题是
smtplib
没有在消息头和消息正文之间放置空行,如我的测试的“Show Original”表单中所示:虽然这是一个法律的的邮件标头,但是邮件传输代理和邮件用户代理应该忽略它们不理解的明显标头字段。而且因为RFC822标头一直延续到第一个空行,并且
http:
看起来像一个标头行,所以它被解析为一个标头。如果给定一个换行符:虽然电子邮件技术上只需要
smtplib
提供的“信封”,但是如果你希望你的收件人(和他们的发件人)能很好地处理邮件,邮件的内容应该更完整,你可能应该使用email模块来生成正文。已添加
根据
smtplib.py
中的doctest,看起来这似乎是一个有意的特性,允许sendmail()
的调用者附加到头部:其中
From:
和Subject:
行是我上面提到的“nice”头文件的一部分。t8e9dugd2#
正确的解决方案是使用Python
email
库来创建有效的消息,而不是煞费苦心地学习(或胡乱猜测)如何通过将文本片段连接在一起来构造有效的MIME消息结构。只包含ASCII码的简单RFC822消息可以很容易地用
但是,如果您需要其他字符集、超过80个字符的行、非纯文本的内容类型,或者比1990年的纯文本英语电子邮件更高级的任何内容,则代码应该如下所示
这是公认的稍微冗长一点,但也是无限通用、健壮和可扩展的。
这使用了Python 3.6中正式引入的
EmailMessage
API。新代码可能应该针对这个平台,而不是早期版本的遗留email.Message
模块(或MIMEMultipart
,MIMEText
等组件),尽管你能找到的大多数在线代码示例都是针对旧Python库的。请参见the Pythonemail
examples documentation了解一些快速示例。yqyhoc1h3#
我不认为这是关于冒号,但它是关于
http://
开始的消息。全部失败,但是:
一切顺利。