如果邮件包含某些字符,smtplib将发送空白邮件

时间:2012-08-03 13:25:36

标签: python email smtplib

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

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,电子邮件将被发送为空白。我相信':'导致了这个问题,所以我试图逃避它,但没有。

4 个答案:

答案 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之前用逗号替换冒号。