2009-07-17 25 views
37

Không thể kiểm tra gửi email từ mã .NET trong Windows Vista Business."Không thể đọc dữ liệu từ kết nối truyền tải: net_io_connectionclosed." - Windows Vista Business và SMTP

Tôi viết mã mà tôi sẽ di chuyển đến một gói SSIS một khi nó đã được chứng minh của nó. Mã này là để gửi một thông báo lỗi qua email đến một danh sách người nhận.

Mã dưới đây, tuy nhiên tôi nhận được ngoại lệ khi tôi thực thi mã.

Tôi tạo ra một lớp đơn giản để thực hiện gửi thư ... thiết kế có thể được tốt hơn, tôi đang thử nghiệm chức năng trước khi thực hiện chức năng mạnh mẽ hơn, phương pháp vv

namespace LabDemos 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Mailer m = new Mailer(); 
      m.test();  
     } 
    } 
} 

namespace LabDemos 
{ 
    class MyMailer 
    {  
     List<string> _to = new List<string>(); 
     List<string> _cc = new List<string>(); 
     List<string> _bcc = new List<string>(); 
     String _msgFrom = ""; 
     String _msgSubject = ""; 
     String _msgBody = "";    

     public void test(){ 
     //create the mail message 
     MailMessage mail = new MailMessage(); 

     //set the addresses 
     mail.From = new MailAddress("[email protected]");    

     //set the content 
     mail.Subject = "This is an email"; 
     mail.Body = "this is a sample body"; 
     mail.IsBodyHtml = false;  

     //send the message 
     SmtpClient smtp = new SmtpClient(); 
     smtp.Host = "emailservername"; 
     smtp.Port = 25; 
     smtp.UseDefaultCredentials = true; 
     smtp.Send(mail);    
    } 
} 

Exception nhắn

Inner Exception 
{"Unable to read data from the transport connection: net_io_connectionclosed."} 

Stack Trace 
" at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)\r\n at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)\r\n at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)\r\n at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)\r\n at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)\r\n at System.Net.Mail.SmtpClient.GetConnection()\r\n at System.Net.Mail.SmtpClient.Send(MailMessage message)" 


Outer Exception 
    System.Net.Mail.SmtpException was unhandled 
    Message="Failure sending mail." 
    Source="System" 
    StackTrace: 
     at System.Net.Mail.SmtpClient.Send(MailMessage message) 
     at LabDemos.Mailer.test() in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Mailer.cs:line 40 
     at LabDemos.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Program.cs:line 48 
     at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
     at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) 
     at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) 
     at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() 
     at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) 
     at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) 
     at System.Activator.CreateInstance(ActivationContext activationContext) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: System.IO.IOException 
     Message="Unable to read data from the transport connection: net_io_connectionclosed." 
     Source="System" 
     StackTrace: 
      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.SmtpConnection.GetConnection(String host, Int32 port) 
      at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port) 
      at System.Net.Mail.SmtpClient.GetConnection() 
      at System.Net.Mail.SmtpClient.Send(MailMessage message) 
     InnerException: 
+0

Tôi sẽ không cung cấp câu trả lời cho điều này đơn giản chỉ vì tôi không biết đủ về SMTP để cảm thấy tốt về nó. Tuy nhiên, điều này chắc chắn âm thanh như một vấn đề môi trường (có thể là trong các thiết lập IIS). Bạn đang sử dụng 1) "localhost" cho smtp.Host 2) một máy chủ từ xa cho smtp.Host và/hoặc 3) một IP cụ thể chứ không phải là tên máy chủ? –

+0

Tôi lưu trữ thư của tôi đang được gọi theo tên. Ví dụ "trao đổi". Tôi đã thử nghiệm DNS thông qua ping máy chủ. Điều này đã thành công. Tôi cũng đã thử cổng truy cập thông qua telnet đến cổng 25. Điều này cũng thành công. Tôi đã thử nghiệm mã trên một máy khác và đã có thể gửi tin nhắn. Dường như với tôi tôi cần phải cài đặt một số loại dịch vụ SMTP/giao thức trên máy. Máy mà mã không thành công là Windows Vista Business. Các thử nghiệm đã thành công trên Windows Server 2008 Standard. –

+0

vui lòng tham khảo: http://stackoverflow.com/questions/13689265/net-3-5-smtpclient-failure-sending-email-works-only-after-restarting-everyt/14272912#14272912 –

Trả lời

