2010-02-05 41 views
11

đây là mã của tôiSmtpClient "thất bại gửi thư"

for(int i = 0; i < number ; i++) 
{ 
MailAddress to = new MailAddress(iMail.to); 
MailAddress from = new MailAddress(iMail.from, iMail.displayName); 
string body = iMail.body; 
string subject = iMail.sub; 
oMail = new MailMessage(from, to); 
oMail.Subject = subject; 
oMail.Body = body; 
oMail.IsBodyHtml = true; 
oMail.Priority = MailPriority.Normal; 
oMail.Sender = from; 
s = new SmtpClient(smtpServer); 
if (s != null) 
{ 
 s.Send(oMail); 
} 
oMail.Dispose(); 
s = null; 
} 

này vòng gửi hơn 60.000 email. nhưng vấn đề của tôi tôi nhận được "thất bại gửi thư" trong một số email một số lần 5000 và một số thời gian ít hơn sau đó phần còn lại của họ được giao. và tôi đã kiểm tra tất cả các email lỗi đó có địa chỉ email hợp lệ. không biết vấn đề là gì. tôi thực sự cần giúp đỡ trong việc này.

Chỉnh sửa: Đây là ngoại lệ của tôi dấu vết

Error - Failure sending mail.; Inner Ex - System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed. at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine) at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine) at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller) at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response) at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from) at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)

+0

Tôi tin rằng điều này có thể giúp bất cứ ai có vấn đề tương tự. http://support.microsoft.com/kb/2183292/en-us – curiousBoy

Trả lời

3

dường như sự cố này đã được giải quyết chỉ bằng cách tăng kích thước hàng đợi trên máy chủ SMTP của bên thứ 3 của tôi. nhưng câu trả lời của Nip nghe có vẻ khá hữu ích:

1

gì lỗi nào bạn nhận được nó là một SmtpFailedrecipientException? nếu vậy bạn có thể kiểm tra danh sách innerexceptions và xem StatusCode để có thêm thông tin. liên kết dưới đây có một số thông tin tốt

MSDN

Chỉnh sửa các thông tin mới

Thisis một vấn đề với việc tìm kiếm máy chủ SMTP của bạn từ những gì tôi có thể thấy, mặc dù bạn nói rằng nó chỉ xảy ra trên một số email. Bạn đang sử dụng nhiều hơn một máy chủ smtp và nếu như vậy có thể bạn có thể giải quyết vấn đề xuống một cụ thể, nếu không nó có thể là tốc độ/số lượng email bạn đang gửi gây ra một số vấn đề của máy chủ smtp của bạn.

+0

Cảm ơn Pharabus, tôi đã sửa đổi câu hỏi của mình với ngoại lệ trace.it nói "net_io_connectionclosed", điều đó có nghĩa là gì? – Nnp

+0

Cảm ơn Pharabus, tôi chỉ sử dụng một máy chủ smtp cho tất cả mọi người. tôi đã tìm thấy số này http://forums.asp.net/t/924682.aspx, trong bài đăng cuối cùng của diễn đàn này, ai đó đã nói để sử dụng lient.ServicePoint.MaxIdleTime = 1; Điều đó có ý nghĩa? – Nnp

+0

Tôi chắc chắn sẽ xem xét điều đó, một điều khác bạn có thể làm là tạm dừng một giây hoặc lâu hơn tùy thuộc vào cách bạn muốn sử dụng vòng lặp (rõ ràng là 1 giây tạm dừng và 60.000 vòng lặp thêm khá chậm trễ quá trình) – Pharabus

8

Vâng, "lỗi gửi e-mail" hy vọng sẽ có chi tiết hơn một chút. Nhưng có một vài điều có thể gây ra điều này.

  1. Hạn chế về địa chỉ "Từ". Nếu bạn đang sử dụng các địa chỉ khác nhau, một số có thể bị chặn bởi dịch vụ SMTP của bạn để có thể gửi.
  2. Phòng chống dịch vụ SMTP của bạn có thể ngăn không cho e-mail thoát ra ngoài.

