web-dev-qa-db-ja.com

Pythonローカルからのメールの送信Python SMTPサーバー

Pythonを使用してメールを送信したいRaspbian Jessieを実行しているサーバーがあります。 smtpdsmtplibを含む2つのモジュールが機能する可能性があります。

smtp.gmail.comlocalhostを含むいくつかの例を見てきました。たとえば、特定のドメイン名を使ってメールを送信したいと思います。たとえば、[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
4
Josua Robson

免責事項

以下の情報の少なくとも一部があなたにとって冗長になると思います。我慢してください。 =)

smtplibとsmptd

Pythonには、電子メールを処理するための2つのモジュール— smtplib および smtpd が付属しています。 2つの違いは、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()
_

smtplibオブジェクト名として「server」を使用していますが、独自のスクリプトで「s」(またはその他)を自由に使用し続けることができます。同様に、 email.util および email.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()で指定するかに関係なく、スクリプトの接続値が正しいことを再確認する必要があります。指定するホスト名は常に、メールの送信先のサーバーへの直接接続、またはユーザーに代わってメッセージを渡すと予想される中間メールサーバー(ローカルまたはその他)のいずれかになります。

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

リレーを使用する必要があるかどうかを確認してください

何らかのリレーを使用する必要がないことを確認してください。つまり、一部のISPは、特別なメールサーバーを使用して最初にポート25でメッセージを転送または受信する必要があるスパムを防止するために、特定の処理を実行します。

たとえば、ホームサービスのローカルISPはポート25をフィルタリングします。このポート宛ての通常の送信メールは、ISP SSLメールリレーを介して強制的に送信されます。同時に、このポートでのホームユーザーへの着信メッセージをブロックします。

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

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


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


3
Anaksunaman