Отправка электронной почты из Python с помощью локального SMTP-сервера Python

у меня есть сервер под управлением Raspbian Jessie, с которого я хочу отправлять электронные письма с помощью Python. Я видел два модуля, которые могли бы работать в том числе smtpd и smtplib.

Я видел много примеров, в том числе smtp.gmail.com и localhost. Я хочу отправить письмо с конкретным доменным именем, например:myname@mydomain.name
Я новичок в SMTP и все я получаю много ошибок. Как бы я построил код SMTP-сервера, чтобы фактически отправить электронное письмо?

Traceback (most recent call last):
  File "C:UsersJosuaDesktopsmtp_test.py", line 42, in <module>
    s = smtplib.SMTP('sigsmileyface.ddns.net')
  File "C:UsersJosuaAppDataLocalProgramsPythonPython36libsmtplib.py", line 251, in __init__
    (code, msg) = self.connect(host, port)
  File "C:UsersJosuaAppDataLocalProgramsPythonPython36libsmtplib.py", line 336, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:UsersJosuaAppDataLocalProgramsPythonPython36libsmtplib.py", line 307, in _get_socket
    self.source_address)
  File "C:UsersJosuaAppDataLocalProgramsPythonPython36libsocket.py", line 724, in create_connection
    raise err
  File "C:UsersJosuaAppDataLocalProgramsPythonPython36libsocket.py", line 713, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
22
задан Twisty Impersonator
13.11.2022 18:52 Количество просмотров материала 3559
Распечатать страницу

1 ответ

отказ от ответственности

Я ожидаю, что по крайней мере часть приведенной ниже информации будет избыточной для вас. Пожалуйста, потерпите меня. =)

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 предполагая, что вы положили правильные значения в вашем сценарии и иметь контроль над принимающим почтовым сервером.


1
отвечен Anaksunaman 2022-11-15 02:40

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх