使用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')