получение пустого электронного письма

Я быстро написал приведенный ниже код для отправки данных на удаленный сервер REST для отладки, но я получаю пустое электронное письмо. теперь уверен, что происходит не так. в теле терминала текст dict или преобразованный в 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), но это тоже отправляет пустое письмо без темы. Что я делаю неправильно ?


person Ciasto piekarz    schedule 09.03.2019    source источник
comment
это не решает твою проблему? stackoverflow.com/questions/11796664/   -  person Mojtaba Kamyabi    schedule 09.03.2019
comment
Прямо сейчас, вероятно, было бы очень хорошим моментом начать думать о переносе вашего кода на рекомендованную и поддерживаемую версию языка Python, то есть на версию 3. Лично я в течение последних двух лет пытался перенести весь поддерживаемый мной код на Python 3 всякий раз, когда возникала необходимость в обслуживании, а я все еще далек от завершения.   -  person tripleee    schedule 10.03.2019


Ответы (2)


Сообщение, которое вы передаете в качестве третьего аргумента 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.

person tripleee    schedule 09.03.2019
comment
В Python 3.6+ есть новый улучшенный API, который использует EmailMessage вместо Message. Теперь код, вероятно, должен использовать этот API вместо этого и, вероятно, не вызывать различные конструкторы MIME напрямую, что было нормой для более старой версии библиотеки. Вкратце, msg = email.message.EmailMessage(policy=default), а затем вызывают его методы для добавления содержимого тела и / или вложений. - person tripleee; 15.04.2021

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

text = loaded_r.as_string()

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

server.sendmail("error-report@do_not_reply.com", to,  text)
person Parzifal Kali    schedule 09.03.2019