smtplib を使用する場合、開いたサーバーの接続を閉じるのではなく、quit メソッドを使用して閉じることをお勧めします。
server.quit() #好 #server.close() #不好
なぜなら、quit は接続を閉じるだけでなく、セッションも閉じるからです。このセッションは接続全体に及ぶため、このセッションでバウンスが発生すると、後続のレターで奇妙な SMTP プロトコル エラーが発生します。
smtplib を使用する場合、サーバーが毎回再オープンされても、DNS は 1 回だけ解決されます。このように、負荷分散に使用できるドメイン名の下に複数の smtp サーバーがある場合、smtplib を使用する Python プログラムは、常に 1 台のマシンを使用すると負荷分散ができず、スケーラビリティに影響します。この目的を達成するために、メール サーバーのドメイン名を個別に分析してすべてのマシン名を取得し、アプリケーション層の負荷分散を行うために接続する SMTP サーバーをランダムに選択するという考えがあります。 Maoxing の提供に感謝して、次のコードの使用を検討できます:
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
# Use
server=smtp_server_factory().get_server('xxx-mail.qq.com')