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 theren how are you?" он работает нормально, но, скажем, я пытаюсь отправить url http://www.neopets.com, сообщение отправляется пустым. Я верю ':' вызывает эту проблему, поэтому я попытался избежать ее, но ничего.

2 ответов


проблема в том, что 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: выглядит как строка заголовка, она будет воспринята как если бы это был заголовок. Если бы дали newline:

mensaje = '\nhttp://www.example.com'

тогда он работает так, как ожидалось. Хотя электронная почта технически нуждается только в "конверте", как предусмотрено smtplib содержимое почты должно быть более полным, если вы ожидаете, что ваши получатели (и их отправители) будут хорошо относиться к сообщению, вы, вероятно, должны использовать почта модуль для генерации тела.

добавил

на основе doctest в smtplib.py похоже, что это преднамеренная функция разрешение вызывающему sendmail() добавить к заголовку:

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

здесь From: и Subject: строки являются частью" хороших " заголовков, о которых я упоминал выше.


Я не думаю, что это о толстой кишке, но это о 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')

приходит через хорошо.