dimanjy
@dimanjy
Недопрограммист и полуинженер.

Не доходят письма с сайта на Django через Яндекс. Где копать?

Проклятье!!!

Пытаюсь отправлять письма для восстановления пароля из форума на Django по SMTP через smtp.yandex.ru. Почта для домена подключена и настроена. Проверял отправку с нескольких машин (включая сервер) на несколько разных ящиков на Gmail, Mail.ru и Яндексе. На все ящики приходит отлично и моментально, в "спам" не падает.

На радостях вывалил все в продакшн... и началось! Посыпался гнев от пользователей, что письмо с восстановлением пароля не доходит! Я уже и сам вбивал адреса реальных зарегистрированных пользователей в форму восстановления - не доходят, и все тут!

Причем, что интересно, некоторые пользователи смогли завести себе новый аккаунты на форуме и написать мне о проблеме, хотя при регистрации нового аккаунта также требуется активация через почту. Некоторые говорили, что активация падает в "Спам".

Подскажите, где копать???

Вот конфиг для отправки:
if True:
	# EMAIL_TIMEOUT = 5
	EMAIL_HOST = 'smtp.yandex.ru'
	EMAIL_PORT = 465
	# EMAIL_PORT = 587
	EMAIL_USE_SSL = True
	# EMAIL_USE_TLS = True
	EMAIL_HOST_USER = 'info@domain.ru'
	EMAIL_HOST_PASSWORD = '*******'
	DEFAULT_FROM_EMAIL = 'Сайт.ру <%s>' % EMAIL_HOST_USER
	SERVER_EMAIL = EMAIL_HOST_USER


Читал, что надо слать с TLS на 587 порт. Все тоже самое: мне доходят (на все ящики), юзерам - нет!

MX запись для домена указывает на Яндекс. Также в DNS прописал TXT-запись DKIM, которую предоставляет Яндекс в pdd.yandex.ru. Короче говоря, настройки DNS являются точной копией настроек DNS из pdd.yandex.ru.

Где еще нужно копать???
  • Вопрос задан
  • 3326 просмотров
Решения вопроса 1
dimanjy
@dimanjy Автор вопроса
Недопрограммист и полуинженер.
Пока реализовал цифровую подпись писем DKIM, как описано в мануале https://djangosnippets.org/snippets/1995/.
Будем посмотреть...

PS: Приватная часть ключа берется через API Яндекс.Почты.

UP 2 недели спустя НАШЕЛ!

Ну кто бы мог подумать! Все оказалось анекдотически просто.

Смотрим в исходник Django django.contrib.auth.forms.py в классе PasswordResetForm:
def get_users(self, email):
        ...
        return (u for u in active_users if u.has_usable_password())


Оказывается, письма отправляются только тем пользователям, у которых has_usable_password()!
Ну а откуда у меня возьмутся юзеры с валидным паролем, если я переносил их из php-шного форума, а форму для восстановления пароля как раз и пытаюсь использовать для создания валидных паролей, блин!???

Оттого мне самому себе и получалось письма отправлять, что у меня has_usable_password() == True, а у всех остальных False.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@rumsey
У меня работало с такими настройками (сейчас шлю через свой почтарь):
EMAIL_HOST_YA = 'smtp.yandex.ru'
EMAIL_PORT_YA = 587
EMAIL_HOST_USER_YA = 'new.mail@yandex.ru'
EMAIL_HOST_PASSWORD_YA = '1234'


И код отправки:
from django.core.mail import get_connection, send_mail

#connections to yandex
connection = get_connection(
    host=settings.EMAIL_HOST_YA,
    port=settings.EMAIL_PORT_YA,
    username=settings.EMAIL_HOST_USER_YA,
    password=settings.EMAIL_HOST_PASSWORD_YA,
    use_tls=True
)
send_mail(
    subject,
    text_content,
    from_email,
    to,
    connection=connection,
    html_message=html_content
)
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
число писем в минуту
да и в сутки
лимиты, короче

исчерпывающий ответ очень прост: мыл для Яндекса как Гмыл для Гугла - реклама и доля рынка, поэтому, если им перестанут пользоваться, они будут не в восторге, поэтому - жесткий антиспам. Одно дело - с разных адресов на разные адреса содержательные письма (типа обычная корпоративная), другое - такие технические

юзайте сервисы, есть же лимиты бесплатные вполне
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы