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

Stu*_*Cat 10 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)
Run Code Online (Sandbox Code Playgroud)

如果我写一个示例消息,例如,让我们说它"Hi there\n how are you?"工作正常,但让我说我尝试发送一个网址http://www.neopets.com,电子邮件发送空白.我相信':'这个问题的原因,所以我试图逃避它,但没有.

msw*_*msw 15

问题是,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
Run Code Online (Sandbox Code Playgroud)

虽然这是合法邮件标题,但邮件传输代理和邮件用户代理应忽略他们不理解的明显标题字段.并且因为RFC822标头一直持续到第一个空行并且http:看起来像标题行,所以它被解析为好像它是标题.如果给出换行符:

mensaje = '\nhttp://www.example.com'
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作.虽然电子邮件技术上只需要smtplib邮件内容提供的"信封",如果您希望收件人(及其邮件程序)能够很好地处理邮件,您应该使用电子邮件模块生成正文.

添加

基于doctest,smtplib.py它看起来好像这是一个有意的功能,允许调用者sendmail()附加到标题:

     >>> msg = '''\\
     ... From: Me@my.org
     ... Subject: testin'...
     ...
     ... This is a test '''
     >>> s.sendmail("me@my.org", tolist, msg)
Run Code Online (Sandbox Code Playgroud)

其中From:Subject:线是我上面提到的"漂亮"标题的一部分.