Найти - Пользователи
Полная версия: Подскажите что то готовое для рассылки писем.
Начало » Network » Подскажите что то готовое для рассылки писем.
1 2
ivn
Подскажите, что то готовое для рассылки писем?
есть подозрения, что стандартным модулем, блочат как спам, например на google.com
ivn
 # -*- 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()
PooH
Не суть важно чем рассылать. Важно правильно прописать записи SPF и DKIM для домена . Правильно настроить подпись DKIM на почтовом сервере. И следить за оформлением письма.
ivn
доступа по настройке сервера нет
по началу грешу вот на эти вещи:

import quopri
 def QuoHead(String):
    s = quopri.encodestring(String.encode('UTF-8'), 1, 0)
    return "=?utf-8?Q?" + s.decode('UTF-8') + "?=
ivn
собственно то, чего приходит обратно, и если отправлять через outlook, то всё норм.
 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
PooH
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))
Гугль проглатывает, но SPF и DKIM настроены.
ivn
если пройти по ссылке. которая возвращается, то там есть такой текст:

 Сообщения должны содержать действительное значение в поле заголовка "Message-ID:".
вот про этот момент не скажите?
 msg['Message-ID'] = email.utils.make_msgid()
PooH
ivn
msg = email.utils.make_msgid()
Ну это оно и есть генерируется уникальный идентификатор для письма. email.utils.make_msgid
ivn
нашелся вот такая проблема:

в коде:
 mail_from   = fromaddr
если fromaddr это строка которая выглядит вот так:
 'ООО Рога и копыта <mymail@from.addr>'

то гугл отбрасывает это письмо
и если читать дальше ту ссылку от гугл, то там есть:

Доменные имена в полях “envelope From”, “payload From”, “reply-to” и “sender”, а также имя аутентифицируемого домена, должны полностью соответствовать требованиям раздела “Highly Restrictive”, перечисленным в спецификациях Unicode Security Profile для международных доменных имен.

т.е. что то с преобразованием mail_from
pyuser
 In [1]: from email.utils import formataddr
In [2]: formataddr(("ООО Рога и копыта", "mymail@from.addr"))
Out[2]: '=?utf-8?b?0J7QntCeINCg0L7Qs9CwINC4INC60L7Qv9GL0YLQsA==?= <mymail@from.addr>'
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