server.quit() #好 #server.close() #不好
因?yàn)閝uit不僅僅會(huì)關(guān)閉連接,還會(huì)關(guān)閉session。這個(gè)session會(huì)跨越連接,而且當(dāng)這個(gè)session中有退信發(fā)生時(shí),后續(xù)發(fā)出的信件會(huì)爆出奇怪的SMTP協(xié)議錯(cuò)誤。
使用smtplib時(shí),即便每次都重新open server,對(duì)dns的解析也只有一次,這樣當(dāng)一個(gè)域名下有多個(gè)smtp server本來(lái)可以用于負(fù)載均衡的環(huán)境下,使用smtplib的python程序就總是使用一臺(tái)機(jī)器,沒(méi)法負(fù)載均衡,影響了伸縮性。為此,想到的辦法是 單獨(dú)對(duì)郵件服務(wù)器域名進(jìn)行解析,得到所有的機(jī)器名,然后隨機(jī)選一臺(tái)smtp server來(lái)連接,做一個(gè)應(yīng)用層的負(fù)載均衡。可以考慮使用下面這段代碼,感謝茂興的提供:
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')
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com