1

Tôi thấy rằng Hệ điều hành Vista Business không đi kèm với IIS SMTP. Tôi nghi ngờ đây là phần còn thiếu của câu đố. Có ai có may mắn với vấn đề này không?

6

Nếu bạn đã chỉ định địa chỉ IP trong cài đặt Dịch vụ SMTP, hãy đảm bảo rằng bạn đang chỉ định địa chỉ IP của máy đó trong IIS7 và không đặt localhost.

IIS7 giúp bạn dễ dàng chọn 'localhost' nhưng điều đó sẽ dẫn đến lỗi này nếu IP ví dụ là 10.0.0.1

1

là mã incompleted.Dash bạn là chính xác trong việc xác định it.Other sau đó kiểm tra smtp thành phần được cài đặt hoặc không kiểm tra link text

3

Vista và Windows 7 không có bất kỳ máy chủ SMTP nào, cơ sở này đã bị xóa khỏi Windows XP, vì vậy bạn cần thiết lập máy chủ SMTP của mình một cách rõ ràng, một số công cụ có sẵn trên thị trường , bạn có thể kiểm tra điều đó. Ngoài ra khi bạn định cấu hình SMTP, hãy nhớ kiểm tra tên máy chủ mà bạn sẽ sử dụng để gửi e-mail.

0

nâng cấp lên .NET 4.0 và áp dụng tất cả các cập nhật bảo mật

16

Có một vài điều mà có thể gây ra vấn đề này, và đây là một số trong những điều mà tôi đã tìm thấy. Câu hỏi: Bạn đề cập đến "Exchange" - Đây có phải là máy chủ trao đổi không? Máy chủ có yêu cầu xác thực (có thể bạn cần thêm xác thực cho ứng dụng khách) không? Những gì tôi sẽ cố gắng làm đầu tiên là gán máy chủ cho địa chỉ IP tĩnh thay vì tên máy chủ để xem có hoạt động trước không. Nếu có thì rất có thể đó là vấn đề với ánh xạ DNS.

If you are running your exchange server with Virtualization, you need to configure the SmtpClient to the host IP of the Virtual Server, not the physical hosting server name or IP. Right click on Default SMTP virtual server, select Properties, then go to Access tab, click Relay then add the IP address of the computer that send SMTP request to the SMTP server. (ASP.net site)

Nếu điều này không hoạt động, đó là do máy chủ chặn bạn gửi gói SMTP. Bạn cần đảm bảo thêm hộp bạn đang gửi tin nhắn SMTP từ máy chủ SMTP. Điều này được thực hiện thông qua tab xác thực của IIS.

Tôi cũng muốn chỉ ra rằng bạn nên vứt bỏ ứng dụng thư khách hoặc sử dụng ứng dụng khách trong câu lệnh "đang sử dụng". Điều này sẽ đảm bảo rằng "QUIT" được gửi đến máy chủ và đóng kết nối một cách duyên dáng.

using(SmtpClient smtp = new SmtpClient()) 
{ 
    smtp.Host = "emailservername"; 
    smtp.Port = 25; 
    smtp.UseDefaultCredentials = true; 
    smtp.Send(mail) 
} 
+1

Tôi đang gặp sự cố việc tìm kiếm bất kỳ thứ gì xác nhận câu lệnh sử dụng sẽ gửi QUIT khi kết thúc. Nói ngắn gọn cách đóng kết nối một cách duyên dáng mà không cần sử dụng câu lệnh. – Zman101

+0

Nếu bạn xem tài liệu cho SmtpClient.Dispose(), bạn sẽ thấy điều này: "Gửi tin nhắn QUIT đến máy chủ SMTP, kết thúc kết nối TCP một cách duyên dáng và giải phóng tất cả các tài nguyên được sử dụng bởi phiên bản hiện tại của Hệ thống .Net.Mail.SmtpClient class. " –

7

Khởi động lại IIS. Tôi biết điều này nghe có vẻ ngớ ngẩn, để khởi động lại mọi thứ. (và xin lỗi để bump lên một thread cũ). Nhưng đôi khi khởi động lại IIS hoạt động ma thuật. Tôi phải đối mặt với chính xác cùng một vấn đề và khởi động lại giải quyết nó.

Có thể đã xảy ra vì tạm thời không thể giải quyết tên 'localhost'. Tôi, m chỉ đăng bài ở đây để một người nào đó đối mặt với nó bây giờ có thể sẽ cố gắng sửa chữa nhanh chóng này trước khi cố gắng điều tra thêm. Hy vọng nó giúp

