2012-09-23 30 views
6

我正在使用smtplib,我正在從我的應用程序發送通知電子郵件。不過,我注意到有時(特別是當郵件發送之間有很多空閒時間時),我得到一個SMTPServerDisconnected錯誤。python。我可以檢查SMTP服務器是否斷開(這樣我可以再次連接嗎?)

我想有這2個解決方案(知道沒有人,雖然)

  1. 提高發送郵件之間的空閒時間
  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()) 
+0

您是否使用'SMTP.sendmail'發送電子郵件?這應該封裝從'connect'開始的所有低級命令。或者你是否試圖讓SMTP會話保持打開狀態,並重復使用這些郵件? –

+0

我已經添加了你問的代碼。希望澄清一些問題。 :-) – xpanta

回答

4

如果你的使用情況進行一次發送一個消息,這似乎是最正確的給我的解決方案,將是爲每一個新的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() 
+0

謝謝。那會的。還有一件事。是'smtp.close()'還是'smtp.quit()'? – xpanta

+1

根據文檔[quit()](http://docs.python.org/library/smtplib.html#smtplib.SMTP.quit)。 –

+0

使用'with'語句而不是顯式'quit'。 – 2014-09-15 13:54:52

7

是的,你可以檢查連接是否打開。爲此,請發出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的回覆(最後部分)。

相關問題