ローカル Python SMTP サーバーを使用して Python からメールを送信する

ローカル Python SMTP サーバーを使用して Python からメールを送信する

Raspbian Jessie を実行しているサーバーがあり、そこから Python を使用してメールを送信したいと考えています。smtpdとを含む 2 つのモジュールが機能する可能性があることがわかりました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には電子メールを扱うための2つのモジュールが付属しています。smtplibそしてSMTPD2 つの違いは、 はsmtplib電子メールの送信に使用され、 はsmptd電子メールの受信に使用されることです。この場合、電子メールの送信には のみを使用する必要がありますsmtplib

Python 3.6 smtplib を使用した電子メール

自分のドメイン名でメールを送信したい(例:[メールアドレス])。

ソース スクリプトが提供されていないため、参考までに動作する 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」(または任意の名前)を自由に使用できます。同様に、電子メール.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 でメールを受信できるように正しく設定されていることを確認する必要があります。これはsendmailPi の標準メール サーバーだと思います。また、ポートがファイアウォールによってブロックされていないこと、および必要なポート転送がルーターで正しく設定されていることを確認する必要があります。

同様に、メールサーバーに直接接続する場合は特に違いはありませんが、メールを送受信する場合はMXレコードを設定することをお勧めします。sigsmileyface.ddns.net

接続を確認する

smptlibオブジェクトで指定するか、 経由で指定するかに関係なく、スクリプトの接続値が正しいことを再確認する必要があります.connect()。指定するホスト名は、常に、メールを送信するサーバーへの直接接続、またはユーザーに代わってメッセージを渡すことが予想される中間メール サーバー (ローカルまたはその他のサーバー) のいずれかになることに注意してください。

あなたのケースではありそうにないかもしれませんが、受信サーバーに接続するために必要なユーザー名やパスワードも知っておく必要があります。これは、別のサーバーを使用してメールを中継する場合に最も一般的ですが、覚えておく価値があります。

リレーを使用する必要があるかどうかを確認する

何らかのリレーを使用する必要がないことを確認してください。簡単に言うと、一部の ISP はスパムを防止するために特定の措置を講じており、そのために最初にポート 25 でメッセージを転送または受信するために特別なメール サーバーの使用が必要になる場合があります。

たとえば、私の自宅サービスのローカル ISP はポート 25 をフィルタリングします。これにより、このポート宛ての通常の送信メールは ISP SSL メール リレー経由で送信されるようになります。同時に、自宅ユーザー向けのこのポートでの受信メッセージはブロックされます。

つまり、ポート25でメールを送受信するには、通常の送信メール(スクリプトが試みているもの)をsmtp.isp.com2 番目の (サードパーティの) サービスを使用して、受信メールをポート 25 からポート XXX (メール サーバーが実際にリッスンするポート) にルーティングしながら、ポート 25 で受信者に転送します。

実際には、他の開いているポートでのメールの送受信が妨げられるわけではありません (テストや個人的な使用には問題ありません)。ただし、ほとんどのメール サーバーは一貫性を保つためにポート 25 を使用しているため、長期的にはリレーの使用が必要になる場合があります。


十分に明確でない場合は、スクリプトに正しい値を入力し、受信メール サーバーを制御できると仮定して、25 以外のポートでテストを行うことができます。


関連情報