2011-12-05 115 views
3

我正在尋找解決方案在Python中發送大量郵件(數十萬)。我有一個收件人列表(在一個文件中),我想發送一封郵件給他們所有人。我希望每個收件人在郵件標題中顯示爲接收者,而不是密件抄送或抄送。那麼,我的解決方案:發送一個分開的郵件給他們每個人,而不是郵件到所有列表。我做了一些工作如下:(我以前的smtplib線程):如何發送一封郵件給數以十萬計的python收件人,每個收件人都顯示爲郵件頭中的收件人?

class SendMail(threading.Thread): 
    def __init__(self, from, to, subject, message): 
    self.from = from 
    self.to = to 
    self.subject = subject 
    self.message = message 
    def run(self): 
    try: 
       msg = MIMEMultipart('alternative') 
       msg['Subject'] = self.subject 
       msg['From'] = self.from 
       msg['To'] = self.to 
       msg.attach(MIMEText(self.message , 'html')) 
       server = smtplib.SMTP()    
       server.connect('xxxxx', 25) 
       server.login('cxxxxx', 'yyyyyy')     
       server.sendmail(self.from, self.to, msg.as_string()) 
    except: 
      pass 

def sendmail(): 
    f = open('recipients','w') 
    from = "[email protected]" 
    subject = "hello" 
    message = "Hello Hello" 
    for line in f.readlines(): 
     t = SendMail(from, line, subject, message) 
     t.run() 
    f.close() 

它的工作,但速度很慢(約6封/秒)。所以請幫助我加快速度。或者爲我提供另一種解決方案來完成這項工作非常感謝你!

+9

*數以萬計*的電子郵件?你是否是dem ...垃圾郵件發送者之一? – Blender

回答

5

最快的做法是在您的計算機上安裝郵件傳輸代理(如Postfix),並將所有電子郵件發送給它,以便使用/usr/sbin/sendmail郵件界面進行傳送。大多數合理的郵件服務器可以接受每秒傳送的數千封郵件,並且可以執行一些SMTP流水線操作,以在單個連接中向目標域上的多個收件人發送郵件,從而大幅降低通信開銷並提高郵件吞吐量。 (這不會影響您的用戶看到您的電子郵件的方式。)

大多數郵件服務器還可以非常好地處理暫時關閉的服務器,這是非常重要的,因爲許多站點使用greylisting來對付垃圾郵件。

但是,如果你真要聯繫通過在你的Python的網絡連接的SMTP服務器,這將是一個非常好的主意,用發送線程將地址掀起了隊列的​​,創建和發送電子郵件,然後返回到另一個地址服務隊列。您當前的代碼爲每個郵件傳遞創建並銷燬一個新線程。線程需要時間來創建並花費時間來銷燬,所有這些開銷都是可能用於服務郵件的時間。

此外,線程池將限制活動連接的總數。創建1000個獨立但同時連接到單個郵件服務器沒有意義。設置每個會話的three-way handshakes在您發送任何SMTP流量之前,需要三倍的延遲時間才能建立TCP會話。因此,創建十個線程與十個連接並重用這些連接發送電子郵件。 (即使是十個可能是過度的 - 這可能是兩個或三個更好的工作。嘿,一個線程可能是最好的,但如果連接關閉(每連接郵件限制?),你將有一段時間發送沒有通過線路直到連接重新建立)

你現在已經創建了什麼是非常相似的thundering herd problem - 啓動線程的數百或數千,但可能沒有足夠的內存來讓他們全部在RAM中。您可能已經引入了足夠的交換來大幅降低發送系統的性能,其中單個執行線程可能完全適合內存並運行而不會停止交換。

+0

非常感謝你!我之前並不清楚線程。我會盡力深入瞭解它們。 –

1

我的建議(到目前爲止最簡單的)是將這項工作卸載到一些第三方,並在您的代碼中調用他們的庫。

MailChimp似乎很流行(這裏是他們的api)。他們還提供了一個慷慨的免費計劃。

SocketLabs是另一種選擇(這裏是他們的api)。谷歌應該爲你提供大量的其他人。

相關問題