python中smtplib使用注意點

pythontab發表於2013-02-08

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


相關文章