Подскажите, что то готовое для рассылки писем?
есть подозрения, что стандартным модулем, блочат как спам, например на google.com
# -*- coding: utf-8 -*- import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEBase from email.mime.multipart import MIMEMultipart from email.header import Header import email import os import quopri def QuoHead(String): s = quopri.encodestring(String.encode('UTF-8'), 1, 0) return "=?utf-8?Q?" + s.decode('UTF-8') + "?=" # Отправка писем с помощью Python. # Базовой кодировкой на моем сервере является UTF-8, отправлять письма мы будем в cp-1251, если есть необходимость использовать другие кодировки, замените в коде на свои. # Первым делом подкючаем нужные функции: def mail(mailhost, port, username, password, fromaddr, toaddr, subj, msg, name_of_folder_for_send=None): """ :rtype: object """ mail_from = fromaddr # отправитель mail_to = toaddr # получатель mail_text = msg # текст письма mail_subj = subj # заголовок письма mail_coding = 'windows-1251' attach_file = name_of_folder_for_send # прикрепляемый файл # Параметры SMTP-сервера smtp_server = mailhost smtp_port = port smtp_user = username # пользователь smtp smtp_pwd = password # пароль smtp # формирование сообщения multi_msg = MIMEMultipart() multi_msg['Subject'] = QuoHead(mail_subj).replace('=\n', '') multi_msg['From'] = QuoHead(mail_from).replace('=\n', '') multi_msg['To'] = QuoHead(mail_to).replace('=\n', '') multi_msg['Disposition-Notification-To'] = QuoHead(mail_from).replace('=\n', '') text = MIMEText(mail_text, 'plain', 'utf-8') multi_msg.attach(text) # присоединяем атач-файл if (os.path.exists(attach_file) and os.path.isfile(attach_file)): file = open(attach_file, 'rb') attachment = MIMEBase('application', "octet-stream") attachment.set_payload(file.read()) email.encoders.encode_base64(attachment) file.close() only_name_attach = Header(os.path.basename(attach_file), mail_coding) attachment.add_header('Content-Disposition', 'attachment; filename="%s"' % only_name_attach.encode('cp1251')) multi_msg.attach(attachment) else: if (attach_file.lstrip() != ""): print("Файл для атача не найден - " + attach_file) # отправка smtp = smtplib.SMTP(smtp_server, smtp_port) smtp.ehlo() smtp.sendmail(mail_from, mail_to, multi_msg.as_string()) smtp.quit()
def QuoHead(String): s = quopri.encodestring(String.encode('UTF-8'), 1, 0) return "=?utf-8?Q?" + s.decode('UTF-8') + "?=
The following message to <10*****26a@gmail.com> was undeliverable. The reason for the problem: 5.3.0 - Other mail system problem 550-'5.7.1 [**.***.***.180 12] Our system has detected that this message is\n5.7.1 likely unsolicited mail. To reduce the amount of spam sent to Gmail,\n5.7.1 this message has been blocked. Please visit\n5.7.1 https://support.google.com/mail/?p=UnsolicitedMessageError\n5.7.1 for more information. t26si*****3lja.39
ivnУ меня письмо вот так формируется, кусок из проекта
по началу грешу вот на эти вещи:import quopri def QuoHead(String): s = quopri.encodestring(String.encode('UTF-8'), 1, 0) return "=?utf-8?Q?" + s.decode('UTF-8') + "?=
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header from email.utils import formataddr @celery_app.task def send_email(sender, receivers, subject, message, message_html=None, attachments=(), send_personal=False, sender_title=None): if message_html and not sender_title: registry = celery_app.conf['PYRAMID_REGISTRY'] sender_title = registry.settings.get('email.sender.name') def send_for(receiver, to): if message_html: msg = MIMEMultipart('alternative') msg['From'] = formataddr((str(Header(sender_title, 'utf-8')), sender)) else: msg = MIMEMultipart('mixed') msg['From'] = sender msg['To'] = to msg['Subject'] = subject msg['Message-ID'] = email.utils.make_msgid() msg.attach(MIMEText(message.encode('utf-8'), 'plain', 'utf-8')) if message_html: msg.attach(MIMEText(message_html.encode('utf-8'), 'html', 'utf-8')) send_message_by_smtp(sender, receiver, msg) receivers = force_tuple(receivers) if send_personal: for receiver in receivers: send_for(receiver, receiver) else: send_for(receivers, ','.join(receivers))
Сообщения должны содержать действительное значение в поле заголовка "Message-ID:".
msg['Message-ID'] = email.utils.make_msgid()
ivnНу это оно и есть генерируется уникальный идентификатор для письма. email.utils.make_msgid
msg = email.utils.make_msgid()
mail_from = fromaddr
'ООО Рога и копыта <mymail@from.addr>'
In [1]: from email.utils import formataddr In [2]: formataddr(("ООО Рога и копыта", "mymail@from.addr")) Out[2]: '=?utf-8?b?0J7QntCeINCg0L7Qs9CwINC4INC60L7Qv9GL0YLQsA==?= <mymail@from.addr>'