отказ от ответственности
Я ожидаю, что по крайней мере часть приведенной ниже информации будет избыточной для вас. Пожалуйста, потерпите меня. =)
smtplib и smptd
в Python поставляется с двумя модулями для работы с электронной почтой - smtplib и smtpd. Разница между ними заключается в том, что smtplib
используется для отправки электронных писем, в то время как smptd
используется для получения электронной почты. В этом случае, для отправки электронной почты, вы нужно только нужно использовать smtplib
.
электронная почта С Python 3.6 smtplib
Я хочу отправить письмо по моему доменному имени (например myname@mydomain.name).
так как вы не предоставили исходный скрипт, я перечислил рабочий почтовый скрипт Python 3.6 для справки ниже:
# Python mail script with smtplib, email.utils and email.mime.text.
# --- imports ---
import smtplib
import email.utils
from email.mime.text import MIMEText
# --- create our message ---
# Create our message.
msg = MIMEText('The body of your message.')
msg['To'] = email.utils.formataddr(('Recipient Name', 'recipient@example.com'))
msg['From'] = email.utils.formataddr(('Your Name', 'yourname@yourdomain.com'))
msg['Subject'] = 'Your Subject'
# --- send the email ---
# SMTP() is used with normal, unencrypted (non-SSL) email.
# To send email via an SSL connection, use SMTP_SSL().
server = smtplib.SMTP()
# Specifying an empty server.connect() statement defaults to ('localhost', 25).
# Therefore, we specify which mail server we wish to connect to.
server.connect ('mail.example.com', 25)
# Optional login for the receiving mail_server.
# server.login ('login@example.com', 'Password')
# Dump communication with the receiving server straight to to the console.
# server.set_debuglevel(True)
# 'yourname@yourdomain.com' is our envelope address and specifies the return
# path for bounced emails.
try:
server.sendmail('yourname@yourdomain.com', ['recipient@example.com'], msg.as_string())
finally:
server.quit()
обратите внимание, что в то время как я использую "сервер" в качестве smtplib
имя объекта, вы можете продолжать использовать "S" (или что угодно) в свой собственный сценарий. Аналогично, используйте Эл.почта.util и Эл.почта.mime модули не являются строго необходимыми, но они полезны при построении окончательного сообщения.
Я новичок в SMTP, и все, что я получаю много ошибок.
Я не могу сказать, что ваши другие ошибки могут быть вызваны, но вывод, который вы перечислили указывает на подключение кsigsmileyface.ddns.net не смогло быть установлено на порт 25. Ключевые строки:
s = smtplib.SMTP('sigsmileyface.ddns.net')
, по умолчанию порт 25.
последняя строка ConnectionRefusedError: [...] the target machine actively refused it
, что может указывать на проблему конфигурации брандмауэра или почтового сервера.
устранение неисправностей
Проверьте Почтовый Сервер И Порт
установить, что сервер, к которому вы подключаетесь, имеет активный почтовый сервер и на каком порту он работает (обычно порт 25 для входящей почты).
в вашем случае, если у вас есть контроль надsigsmileyface.ddns.net и вы пытаетесь отправить ему письмо, вы должны убедиться, что ваш почтовый сервер настроен правильно, чтобы получать почту через порт 25. Я верю в это sendmail
- стандартный почтовый сервер на Pi. Вы также должны убедиться, что порт не заблокирован брандмауэром и что на маршрутизаторе правильно настроена любая необходимая переадресация портов.
на подобной ноте, в то время как это не должно действительно иметь значение для прямого подключения к почтовому серверу, вы можете настроить MX-записи, если вы собираетесь отправлять почту/получать электронную почту вsigsmileyface.ddns.net.
Проверьте Подключение
вы должны дважды проверить, что ваш скрипт имеет правильные значения подключения, указываете ли вы их в smptlib
объект или via .connect()
. Обратите внимание, что указанное имя хоста всегда будет прямое соединение с сервером, на который вы хотите отправить почту, или с промежуточным почтовым сервером (локальным или иным), на который вы хотите передавать сообщения от вашего имени.
хотя это кажется маловероятным в вашем случае, вы также должны знать имя пользователя или пароль, необходимые для подключения к принимающему серверу. Чаще всего это происходит при использовании другого сервера для ретрансляции почты, но стоит помнить.
Проверьте, Если Вам Нужно Использовать Реле
обеспечить вам не нужно использовать какое-то реле. Короче говоря, некоторые интернет-провайдеры делают определенные вещи для предотвращения спама, который может потребовать использования специальных почтовых серверов для первоначальной передачи или получения сообщений на порту 25.
например, локальный интернет-провайдер для моей домашней службы фильтрует порт 25. Это заставляет обычную исходящую почту, предназначенную для этого порта, быть переданным через почтовый ретранслятор SSL ISP. Одновременно он блокирует входящие сообщения на этом порту для домашних пользователей.
это значит что отправлять и получать электронную почту на 25 порт, я должен пройти нормальный исходящей почты (то, что ваш скрипт пытается) в smtp.isp.com переслать его адресату на 25 порт, а через второй (третьей стороной) услуги для маршрутизации входящей почты порт 25 на порт ХХХ (где мой почтовый сервер слушает на самом деле).
обратите внимание, что на самом деле не предотвращает отправку или получение почты на других открытых портах (что может быть хорошо для тестирования или личного использования), но поскольку большинство почтовых серверов используют порт 25 для обеспечения согласованности в долгосрочной перспективе может потребоваться использование реле.
в случае, если это не было достаточно ясно, вы можете сделать тестирование на портах, отличных от 25 предполагая, что вы положили правильные значения в вашем сценарии и иметь контроль над принимающим почтовым сервером.