получить пустое письмо - PullRequest
0 голосов
/ 09 марта 2019

Я быстро написал ниже код для отправки данных, отправляемых на удаленный сервер REST для отладки, но я получаю пустое письмо.теперь уверен, что идет не так.в теле терминала печатается текстовый или конвертированный json текст, но ничего не получается по электронной почте.

# For testing
def sendMail(usr, pwd, to, body):
    """ just for testing to send error via email
    """
    fromaddr = usr
    toaddr = to
    msg = MIMEMultipart()
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = "Data add request"
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(usr, pwd)
        msg.attach(body)
        r = json.dumps(body)
        loaded_r = json.loads(r)
        print "json: ", str(loaded_r)
        server.sendmail("error-report@do_not_reply.com", to,  str(loaded_r))
    except Exception, err:
        print 'Error sending email: ', err
    finally:
        server.quit()

Я пытался отправить server.sendmail("error-report@do_not_reply.com", to, body), но при этом тоже отправлялось пустое письмо без темы.что я делаю не так?

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Сообщение, которое вы передаете в качестве третьего аргумента sendmail, должно быть правильным, правильно отформатированным сообщением RFC822. Файл JSON по определению не является действительным сообщением электронной почты.

def sendMail(usr, pwd, to, body):
    msg = MIMEText(body)
    msg['From'] = usr
    msg['To'] = to
    msg['Subject'] = "Data add request"
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(usr, pwd)
        server.send_message("error-report@do_not_reply.com", [to],  msg)
    except Exception, err:
        print 'Error sending email: ', err
    finally:
        server.quit()

Я переключился на send_message здесь, потому что он позаботился о незначительной мирской детали преобразования объекта email.Message в строковый объект перед вызовом sendmail.

Неясно, ожидаете ли вы, что тело будет текстовой частью, отображающей содержимое строки body, или вложение JSON, содержащее body в качестве JSON, или, возможно, оба.

Если вам нужна только одна часть тела, создание сообщения из нескольких частей, очевидно, не нужно. Если вам нужно несколько частей, то каждая из них должна быть отдельным MIMEText или каким-либо другим типом контейнера MIME, который вы можете msg.attach() до верхнего уровня MIMEMultipart.

0 голосов
/ 09 марта 2019

Я думаю, что это сообщение: вы должны поставить для сообщения

text = loaded_r.as_string()

И тогда вы можете отправить письмо.

server.sendmail("error-report@do_not_reply.com", to,  text)
...