2010-04-12 6 views
7

Tôi đang viết một ứng dụng cần gửi một lượng lớn email cho sinh viên sẽ được chọn từ cơ sở dữ liệu của chúng tôi (mỗi email sẽ được cá nhân hóa trong phạm vi sẽ bao gồm tên, quá trình học tập, vv ... vì vậy cần phải được gửi cùng một lúc).Gửi 20.000 email trở lên với asp.net

Tôi có thể làm điều này lặp trên một SmtpClient, nhưng tôi sợ rằng với những con số tôi đang cố gắng gửi, cuối cùng tôi sẽ chạy vào các vấn đề thời gian chờ hoặc thread của tôi bị giết vì thiếu tài nguyên máy. Tại thời điểm này, tôi chỉ tìm kiếm các đề xuất về cách xử lý tốt hơn, hoặc nếu lặp qua SmtpClient là giải pháp ok, tôi nên xử lý nó như thế nào để ngăn chặn những gì tôi đã đăng ở trên.

Dịch vụ web có thay thế tốt hơn không?

Xin cho biết, TIA

+0

bạn cần phải đi với một số công cụ của bên thứ ba – anishMarokey

+2

bạn không cần phải đi với một số bên thứ ba Các công cụ –

Trả lời

11

Đề xuất của tôi là loại bỏ hàng loạt. Đừng cố gắng chạy mã ASP.NET để tạo ra 20K email và gửi chúng ra khi bạn đang bị ràng buộc để runinto thời gian chờ và các vấn đề hiệu suất. Thay vào đó, hãy điền một bảng với người nhận, chủ đề, nội dung và bắt đầu một quá trình xử lý hàng loạt từ một dịch vụ Windows. Bằng cách này, mã của bạn được thực thi theo cách mà độ trễ có thể được quản lý, thay vì phải đợi trang web yêu cầu trả lại.

+0

cách tiếp cận này có vẻ đầy hứa hẹn. Tôi đã lưu các email trong một bảng. Xin lỗi cho một câu hỏi noobish, nhưng làm thế nào tôi sẽ gọi dịch vụ cửa sổ này để có nó bắt đầu gửi email, và tương tự như vậy, làm thế nào tôi sẽ báo cáo lại cho khách hàng mà những người đã được gửi thành công và những người thất bại từ các cửa sổ dịch vụ? – Kyle

+0

bạn sẽ không phải gọi đến dịch vụ windows. hãy để nó chạy. Dịch vụ này có thể được thiết kế để kiểm tra bảng của bạn và xem liệu có công việc nào được thực hiện hay không. nếu có email chưa được gửi thì hãy nhóm chúng lại và gửi chúng. Về cơ bản, dịch vụ nên được thiết kế để truy vấn bảng đó sau 5 phút. (Lưu ý bạn nên đặt một cờ bool trên bảng đó nói rằng nếu nó đã được gửi và cho mục đích preformance đặt một chỉ mục trên cờ bool.) Bây giờ khi bạn truy vấn bảng cho tất cả các mục không được gửi, nếu đếm lớn hơn một thì dịch vụ bắt đầu gửi email. Để báo cáo lại cho khách hàng –

+0

mát mẻ. Tôi sẽ cho đi. cảm ơn – Kyle

6

Ok, đầu tiên - đây là hầu như không lớn, tôi đã xử lý 50.000 email +

Hãy để email được ghi vào một FOLDER - thư mục. Sau đó, sử dụng dịch vụ SMTP cục bộ mà bạn có thể cài đặt, trỏ nó vào thư mục làm thư mục pickup. Điều này sẽ ít nhất chắc chắn rằng bạn có một bộ đệm phong nha ở giữa (tức là bạn có thể hoàn thành bên asp.net, trong khi các email không được gửi vào thời điểm đó).

+0

