Столкнулся с проблемой - не отправляется почта с сайта форума (
вот вопрос).
Точнее отправляется только мне и иногда другим. Прописал SPF, DKIM и т.д. Отправляю через как бы "надежный" сервис pdd.yandex.ru.
Начал тестировать через mail-tester.com. Написал команду testmail для ./manage.py и играюсь из консоли - все письма до мейл-тестера доходят, выдает 10 баллов из 10, т.е. письмо идеальное!
Так вот, из консоли доходят, а с сервера - nginx -> uwsgi -> django - Ну ни в какую. Django радостно отчитывается формой "Ваше письмо отправлено", а на мейл-тестер не приходит ничего.
Начал копать исходники отправки почты в Django и набрел на такую вещь:
class EmailBackend(BaseEmailBackend):
"""
A wrapper that manages the SMTP network connection.
"""
def __init__(self, ...):
# ... скипаем все и в самом конце - вот:
self._lock = threading.RLock()
def send_messages(self, email_messages):
"""
Sends one or more EmailMessage objects and returns the number of email
messages sent.
"""
if not email_messages:
return
with self._lock:
# ... ну и дальше, собственно, отправляет.
return num_sent
Т.е. что же это получается? Django, выходит, создает отдельный поток для отправки почты по SMTP? Растолкуйте, пожалуйста!
Я читал (но до конца не понял), что в uWSGI нужно как-то отдельно настраивать правильную работу с потоками, иначе воркеры теряют связь с порожденными потоками и могут из-за этого возникать ошибки.
Я у себя для uWSGI в конфиге включил вот так:
[uwsgi]
...
master = true
processes = 4
enable-threads = true
single-interpreter = true
...
В итоге в htop вижу 4 воркера, каждый из которых сделал по одному потоку (игрался и с 2-умя потоками). Вроде потоки включены... Но поток с отправкой почты в Django либо не стартует либо мрет (наверное), т.к. почта-таки не отправляется. Точнее мне (почему-то) на все мне доступные ящики отправляется, а на мейл-тестер - не приходит :(
Растолкуйте, пожалуйста, про django + uwsgi + threads.