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

标签 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)

如果我写了一条示例消息,比如说 “嗨,你好\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/

相关文章:

javascript - i18next html 转义 - 服务器端生成的电子邮件需要

java - 如何在电子邮件中包含表格

python - 如何在 Python 中使用 smtplib 通过电子邮件发送 .html 文件

python - Heroku、Flask、Flask-Mail、Gmail

python - 导入结果不一致

python - 使用 SMTPLib Python 时获取未经授权的发件人地址

python - 你如何在tensorflow中创建一个初始模块

python - 鸭嘴兽的奇怪问题(从脚本制作 .app 包)

python - Bash 或 GoogleCL : new line in a string parameter

python - 如何用 HTML 标记显示文本? (我使用ckeditor)