Python smtplib с помощью Gmail: сообщения с телом более 35 символов никогда не принимаются - PullRequest
1 голос
/ 16 сентября 2011

У меня самая странная ошибка.Я использую smtplib для отправки электронной почты из учетной записи Gmail.Каждый раз, когда я запускаю скрипт, я вижу сообщение, отображаемое на вкладке «отправлено» учетной записи Gmail, которую я использую для отправки.Однако иногда не получают сообщение на принимающей стороне.

Я заметил корреляцию между длиной тела сообщения и получаю ли я его.Сообщение «foo» проходит через каждый раз, и мое желаемое сообщение длиной около 200 символов никогда не проходит.Я пытался отправлять сообщения с длинами тела от нуля до 60. Оба раза я пытался это сделать, все 60 отображаются в папке «sent» отправляющей учетной записи gmail, но в получающей учетной записи электронной почты отображается только следующее:

enter image description here

Вот код, который я использую для отправки сообщений:

    for i in range(100):
        mail('someaddress@gmail.com','testing limit',str(i) + "a"*i)

А вот функция почты:

def mail(to, subject, text, attach=None):

"""Sends an email, formatted as HTML to list of senders with an optional attachment.
Specifically, the 'to' argument must be a comma seperated list of email addresses.
'subject' and 'text' are what appear in the email subject and body, respectively and 
'attach' is a path to an attachment.
"""
msg = MIMEMultipart()

# build the email header
msg['From'] = 'A Concerned Robot'
msg['To'] = to
msg['Subject'] = subject

# attach our body text as html 
msg.attach(MIMEText(text,'html'))

# attach the attachment if its there
part = MIMEBase('application', 'octet-stream')
if attach is not None:
    part.set_payload(open(attach, 'rb').read())
    Encoders.encode_base64(part)
    part.add_header('Content-Disposition',
       'attachment; filename="%s"' % os.path.basename(attach))
    msg.attach(part)

# open up a line with the server
mailServer = smtplib.SMTP("smtp.gmail.com", 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()

# login, send email, logout
mailServer.login(conf.user, conf.pw)
mailServer.sendmail(conf.user, to, msg.as_string())
mailServer.close()

1 Ответ

2 голосов
/ 16 сентября 2011

Наиболее вероятным объяснением получения только подмножества отправляемых вами сообщений является то, что получатель их отбрасывает (проверяли ли вы папку со спамом?). FWIW, если я использую ваш сценарий, все 100 сообщений приходят.

Когда вы отправляете сообщение, вы можете получить отказ от Google или принять его для доставки. Когда Google пытается доставить сообщение, оно может быть отклонено (в этом случае вы должны получить уведомление о статусе доставки от Google) или оно может быть принято. Некоторые почтовые серверы могут сказать, что они принимают сообщение, но не доставляют его (возможно, отбрасывают или отправляют в карантин).

Таким образом, мы возвращаемся к исходной проблеме: почему вы не можете отправить свое сообщение из 200 символов? Давайте посмотрим, что происходит, когда мы пытаемся отправить только это сообщение:

>>> import smtplib
>>> s = smtplib.SMTP("smtp.gmail.com", 587)
>>> s.ehlo()
(250, 'mx.google.com at your service, [60.234.179.13]\nSIZE 35882577\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES')
>>> s.starttls()
(220, '2.0.0 Ready to start TLS')
>>> s.ehlo()
(250, 'mx.google.com at your service, [60.234.179.13]\nSIZE 35882577\n8BITMIME\nAUTH LOGIN PLAIN XOAUTH\nENHANCEDSTATUSCODES')
>>> s.login("username", "password")
(235, '2.7.0 Accepted')
>>> s.mail("sender")
(250, '2.1.0 OK n2sm1693666ybe.6')
>>> s.rcpt("recipient")
(250, '2.1.5 OK n2sm1693666ybe.6')
>>> s.data("Subject: " + ("a" * 200) + "\n\nThis is a test message.")
(250, '2.0.0 OK 1316147451 n2sm1693666ybe.6')
>>> s.quit()
(221, '2.0.0 closing connection n2sm1693666ybe.6')

Это было принято (поэтому проблема не существует), и оно также приходит (некоторые заголовки пропущены):

Received: by 10.223.158.77 with SMTP id e13cs10409fax;
        Thu, 15 Sep 2011 21:30:54 -0700 (PDT)
Received: by 10.100.214.1 with SMTP id m1mr1823145ang.134.1316147453266;
        Thu, 15 Sep 2011 21:30:53 -0700 (PDT)
Received: from mail-gx0-f178.google.com (mail-gx0-f178.google.com [209.85.161.178])
        by mx.google.com with ESMTPS id l19si1913755anm.182.2011.09.15.21.30.51
        (version=TLSv1/SSLv3 cipher=OTHER);
        Thu, 15 Sep 2011 21:30:52 -0700 (PDT)
Received: by mail-gx0-f178.google.com with SMTP id 21so2167851gxk.23
        for <tony.meyer@gmail.com>; Thu, 15 Sep 2011 21:30:51 -0700 (PDT)
Received: by 10.151.43.6 with SMTP id v6mr2088425ybj.402.1316147451688;
        Thu, 15 Sep 2011 21:30:51 -0700 (PDT)
Received: from somewhere ([60.234.179.13])
        by mx.google.com with ESMTPS id n2sm1693666ybe.6.2011.09.15.21.30.19
        (version=TLSv1/SSLv3 cipher=OTHER);
        Thu, 15 Sep 2011 21:30:51 -0700 (PDT)
Message-ID: <4e72d0fb.02a5960a.3f71.60b1@mx.google.com>
Date: Thu, 15 Sep 2011 21:30:51 -0700 (PDT)
Sender: Tony Meyer <address>
From: someone
Subject: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

This is a test message.

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

Ваш код содержит раздел для включения вложения. Включается ли это при сбое отправки? Это может быть причиной проблемы. RFC 5322 утверждает, что строки должны быть длиной не более 78 символов (хотя они могут быть длиной до 998) - возможно, пункт назначения вводит более строгое значение? (Предполагая, что ваши 200 символов находятся в одной строке). Если это так, то вы можете закодировать (например, quoted-printable или base64) тело или использовать продолжения, чтобы обернуть объект.

...