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

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

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

Я видел много примеров, некоторые из которых включают smtp.gmail.comи localhost. Я хочу отправить электронное письмо с определенным доменным именем, например: [email protected] Я новичок в SMTP, и все, что я получаю, это множество ошибок. Как мне создать код сервера SMTP, чтобы на самом деле отправить электронное письмо?

Traceback (most recent call last):
  File "C:\Users\Josua\Desktop\smtp_test.py", line 42, in <module>
    s = smtplib.SMTP('sigsmileyface.ddns.net')
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 251, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 336, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\smtplib.py", line 307, in _get_socket
    self.source_address)
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 724, in create_connection
    raise err
  File "C:\Users\Josua\AppData\Local\Programs\Python\Python36\lib\socket.py", line 713, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

решение1

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

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

smtplib против smptd

Python поставляется с двумя модулями для работы с электронной почтой —smtplibиsmtpd. Разница между ними в том, что smtplibиспользуется для отправки писем, а smptdиспользуется для получения писем. В этом случае для отправки писем вам нужно будет использовать только smtplib.

Электронная почта с Python 3.6 smtplib

Я хочу отправить электронное письмо через свое доменное имя (например[email protected]).

Поскольку вы не предоставили исходный скрипт, я привел ниже для справки рабочий почтовый скрипт 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', '[email protected]'))
msg['From'] = email.utils.formataddr(('Your Name', '[email protected]'))
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 ('[email protected]', 'Password')

# Dump communication with the receiving server straight to to the console.
# server.set_debuglevel(True)  

# '[email protected]' is our envelope address and specifies the return
# path for bounced emails.
try:
    server.sendmail('[email protected]', ['[email protected]'], msg.as_string())
finally:
    server.quit()

Обратите внимание, что хотя я использую "server" в качестве smtplibимени объекта, вы можете продолжать использовать "s" (или что-то еще) в своем собственном скрипте. Аналогично, использованиеemail.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или через .connect(). Обратите внимание, что указанное вами имя хоста всегда будет либо прямым соединением с сервером, на который вы хотите отправлять почту, либо промежуточным почтовым сервером (локальным или иным), который, как вы ожидаете, будет передавать сообщения от вашего имени.

Хотя это кажется маловероятным в вашем случае, вы также должны знать все имена пользователей или пароли, необходимые для подключения к принимающему серверу. Это наиболее распространено при использовании другого сервера для ретрансляции почты, но это стоит запомнить.

Проверьте, нужно ли вам использовать реле

Убедитесь, что вам не нужно использовать какой-либо ретранслятор. Короче говоря, некоторые интернет-провайдеры делают определенные вещи для предотвращения спама, которые могут потребовать использования специальных почтовых серверов для первоначальной передачи или получения сообщений на порту 25.

Например, локальный провайдер для моего домашнего сервиса фильтрует порт 25. Он заставляет обычную исходящую почту, предназначенную для этого порта, отправляться через почтовый ретранслятор SSL провайдера. Одновременно он блокирует входящие сообщения на этом порту для домашних пользователей.

Это означает, что для отправки и получения электронной почты через порт 25 мне нужно передать обычную исходящую почту (то, что пытается сделать ваш скрипт)smtp.isp.comдля пересылки его получателю на порт 25, используя при этом вторую (стороннюю) службу для маршрутизации входящей почты с порта 25 на порт XXX (где фактически прослушивается мой почтовый сервер).

Обратите внимание, что это на самом деле не препятствует отправке или получению почты через другие открытые порты (что может быть приемлемо для тестирования или личного использования), но поскольку большинство почтовых серверов используют порт 25 для обеспечения согласованности, использование ретранслятора может стать необходимостью в долгосрочной перспективе.


Если вам это не совсем понятно, вы можете провести тестирование на портах, отличных от 25, при условии, что вы указали правильные значения в своем скрипте и имеете контроль над принимающим почтовым сервером.


Связанный контент