cũng là vấn đề đầu tiên mà tất cả sinh viên của chúng tôi sử dụng "bên thứ 3" cho email của họ (tất cả đều sử dụng cùng một email), có máy chủ trao đổi của chúng tôi được liệt kê là "người gửi ok". Rất tiếc, tôi không có quyền truy cập vào máy chủ trao đổi để yêu cầu họ tìm nạp các email từ 'thư mục' này ... tất cả đều nằm trên vai của cơ sở hạ tầng của chúng tôi. Tôi cũng không có quyền truy cập để thêm máy chủ web dưới dạng "người gửi ok" vào bên thứ ba của chúng tôi (nơi tất cả các địa chỉ email) ... vì vậy không thể sử dụng máy chủ đó làm máy chủ SMTP ở đó. Nếu tôi tạo ra một dịch vụ web để xử lý việc gửi email thông qua trao đổi của chúng tôi ... nó sẽ bay – Kyle

+0

Thực ra đâu là vấn đề? Nghiêm túc ... Dịch vụ SMTP ĐỊA PHƯƠNG có thể được cấu hình để (a) sử dụng máy chủ trao đổi làm rơle và (b) xác thực bằng tên người dùng và mật khẩu, như bạn làm với dịch vụ smtp thông thường của bạn. – TomTom

+0

câu trả lời của bạn không cung cấp bất kỳ giải pháp nào, thay vào đó, bạn chỉ hỏi thêm câu hỏi. Bạn có mong đợi 20.000 người dùng trên cùng một nhà cung cấp dịch vụ email không? Câu trả lời của bạn cho thấy rằng bạn không có kinh nghiệm trong việc gửi loại email này. –

0

Bạn có thể sử dụng javascript trên bộ hẹn giờ để yêu cầu tập lệnh gửi thư theo từng phần nhỏ sẽ không mất thời gian. Sau đó, bạn sẽ gọi kịch bản từ trình duyệt. Thêm thanh tiến trình, xác thực, v.v.

0

Bạn không cần dịch vụ web, mà là một cách để nhóm email vào hàng đợi (có thể là bảng "Email_Queue" trong DB). Sau đó, một dịch vụ Windows chạy trên một máy chủ có thể đọc thông qua hàng đợi trong cơ sở đầu tiên/đầu ra tại các khối hợp lý tại một thời điểm được gửi tới SMTPClient, loại bỏ các mục khỏi hàng đợi khi chúng được xử lý. Bạn có lẽ sẽ cần phải chạy một số phép đo để xác định kích thước chunk và độ trễ sẽ được cho máy chủ thư của bạn.

2

Điều gì về việc sử dụng công cụ Cơ sở dữ liệu Thư được cung cấp bởi Máy chủ SQL chính nó. Bạn vẫn có thể sử dụng asp.net nhưng Email sẽ được gửi bởi SQL Server và tất cả những gì bạn phải làm là gọi thủ tục lưu sẵn và để mọi thứ cho SQL Server.

Tôi sẽ không đề xuất tùy chọn hàng loạt vì sẽ không có bất kỳ điều tối ưu hóa hoặc hàng đợi nào trừ khi bạn phải nỗ lực rất nhiều.

Cơ sở dữ liệu Công cụ thư cũng cung cấp các tùy chọn hàng đợi và ưu tiên. Nếu sự cố xảy ra, e-mail sẽ được xếp hàng một lần nữa và được gửi sau nhưng các email khác sẽ vẫn được gửi đi.

Nó được gọi là Thư cơ sở dữ liệu trong SQL Server 2008 và SQL Mail trong các phiên bản trước.

Để biết thêm thông tin, hãy kiểm tra các liên kết bên dưới:

+0

Điều đó chỉ đơn giản là hút và không bao giờ nên được trong SQL Server để bắt đầu. – TomTom

+0

Điều gì đơn giản là hút? – Tarik

+1

xin vui lòng bỏ qua TomTom - anh ấy đã được sinh ra say rượu! Bạn đã thấy một số bình luận khác của mình chưa? –