python中smtplib使用注意點

高洛峰
發布: 2016-10-18 13:38:41
原創
1618 人瀏覽過

使用smtplib時,開啟的server,最好使用quit方法來關閉連接,而不是close。

server.quit() #好
#server.close() #不好
登入後複製

因為quit不僅會關閉連接,還會關閉session。這個session會跨越連接,而且當這個session中有退信發生時,後續發出的信件會爆出奇怪的SMTP協定錯誤。

使用smtplib時,即便每次都重新open server,對dns的解析也只有一次,這樣當一個網域下有多個smtp server本來可以用於負載平衡的環境下,使用smtplib的python程式就總是使用一台機器,沒辦法負載平衡,影響了伸縮性。為此,想到的辦法是 單獨對郵件伺服器網域進行解析,得到所有的機器名,然後隨機選一台smtp server來連接,做一個應用層的負載平衡。可以考慮使用下面這段程式碼,感謝茂興的提供:

class smtp_server_factory(object):
    def _get_addr_from_name(self, hostname):
        addrs = socket.getaddrinfo(hostname, smtplib.SMTP_PORT, 0, socket.SOCK_STREAM)
        return [addr[4][0] for addr in addrs]
  
    def get_server(self, hostname):
        addrs = self._get_addr_from_name(hostname)
        random.shuffle(addrs)
        for addr in addrs:
            try:
                smtp_server = smtplib.SMTP(addr)
            except Exception, e:
                pass
            else:
                print addr
                return smtp_server
        return None
登入後複製

#使用

server=smtp_server_factory().get_server('xxx-mail.qq.com')
登入後複製


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!