2010-10-11 87 views
1

这里是我的代码:.NET为什么我无法发送电子邮件?

try 
{ 
    MailMessage m = new MailMessage 
     ("[email protected]", 
     "[email protected]", 
     "Quarterly data report.", 
     "Hello, world."); 

    SmtpClient client = new SmtpClient("smtp.gmail.com", 465); 
    client.Credentials = new NetworkCredential("[email protected]", "password"); 
    client.EnableSsl = true; 
    client.Send(m); 
    Console.WriteLine("sent"); 
} 
catch (InvalidOperationException ey) 
{ 
    Console.WriteLine(ey.Message); 
} 
catch (SmtpFailedRecipientException sm) 
{ 
    Console.WriteLine(sm.Message); 
} 
catch (SmtpException ex) 
{ 
    Console.WriteLine(ex.Message); 
} 

此代码在SmtpException产生此错误: “发送邮件失败。” 全是例外的是:

ex.ToString() "System.Net.Mail.SmtpException: Failure sending mail. 
    ---> System.Net.WebException: Unable to connect to the remote server 
    ---> System.Net.Sockets.SocketException: A connection attempt failed because 
    the connected party did not properly respond after a period of time, or 
    established connection failed because connected host has failed to respond 
    74.125.67.109:587 
    at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception) 
    --- End of inner exception stack trace --- 
    at System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6, Int32 timeout) 
    at System.Net.PooledStream.Activate(Object owningObject, Boolean async, Int32 timeout, GeneralAsyncDelegate asyncCallback) 
    at System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback)\r\n at System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout) 
    at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint) 
    at System.Net.Mail.SmtpTransport.GetConnection(ServicePoint servicePoint) 
    at System.Net.Mail.SmtpClient.GetConnection() 
    at System.Net.Mail.SmtpClient.Send(MailMessage message) 
    --- End of inner exception stack trace --- 
    at System.Net.Mail.SmtpClient.Send(MailMessage message) 
    at ConsoleApplication3.Program.Main(String[] args) in c:\\users\\alan\\documents\\visual studio 2010\\Projects\\ConsoleApplication3\\ConsoleApplication3\\Program.cs:line 24" string 
+4

接受你的其他问题的一些答案,或者人们会不太愿意帮助你。 – 2010-10-11 16:48:31

+0

您的防火墙和网络边界的防火墙是否在正确的端口上打开? – 2010-10-11 16:49:33

+0

我不能,我需要一些声誉去做 – Alan 2010-10-11 16:49:38

回答

0

尝试使用这个片段发送一个简单的电子邮件:

var smtpClient = new SmtpClient("smtp.gmail.com", 587) 
{ 
    Credentials = new NetworkCredential(
     "[email protected]", 
     "yourpassword" 
    ), 
    EnableSsl = true 
}; 
smtpClient.Send("[email protected]", "[email protected]", "subject", "body"); 

从你的代码的差别就是587端口(而非465)。

+0

我测试过了,但它会抛出相同的错误。 无论如何谢谢 – Alan 2010-10-11 17:01:04

0

看起来您的脚本无法联系指定端口上的Gmail服务器。确保您的服务器可以通过远程登录到达该地址/端口并查看是否收到回复。

0

一段时间后我发生了类似的情况。我遵循在System.Net中使用SmtpClient的模板。经过研究,我发现我的ISP制定了策略来放弃某些端口上的邮件流量,因为他们希望人们通过他们自己的邮件服务器(打击垃圾邮件)来路由流量。

我的情况很复杂,因为我需要使用的端口(用于我的企业ymail帐户)被我的ISP阻止。原来我唯一可以连接的邮件服务器是gmail。因此,您可以尝试使用不同的邮件提供商,或与您的ISP就邮件丢失/阻止策略以及特定端口的处理方式进行交谈。

下面是我工作:

private bool sendEmailAlert(string emailAddress, string subject, string message) 
     { 
      try 
      { 
       //Construct e-mail message: 
       string fromAddress = "[email protected]", 
         fromName = "Your Biz";//"Don't Reply"; 
       MailMessage email_msg = new MailMessage(); 
       email_msg.From = new MailAddress(fromAddress, fromName); 
       email_msg.Sender = new MailAddress(fromAddress, fromName); 
       email_msg.To.Add(emailAddress); 
       email_msg.Subject = subject; 
       email_msg.Body = message; 
       SmtpClient mail_client = new SmtpClient(); 
       NetworkCredential network_cdr = new NetworkCredential(); 
       network_cdr.UserName = "[email protected]"; 
       network_cdr.Password = "password"; 
       mail_client.Credentials = network_cdr; 
       mail_client.Port = 587; 
       mail_client.Host = "smtp.gmail.com"; 
       mail_client.EnableSsl = true; 

       //Send e-mail message; 
       mail_client.Send(email_msg); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       StreamWriter errorFile = new StreamWriter("errorLog.txt", true); 
       errorFile.WriteLine(DateTime.Now.ToString() + ": sendEmailAlert exception: " + ex.ToString()); 
       errorFile.Close(); 
       return false; 
      } 
     } 
+0

老兄,你的代码是等于我的代码:U – Alan 2010-10-11 18:19:18

+0

该端口是不同的...张贴没有刷新,所以我没有看到他推荐改变你的端口。不过,有关探索ISP如何混淆“可疑”或“垃圾”流量的建议仍然存在。你也可能想确保你不是一个黑名单的IP地址。检查spamhaus.org并查看您的IP地址是否在策略阻止列表中。如果是,您可以删除并重新测试。许多ISP限制垃圾邮件阻止列表中列出的主机的邮件流量。 – kmarks2 2010-10-11 18:35:11

+0

好的,谢谢,但事实并非如此。 – Alan 2010-10-11 19:46:01