我当前的脚本允许我正常发送电子邮件,但它不喜欢某些字符,尤其是此示例中的 ':'
。
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)
如果我写了一条示例消息,比如说 “嗨,你好\n 你好吗?”
它工作正常,但假设我尝试发送一个 url http://www.neopets.com
,电子邮件发送空白。我相信 ':'
导致了这个问题,所以我尝试转义它,但没有成功。
最佳答案
问题是 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
尽管这是一个合法的邮件 header ,但邮件传输代理和邮件用户代理应该忽略它们不理解的明显 header 字段。并且因为 RFC822 header 一直持续到第一个空行并且 http:
看起来像一个 header 行,所以它被解析为一个 header 。如果给定一个换行符:
mensaje = '\nhttp://www.example.com'
然后它按预期工作。尽管电子邮件在技术上只需要 smtplib
提供的“信封”,但如果您希望收件人(及其邮寄者)善待邮件,邮件的内容应该更完整,您应该使用email生成正文的模块。
已添加
根据 smtplib.py
中的 doctest,看起来这是一个有意的功能,允许 sendmail()
的调用者附加到 header :
>>> msg = '''\\
... From: Me@my.org
... Subject: testin'...
...
... This is a test '''
>>> s.sendmail("me@my.org", tolist, msg)
From:
和 Subject:
行是我上面提到的“漂亮”标题的一部分。
关于python - 如果消息包含某些字符,smtplib 将发送空白消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11796664/