Python: тема не отображается при отправке электронной почты с использованием модуля smtplib

Я успешно могу отправлять электронную почту с помощью модуля smtplib. Но при отправке письма тема письма не указывается.

import smtplib

SERVER = <localhost>

FROM = <from-address>
TO = [<to-addres>]

SUBJECT = "Hello!"

message = "Test"

TEXT = "This message was sent with Python's smtplib."
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()

Как мне написать "server.sendmail", чтобы включить ТЕМУ в отправленное электронное письмо.

Если я использую server.sendmail (FROM, TO, message, SUBJECT), он выдает ошибку о "smtplib.SMTPSenderRefused"


person nsh    schedule 29.08.2011    source источник


Ответы (7)


Прикрепите его как заголовок:

message = 'Subject: {}\n\n{}'.format(SUBJECT, TEXT)

а потом:

server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, message)
server.quit()

Также рассмотрите возможность использования стандартного модуля Python email - он очень поможет вам при составлении писем.

person Roman Bodnarchuk    schedule 29.08.2011
comment
К сожалению, в 2021 году это добавит тему в тело сообщения. - person Theo F; 02.07.2021

попробуй это:

import smtplib
from email.mime.multipart import MIMEMultipart
msg = MIMEMultipart()
msg['From'] = 'sender_address'
msg['To'] = 'reciver_address'
msg['Subject'] = 'your_subject'
server = smtplib.SMTP('localhost')
server.sendmail('from_addr','to_addr',msg.as_string())
person Hackaholic    schedule 16.10.2014
comment
Что насчет тела сообщения? Куда это идет? - person Dss; 21.01.2015
comment
В итоге я вставил в тело docs.python.org/ 2 / library / email-examples.html # id5 - person Nico; 10.10.2016
comment
В текущей версии Python эта функция теперь управляется email.message.MailMessage. - person chiffa; 24.06.2020

Это будет работать с Gmail и Python 3.6+ с использованием нового объекта «EmailMessage»:

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg.set_content('This is my message')

msg['Subject'] = 'Subject'
msg['From'] = "[email protected]"
msg['To'] = "[email protected]"

# Send the message via our own SMTP server.
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.login("[email protected]", "password")
server.send_message(msg)
server.quit()
person emehex    schedule 07.08.2019
comment
Это лучший ответ для Python 3.6+. Спасибо! - person prrao; 22.12.2020

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

from smtplib import SMTP as smtp
from email.mime.text import MIMEText as text

s = smtp(server)

s.login(<mail-user>, <mail-pass>)

m = text(message)

m['Subject'] = 'Hello!'
m['From'] = <from-address>
m['To'] = <to-address>

s.sendmail(<from-address>, <to-address>, m.as_string())

Очевидно, переменные <> должны быть фактическими строковыми значениями или допустимыми переменными, я просто заполнил их как заполнители. У меня это работает при отправке сообщений с темами.

person g.d.d.c    schedule 29.08.2011
comment
Я получаю следующую ошибку: из email.mime.text импортируйте MIMEText как текст ImportError: нет модуля с именем mime.text - person nsh; 29.08.2011
comment
@nsh - с какой версией Python? Я использую 2.6.6 в этой конкретной установке. Вполне возможно, что в 3.x он находится немного в другом месте. - person g.d.d.c; 29.08.2011

Думаю, вы должны включить его в сообщение:

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

код из: http://www.tutorialspoint.com/python/python_sending_email.htm

person Martin    schedule 29.08.2011
comment
Одно наблюдение: например, поля from, to и subject должны находиться в ОЧЕНЬ НАЧАЛЕ сообщения переменной, например, иначе поля не будут интерпретироваться так, как этого следовало ожидать. У меня был опыт простой вставки поля «Тема», а не в начале переменной, и сообщение приходило в почтовый ящик получателя без темы. Ваше здоровье. - person ivanleoncz; 18.01.2017

См. Примечание внизу документации smtplib:

In general, you will want to use the email package’s features to construct an email message, which you can then convert to a string and send via sendmail(); see email: Examples.

Вот ссылка на раздел примеров документации email, где действительно показано создание сообщения с темой. https://docs.python.org/3/library/email.examples.html

Похоже, что smtplib не поддерживает добавление темы напрямую и ожидает, что сообщение уже будет отформатировано с темой и т. Д. Вот где приходит на помощь модуль email.

person jeffcook2150    schedule 29.08.2011

С методом sendmail я использую следующее (в 3.9). Включите тему в сообщение, а затем добавьте две новые строки:

email_connection.sendmail(
    from_addr=my_email,
    to_addrs=to_email,
    msg="Subject:Working subject\n\nTest 2 from info email address with subject."
)
person Carewen    schedule 24.05.2021