python中smtplib利用留意点
利用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')