9

我正在使用此代码通过 yahoo SMTP 服务器发送 SMTP 电子邮件,这是针对我正在编写的个人项目。

using System.Net.Mail;
using System.Net;

SmtpClient theClient = new SmtpClient("smtp.mail.yahoo.com", 465);
theClient.UseDefaultCredentials = false;
theClient.Credentials = new NetworkCredential("username", "password");
theClient.EnableSsl = true;

MailMessage theMessage = new MailMessage("username@yahoo.com", 
                                         "to.someone@gmail.com");

theMessage.Subject = "Dave test from C# subject";
theMessage.Body = "Dave test from C# body";

theClient.Send(theMessage);

这都是发送 SMTP 电子邮件的标准代码,但是……服务器似乎抛出了一个错误。它强行终止连接。如果我使用其他 SMTP 服务器,如 Gmail、Windows Live 或各种其他 ISP Smtp 服务器,则不会发生这种情况。

这是异常和堆栈跟踪:

System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at ConsoleApplication1.Program.Main(String[] args) in E:\dev\ARCSoftware.FTPProcessor\ConsoleApplication1\Program.cs:line 28

我知道问题不是环境问题,因为我可以使用 Outlook Express 将这些确切设置发送到同一台服务器。我想知道我是否需要发送证书或其他东西?

如果您或您认识的任何人对此有任何想法,我将不胜感激。

4

5 回答 5

6
using System.Net.Mail;
using System.Net;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Send_Click(object sender, RoutedEventArgs e)
    {
        MailMessage oMail = new MailMessage(new MailAddress("username@yahoo.com"), new MailAddress("username@yahoo.com"));
        SmtpClient oSmtp = new SmtpClient();
        oSmtp.Host = "smtp.mail.yahoo.com";
        oSmtp.Credentials = new NetworkCredential("username", "password");
        oSmtp.EnableSsl = false;
        oSmtp.Port = 587;
        oSmtp.Send(oMail);
    }
}
于 2011-09-26T17:59:25.843 回答
3

465 不支持,但下面的帖子详细介绍了一种解决方法

如何使用 .NET Framework 通过 SSL SMTP 发送电子邮件?

更新:此链接详细说明了为什么它可以通过 Outlook Express 工作,但不能通过 System.Net.Mail

http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx

于 2011-02-23T15:02:20.050 回答
2

System.Net.Mail.SmtpClient 不支持端口 465。

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.enablessl.aspx

从备注部分:

此连接方法有时称为 SMTP/SSL、SMTP over SSL 或 SMTPS,默认情况下使用端口 465。当前不支持使用 SSL 的这种替代连接方法。

编辑:您可以尝试使用端口 587(如果 Yahoo 支持)。

于 2011-02-23T14:58:35.280 回答
0

在将端口设置为 587 并禁用 SSL 之前,我遇到了同样的问题。

于 2012-05-24T00:03:23.450 回答
-1

我认为您应该恢复到using System.Web.Mail哪个可以让您控制无法通过较新的 System.Net 访问的字段。试着和那些一起玩。例如,您可以尝试以下操作:(此处记录了使用,此处记录字段)

        MailMessage msg = new MailMessage();            
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "smtp.mail.yahoo.com");   
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");

        // try "2", I have not tested for yahoo mail
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", "2");                                    
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "1");                        
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); // 0= anonymous - 1=basic - 2=NTLM
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "yahoousername");
        msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "yahoopwd");
于 2011-02-23T15:17:29.797 回答