Bất kể nếu đó là một trong các lỗi này hoặc lỗi khác, bạn sẽ muốn xem ngoại lệ và ngoại lệ bên trong để biết thêm chi tiết.

+0

Cảm ơn Mitchel, tôi sử dụng cùng một địa chỉ email "từ" cho tất cả, nhưng hầu hết trong số họ đã được gửi. điều đó có nghĩa là tùy chọn (2) bị bỏ ra để kiểm tra? – Nnp

+0

Có, rất có thể. Nhiều dịch vụ SMTP có cấu hình X trên Y để tăng tốc. Nếu bạn nắm bắt được ngoại lệ đầy đủ, bao gồm cả ngoại lệ bên trong, bạn sẽ có thể nhận được một chút ánh sáng hơn về tình hình. –

+0

Cảm ơn Mitchel, tôi đã sửa đổi câu hỏi của mình với trace.it ngoại lệ nói "net_io_connectionclosed", điều đó có nghĩa là gì? – Nnp

2

Tôi gặp phải sự cố tương tự khi gửi email có khối lượng lớn. Đặt thuộc tính deliveryMethod thành PickupDirectoryFromIis đã sửa nó cho tôi. Cũng không tạo SmtpClient mới mọi lúc.

+0

Cảm ơn Nip, bạn có sử dụng máy chủ smtp cục bộ không? trường hợp tôi có smtp bên thứ 3 (với ip cố định), hiện công việc này sửa chữa làm việc với máy chủ của bên thứ ba? – Nnp

+0

Vâng, với bộ 'PickupDirectoryFromIis', tệp EML được lưu vào thư mục mà từ đó IIS chọn các e-mail để gửi. Bạn vẫn có thể kiểm tra điều này bằng cách thay đổi cấu hình smtp cục bộ của bạn: IIS-> máy chủ SMTP mặc định -> thuộc tính -> phân phối -> nâng cao và sau đó bạn có thể thiết lập máy chủ thông minh làm địa chỉ IP của bên thứ ba. – Romhein

1

Đối với chúng tôi, mọi thứ đều tốt, email rất nhỏ và không nhiều email được gửi và nhẹ nhàng đưa ra lỗi này. Có vẻ như một kỹ thuật viên đã cài đặt ASTARO đang ngăn chặn email được gửi đi. và chúng tôi đã nhận được lỗi này vì vậy có lỗi là một chút khó hiểu nhưng tôi hy vọng điều này có thể giúp người khác.

1

Xem vòng lặp của bạn để gửi email và lỗi mà bạn cung cấp chỉ có giải pháp.
Khai báo đối tượng thư ra khỏi vòng lặp và gán fromaddress ngoài vòng lặp mà bạn đang sử dụng để gửi thư. Trường fromaddress sẽ được gán lại một lần nữa trong vòng lặp đó là vấn đề của bạn.

0

Lỗi này có thể xuất hiện khi máy chủ web không thể truy cập vào máy chủ thư. Đảm bảo máy chủ web có thể truy cập máy chủ thư, ví dụ: ping nó.

0

Năm năm sau (Tôi hy vọng nhà phát triển này không vẫn đang chờ đợi một sửa chữa này ..)

tôi đã cùng một vấn đề, nguyên nhân do lỗi tương tự: Tôi đã tuyên bố SmtpClient bên trong vòng lặp.

Việc sửa chữa rất đơn giản - khai báo nó một lần, bên ngoài vòng lặp ...

MailAddress mail = null; 
SmtpClient client = new SmtpClient(); 
client.Port = 25; 
client.EnableSsl = false; 
client.DeliveryMethod = SmtpDeliveryMethod.Network; 
client.UseDefaultCredentials = true; 
client.Host = smtpAddress;  // Enter your company's email server here! 

for(int i = 0; i < number ; i++) 
{ 
    mail = new MailMessage(iMail.from, iMail.to); 
    mail.Subject = iMail.sub; 
    mail.Body = iMail.body; 
    mail.IsBodyHtml = true; 
    mail.Priority = MailPriority.Normal; 
    mail.Sender = from; 
    client.Send(mail); 
} 
mail.Dispose(); 
client.Dispose();