2010-04-26 38 views
8

Tôi có dịch vụ .NET xử lý hàng đợi trên chuỗi nền và từ các mục trong hàng đợi gửi một số lượng lớn thư e-mail nhỏ ở rất tốc độ cao (nói 100 tin nhắn mỗi giây nếu điều đó thậm chí có thể). Hiện tại, tôi sử dụng SmtpClient.Send() nhưng tôi sợ rằng nó có thể cản trở hiệu suất.Gửi e-mail SMTP với tốc độ cao trong .NET

Mỗi cuộc gọi đến Send() trải qua chu kỳ đầy đủ khi mở ổ cắm, thực hiện cuộc hội thoại SMTP (HELO, MAIL FROM, RCPT TO, DATA) và đóng socket. Trong mã giả:

for each message { 
    open socket 
    send HELO 
    send MAIL FROM 
    send RCPT TO 
    send DATA 
    send QUIT 
    close socket 
} 

(Sửa:. Tuyên bố này về SmtpClient.Send() là trong thực tế sai như tôi đã giải thích trong câu trả lời của tôi)

tôi sẽ nghĩ rằng mã giả sau đây sẽ được tối ưu hơn:

open socket 
send HELO 
for each message { 
    send MAIL FROM 
    send RCPT TO 
    send DATA 
} 
send QUIT 
close socket 

Tôi có nên quan tâm đến hiệu suất của SmtpClient.Send() khi gửi e-mail với tốc độ cao không? Các tùy chọn của tôi để tối ưu hóa hiệu suất là gì?

+0

các thư này có giống nhau không, nhưng đối với những người nhận khác nhau hoặc nội dung của email có khác nhau không? –

+0

@Rob Levine: Cùng một người nhận nhưng có nội dung khác nhau. –

+0

Với hàng trăm giây? Ai trên trái đất muốn được chôn dưới email đó? –

Trả lời

7

Lớp SmtpClient đang lưu vào bộ nhớ cache Kết nối máy chủ SMTP phía sau hậu trường. Gọi số SmtpClient.Send() nhiều lần để gửi nhiều tin nhắn đến cùng một máy chủ SMTP sẽ thực thi hiệu quả mã giả trong ví dụ thứ hai.

Một cách để cải thiện hiệu suất có thể là sử dụng nhiều phiên bản SmtpClient chạy trên nhiều chuỗi. Thay vì chỉ có một kết nối đến máy chủ SMTP, dịch vụ sẽ có nhiều kết nối đồng thời. Việc gửi tin nhắn e-mail được lấy từ hàng đợi và gửi đến một nhóm các chuỗi công nhân gọi SmtpClient.Send() để gửi tin nhắn đến máy chủ SMTP.

Tôi đã thực hiện một số thử nghiệm thô sơ và nhận thấy rằng điều này có thể cải thiện hiệu suất lên tới 100%. Tuy nhiên, số lượng tối ưu các kết nối đồng thời và cải thiện hiệu suất thực tế có lẽ phụ thuộc rất nhiều vào máy chủ SMTP. Một cách để mở rộng ý tưởng này là kết nối với nhiều máy chủ SMTP.

0

Quy trình gửi email bằng SMTP được chỉ định (ban đầu) trong RFC 821. Đã có nhiều cập nhật và bổ sung kể từ khi giao thức cơ bản vẫn như cũ. Bạn cần bắt đầu từng giao dịch bằng lệnh HELO và sau đó thêm thông tin người gửi, người nhận, v.v. Nếu bạn đang gửi cùng một tin nhắn đến tất cả người nhận thì bạn có thể thêm nhiều người nhận trong một tin nhắn. Tuy nhiên, nếu văn bản của tin nhắn khác nhau đối với mỗi người nhận, tôi nghĩ bạn sẽ cần phải gửi từng tin nhắn cho mỗi người, nghĩa là một giao dịch riêng cho mỗi người nhận.

+1

Tôi đã phát hiện ra 'SmtpClient.Send()' khi được gọi nhiều lần sẽ chỉ mở ổ cắm một lần, đưa ra một lệnh EHLO và sau đó gửi nhiều lệnh MAIL FROM, RCPT TO và DATA trên cùng một kết nối. –

2

Tạo một máy chủ email gửi email không đồng bộ bằng cách sử dụng một luồng hoặc một thứ gì đó. Bằng cách đó bạn có thể "đốt cháy và quên" email của bạn tại máy chủ và để cho nó lo lắng về việc gửi tất cả chúng đi. Thiết lập nó với một vài chủ đề hoặc nhiều hơn và nó sẽ có thể roi qua email khá nhanh.

+0

Đó là chính xác những gì chúng tôi đang làm, ngoại trừ việc chúng tôi dường như có một số vấn đề về hiệu suất. Câu hỏi của tôi là về cách hiệu quả nhất để "đốt cháy và quên" các e-mail từ một dịch vụ .NET. –

+0

Sự cố hiệu suất nào? Trong quá trình thực hiện, tôi có thể gửi hàng nghìn email một phút. Nó có ném ngoại lệ không? Đây là những thư cực kỳ chậm chạp vì bạn thường phải chờ một ổ cắm để hết thời gian. – Chris

+0

Trung bình chúng tôi hiện đang gửi 20 e-mail mỗi giây, nhưng có nhiều yếu tố trong môi trường của chúng tôi có thể ảnh hưởng đến con số này. Tôi đang điều tra xem chúng tôi có thể cải thiện khía cạnh gửi thư hay không. –

Các vấn đề liên quan