Найти - Пользователи
Полная версия: Отправка почты через smtplib
Начало » Python для экспертов » Отправка почты через smtplib
1 2
regall
Помогите, пожалуйста. Отправляю почту с использованием smtplib. Все отлично работает, но вот только не знаю, как указать такие параметры письма как тип, кодировка и тема.
Заранее спасибо!
j2a
А это делает не smtplib, а email
ZAN
А именно так:
mail = MIMEText('Only right now! MAX-GAIN+ by 10$!!!', 'plain', 'latin-1')
mail['From'] = 'Spam-bot'
mail['To'] = 'Vasya Pupkin'
mail['Subject'] = 'Enhance ... '
'''Перед отправлением нужно сформатировать сообщение в строку, используя метод as_string'''
server = smtplib.SMTP(host)
server.sendmail(from_addr, to_addr, mail.as_string())
regall
Большое спасибо вам, уже во всем разобрался.
regall
Хотя я сделал не так как ты написал, ZAN, а через объект Message(). Есть какие-нибудь преимущества предложенного тобой способа ?
ZAN
Фактически, именно в данном примере преимуществ нет, однако Message - это просто базовый класс для остальных MIME объектов и использовать его напрямую не следует.
sources
class Message:
“”"Basic message object… ‘'’
Вот с какими проблемами можно столкнуться:
Допустим, создается базовый объект письма.
mail = Message()
mail['To'] = 'smbd'
Теперь к нему нужно добавить текст сообщения. Для этого можно воспользоваться методами mail.attach(payload) или же mail.set_payload(payload)
Допустим, мы захотим использовать первый способ
documentation
attach( payload)
Add the given payload to the current payload, which must be None or a list of Message objects before the call. After the call, the payload will always be a list of Message objects. If you want to set the payload to a scalar object (e.g. a string), use set_payload() instead.
Но! Как бы мы ни приаттачивали текст сообщения (в виде списка, либо отдельного аргумента), будет вываливатся ошибка, что payload - не строка (при вызове метода as_string).
А со вторым все прекрасно работает
>>> mail.set_payload('my text')
>>> mail.as_string()
'\nmy text'
Однако, как в таком случае приаттачить, например, файл, не ясно. Если, конечно, предварительно не сформатировать текст так, чтобы в нее уже был включен приаттаченый элемент. Но! Пакет email как-раз и предназначен для форматирования!

А теперь, как для этого используются MIME объекты:
Если письмо - простой текст, то мой пример выше, если текст с приаттаченым файлом, то будут небольшие изменения - корневым элементом письма будет уже экземпляр класса MIMEMultipart.
mail = MIMEMultipart()
Текст письма создается, как и в предыдущем случае - через MIMEText, а приаттаченый файл - MIME объектом соответствующего типа. В случае, положим, зип-файла - это MIMEApplication.
msg = MIMEText('my text')
input = open('myzip.zip', 'rb')
attachment = MIMEApplication(input.read(), 'zip')
input.close()
attachment.add_header('Content-Disposition', 'attachment', filename='filename_in_the_letter.zip')
mail.attach(msg)
mail.attach(attachment)
mail.as_string()
regall
Большое спасибо за достаточно полное объяснение проблемы.
Ferroman
Отлично, действительно познавательно, спасибо.
Scarfer
Помогите решить проблему.
Отправляю почт:

s = smtplib.SMTP(server, port)
#s.set_debuglevel(1)
s.starttls()
s.ehlo()
s.login(user_name, user_passwd)
s.sendmail(me, you, msg.as_string())
s.quit()

и выдает вот такую вот ошибку:

File “E:\Scripts\Письмо.py”, line 36, in <module>
s.login(user_name, user_passwd)
File “C:\Program Files\Python25\lib\smtplib.py”, line 554, in login
raise SMTPException(“SMTP AUTH extension not supported by server.”)
SMTPException: SMTP AUTH extension not supported by server.
evgenyl
ваш сервер скорее всего не поддерживает plain аутентификацию
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB