Django mail send_mail использует IP-адрес хоста вместо имени хоста, возвращаемого getfqdn - PullRequest
4 голосов
/ 12 февраля 2020

Согласно документации , django бэкэнд по умолчанию использует smtplib.

Я использую django электронную почту для отправки писем следующим образом:

email = EmailMessage(
    'Object',
    'body',
    my_from_addr,
    args.emails,
    [],
    reply_to=['my_from_addr'],
)

со следующей конфигурацией в settings.py:

EMAIL_HOST = "mail_server.lan"
EMAIL_PORT = 25

Мне нужно установить параметр helo / ehlo для соответствия серверу электронной почты в соответствии с именем хоста отправляющего сервера. Но django, кажется, использует IP-адрес сервера вместо имени хоста, до сих пор мои электронные письма были отклонены с ошибкой

smtplib.SMTPRecipientsRefused: {'args.emails': (450, b'4.7.1 Client host rejected: cannot find your hostname, [192.168.1.5]')}

Документация smtplib объявляет здесь

If specified, local_hostname is used as the FQDN of the local host in the HELO/EHLO command. Otherwise, the local hostname is found using socket.getfqdn().

И это фактически возвращает правильное имя хоста:

python3 -c 'import socket; print(socket.getfqdn())'
my_proper_hostname.lan

Я что-то упустил? Почему django использует IP-адрес вместо реального имени хоста?

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Вам необходимо указать хост в вашем settings.py файле:

Например:

EMAIL_HOST = 'email-smtp.eu-west-1.amazonaws.com' # specify email server address here
0 голосов
/ 18 февраля 2020

Это, похоже, неверная конфигурация на почтовом сервере mail_server.lan. не в django.

SMTPRecipientsRefused ошибка указывает на ошибки, возникшие при отправке электронных писем получателям - и эта операция выполняется почтовым сервером smtp.

Получено сообщение от django (как нет ошибок подключения) и попытался отправить отдельное электронное письмо для каждого получателя (на / cc) этого сообщения. И отправка одного из них не удалась.

Почтовый сервер выполняет аналогичное согласование helo / ehlo с вышестоящими серверами.

Предоставляет ли ваш почтовый сервер правильный maildomain / hostname? (ip in сообщение об ошибке предполагает, что почтовый сервер отправляет ip, а не его домен).

Затем многие серверы также проверят PTR-запись для вашего ip - сначала разрешите предоставленное имя почтового домена, чтобы получить ip, затем разрешите этот ip обратно - получить запись PTR - проверить, соответствует ли она почтовому домену. Запись PTR обычно может быть установлена ​​вашим поставщиком rnet / хостером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...