12

私は使用してsmtplibおり、アプリケーションから通知メールを送信しています。SMTPServerDisconnectedしかし、時々(特にメール送信の間にアイドル時間が長い場合)エラーが発生することに気づきました。

これには2つの解決策があると思います(ただし、どれも知らない)

  1. メール送信間のアイドル時間を増やす
  2. 接続がダウンしたときに再接続します。

2番目の解決策はもっとエレガントに思えます。しかし、どうすればそれを行うことができますか?

編集:私はコードを追加しています

from smtplib import SMTP
smtp = SMTP()
smtp.connect('smtp.server.com')
smtp.login('username','password')

def notifyUser():
    smtp.sendmail(from_email, to_email, msg.as_string())
4

2 に答える 2

15

はい、接続が開いているかどうかを確認できます。これを行うには、NOOPコマンドを発行し、ステータス== 250をテストします。そうでない場合は、メールを送信する前に接続を開きます。

def test_conn_open(conn):
    try:
        status = conn.noop()[0]
    except:  # smtplib.SMTPServerDisconnected
        status = -1
    return True if status == 250 else False

def send_email(conn, from_email, to_email, msg):
   if not test_conn_open(conn):
       conn = create_conn()
   conn.sendmail(from_email, to_email, msg.as_string())
   return conn    # as you want are trying to reuse it.

たとえばGmailで接続を開くと、2〜3秒のような時間がかかるため、これを行っていることに注意してください。その後、手元にある可能性のある複数の電子メールの送信を最適化するには、Pedroの応答(最後の部分)にも従う必要があります。

于 2013-02-03T23:11:41.970 に答える
9

ユースケースが一度に1つのメッセージを送信する場合、私にとって最も正しいと思われる解決策は、メッセージごとに新しいSMTPセッションを作成することです。

from smtplib import SMTP

smtp = SMTP('smtp.server.com')

def notifyUser(smtp, smtp_user, smtp_password, from_email, to_email, msg):
    smtp.login(smtp_user, smtp_password)
    smtp.sendmail(from_email, to_email, msg.as_string())
    smtp.quit()

SMTPサーバーで自分自身を認証する必要がない場合(一般的なケース)、これはさらに単純化して次のようになります。

from smtplib import SMTP

smtp = SMTP('smtp.server.com')

def notifyUser(smtp, from_email, to_email, msg):
    smtp.sendmail(from_email, to_email, msg.as_string())
    smtp.quit()

一度に複数のメッセージを送信することが一般的であり、メッセージのグループに同じSMTPセッションを再利用することでこのケースを最適化する場合(SMTPにログインする必要がない場合は、上記のように簡略化できます)サーバ):

from smtplib import SMTP

smtp = SMTP('smtp.server.com')

def notifyUsers(smtp, smtp_user, smtp_password, from_to_msgs):
    """
    :param from_to_msgs: iterable of tuples with `(from_email, to_email, msg)`
    """
    smtp.login(smtp_user, smtp_password)
    for from_email, to_email, msg in from_to_msgs:
        smtp.sendmail(from_email, to_email, msg.as_string())
    smtp.quit()
于 2012-09-23T18:47:54.473 に答える