+1

ngạc nhiên thú vị .. nó hoạt động !!! – sawe

1

tôi đang phải đối mặt với vấn đề này 6hr cuối cùng và tôi mới vào đó vì vậy tôi đang cố gắng để giải quyết vấn đề này trong sau cách

1) tôi mở cửa sổ lệnh (vd Ctrl + R loại cmd và nhập).
2) Và kiểm tra ping máy chủ SMTP và kiểm tra phản hồi.
3) Nếu nhận được phản hồi thì không sao và di chuyển bước tiếp theo 4 tên smtp khôn ngoan khác là sai.
4) Sau đó, tôi kiểm tra bằng cổng smtp telnet (ví dụ: 25) có mở hay không.
5) Sử dụng cmd này, chúng tôi kiểm tra phản hồi SMTP.
6) telnet "yoursmtpname" "portno” (ví dụ như telnet smtp.gmail.com 25)
7) Nếu telnet không hoạt động, hãy cài đặt hoặc thêm từ bảng điều khiển ở thêm các tính năng mới.
8) Nếu nó làm việc thì đó là vượt qua kết quả như thế nào.
9) 220 mx.google.com ESMTP.

Sử dụng các bước trên chúng ta có thể tìm ra kết nối smtp là sẵn sàng hay không để gửi thư.

2

tôi đã có cùng một vấn đề kể từ khi tôi có nhiều IP trên serv của tôi er (máy chủ ảo) và máy chủ của tôi đã được trỏ đến localhost khi SMTP của tôi Virtual Server đã được giao cho một IP cụ thể:

<smtp deliveryMethod="Network"> 
     <network host="localhost" port="25" defaultCredentials="false"/> 
</smtp> 

Có 2 giải pháp cho việc này:

  1. Thay đổi của bạn mã và đặt máy chủ lưu trữ cho IP cụ thể đang được SMTP Virtual Server sử dụng thay vì localhost.
  2. Thay đổi SMTP Virtual Server IP để All Unassigned

Để xem/thay đổi SMTP Virtual Server IP: Nhấp chuột phải vào Default SMTP máy chủ ảo, chọn Properties, về biến đổi tab General/xem địa chỉ IP.

Hy vọng điều này sẽ giúp tiết kiệm một ngày của ai đó với cùng một vấn đề.

1

Tôi đã phát triển một ứng dụng Dịch vụ Windows trong VB bằng .NET Framework v4.5 và gần đây đã gặp sự cố này.

Trước tiên, một chút nền - Tôi gặp phải lỗi của OP sau khi cố xử lý lỗi "Dịch vụ không khả dụng, đóng kênh truyền. Phản hồi của máy chủ là: Lỗi: quá nhiều thư trong một phiên" đã được giải quyết bởi gọi phương thức Dispose trên đối tượng SmtpClient sau mỗi email được gửi đi.Chỉ cần cực kỳ an toàn, tôi cũng được gọi là Vứt bỏ trên đối tượng MailMessage.

Được rồi, vì vậy hiện tại sự cố 'quá nhiều thư trong một phiên' đã được giải quyết nhưng giờ đây tôi gặp phải lỗi 'Không thể đọc dữ liệu từ kết nối truyền tải: net_io_connectionclosed'. Tuyệt vời. Hóa ra tôi đã không thực hiện lớp email của tôi một cách nhất quán - trong một trường hợp, nó đã được xử lý trong khi trong trường hợp khác thì không.

Dưới đây là một ví dụ về những gì giải quyết cả hai vấn đề đối với tôi (đó là trong VB nhưng bạn sẽ có được ý tưởng):

With New clsEmail(True) 
    With .Message 
     .To.Add("[email protected]") 
     .Subject = msgSubject 
     .Body = msgContents 
    End With 

    .Server.Send(.Message) 
    .Server.Dispose() 
    .Message.Dispose() 
End With 

lớp email của tôi đã, trong số những thứ khác, có 2 thuộc tính - tin nhắn (System.Net .Mail.MailMessage) và Server (System.Net.Mail.SmtpClient) là những gì đang được xử lý trong ví dụ này.

Tôi chưa gặp một vấn đề nào sau hàng trăm email mỗi khi một cá thể gửi email trong dịch vụ của tôi được triển khai theo cách này.

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