Отправка электронной почты с Python smtplib не работает, запутавшись в поле «от» - PullRequest
6 голосов
/ 09 декабря 2011

Я пытаюсь отправить электронное письмо на python.Вот мой код.

import smtplib

if __name__ == '__main__':
SERVER = "localhost"

FROM = "sender@example.com"
TO = ["wmh1993@gmail.com"] # must be a list

SUBJECT = "Hello!"

TEXT = "This message was sent with Python's smtplib."

# Prepare actual message

message = """\
From: %s
To: %s
Subject: %s

%s
""" % (FROM, ", ".join(TO), SUBJECT, TEXT)

# Send the mail

server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO[0], message)
server.quit()
print "Message sent!"

Это работает без ошибок, но электронное письмо не отправляется на wmh1993@gmail.com.

Вопросы

Одна вещь, которую я не понимаю в этом коде - какие у меня ограничения при установке поля FROM?

Должен ли я как-то сказать, что это было с моего компьютера?

Что нужно для того, чтобы я не мог подделать чужую электронную почту?

Или я могу это сделать?

Ответы [ 2 ]

7 голосов
/ 09 декабря 2011

Это работает без ошибок, но электронная почта не отправляется на wmh1993@gmail.com.

Обычно это означает, что сообщение было передано вашему MTA (почтовому серверу) на 'localhost', но этот сервер не смог передать его на gmail. он, вероятно, пытался отправить сообщение об отказе на адрес «sender@example.com», и это также не удалось. или оно успешно отправило сообщение, но попало в папку спама в gmail (сообщение может вызывать правила для спама, поскольку в нем отсутствует заголовок даты)

Одна вещь, которую я не понимаю в этом коде - какие у меня ограничения при установке поля FROM?

это должен быть синтаксически действительный адрес электронной почты

Должен ли я как-то сказать, что это было с моего компьютера?

нет. но это может быть проблемой, почему оно не было доставлено. Ваш компьютер находится на домашнем / динамическом / коммутируемом IP? Gmail (и многие многие другие провайдеры) не принимают почту с таких IP-адресов. HELO вашего почтового сервера может быть неправильным, настройки DNS могут быть неправильными и т. д. вам нужно проверить журналы сервера. вам, вероятно, придется настроить локальный почтовый сервер так, чтобы он передавал сообщение через смарт-хост, а не пытался напрямую связаться с целевым сервером.

Что нужно для того, чтобы я не мог подделать чужую электронную почту?

не так много, поэтому у нас так много спама от поддельных адресов. такие вещи, как SPF / DKIM могут немного помочь, но сам протокол SMTP не обеспечивает защиту от подделки.

Или я могу это сделать?

технически да.

1 голос
/ 09 декабря 2011

Ну, так как вы не указываете, какой именно почтовый сервер вы используете и его настройки, здесь есть несколько вещей, которые могут быть неправильными. Прежде всего, вам нужно указать ХОСТ и ПОРТ вашего сервера и подключиться к нему. Пример:

HOST = "smtp.gmail.com"
PORT = "587"
SERVER = smtplib.SMTP()
SERVER.connect(HOST, PORT)

Тогда вам нужно указать пользователя и его пароль для этого хоста. Пример:

USER = "myuser@gmail.com"
PASSWD = "123456"

Для некоторых серверов требуется протокол TLS. Пример:

SERVER.starttls()

Тогда вам нужно авторизоваться. Пример:

SERVER.login(USER,PASSWD)

Только тогда вы сможете отправить электронное письмо со своим sendmail. Этот пример работает довольно хорошо на большинстве распространенных серверов. Если вы используете, как кажется, свой собственный сервер, вам не нужно вносить много изменений. Но вам нужно знать, какие требования предъявляет этот сервер.

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