我当前的脚本允许我发送电子邮件,但是只有一些它不喜欢的字符,特别是此示例中的':'
。
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?"
它可以正常工作,但是假设我尝试发送网址http://www.neopets.com
,电子邮件将被发送为空白。我相信':'
导致了这个问题,所以我试图逃避它,但没有。
答案 0 :(得分:14)
问题是smtplib
没有在邮件标题和邮件正文之间添加一个空行,如我的测试的“显示原始”格式所示:
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
提供的“信封”,但如果您希望收件人(及其邮寄者)能够很好地处理邮件,邮件内容应该更加完整,您应该使用{{3模块生成正文。
<强>加入强>
根据smtplib.py
中的doctest,看起来好像这是一个故意的功能,允许sendmail()
的来电者附加到标题:
>>> msg = '''\\
... From: Me@my.org
... Subject: testin'...
...
... This is a test '''
>>> s.sendmail("me@my.org", tolist, msg)
From:
和Subject:
行是我上面提到的“漂亮”标题的一部分。
答案 1 :(得分:0)
我不认为这是关于冒号的,但它是关于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')
很好。
答案 2 :(得分:0)
正确的解决方案是使用Python email
库创建有效的消息,而不是费力地学习(或随意猜测)如何通过将文本片段连接在一起来构造有效的MIME消息结构。 / p>
可以轻松创建仅包含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年),代码应类似于< / p>
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')
虽然它冗长一些,但也具有更多的通用性,鲁棒性和可扩展性。
这使用了EmailMessage
API,该API在Python 3.6中正式引入。新代码应该针对该平台,而不是早期版本的旧email.Message
模块,尽管您可以找到的大多数在线代码示例都是针对较旧的Python库的。
答案 3 :(得分:-2)
在此行:
server = smtplib.SMTP('smtp.gmail.com:587')
在587
之前用逗号替换冒号。