雅虎邮箱的 C# SMTP 电子邮件发送代码失败,但适用于其他服务器,有人可以帮忙吗?
Posted
技术标签:
【中文标题】雅虎邮箱的 C# SMTP 电子邮件发送代码失败,但适用于其他服务器,有人可以帮忙吗?【英文标题】:C# SMTP email sending code fails for Yahoo Mail but works fine for other servers, can anyone help? 【发布时间】:2011-07-02 19:26:46 【问题描述】:我正在使用此代码通过 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 将这些确切设置发送到同一台服务器。我想知道我是否需要发送证书或其他什么?
如果您或您认识的任何人对此有任何想法,我将不胜感激。
【问题讨论】:
雅虎可能有(不同的)反垃圾邮件政策。您必须向他们咨询规则是什么。 NetworkCredential 参数是否正确?用户名是完整的电子邮件地址 感谢您的输入。是的,我检查了他们的文档,他们指定使用不带@yahoo.com 的用户名。正如我所说,它确实可以通过具有完全相同设置的 Outlook Express 工作。 它是 Yahoo Plus 帐户还是免费帐户?我知道 POP3 仅适用于 Yahoo Plus 帐户,想知道这是否也适用于 SMTP 端? 您确定可以在 Outlook 中发送电子邮件吗?据我了解,您必须升级到 Yahoo Mail Plus 才能使用第三方客户端。 【参考方案1】: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);
【讨论】:
转发邮件需要时间吗? 我收到:邮箱不可用。服务器响应为:未采取请求的邮件操作:邮箱不可用【参考方案2】:465 不支持,但下面的帖子详细介绍了一种解决方法
How can I send emails through SSL SMTP with the .NET Framework?
更新:此链接详细说明了为什么它可以通过 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
【讨论】:
旧的 System.Web.Mail/CDO 方法可以工作,但整个命名空间自 2.0 以来已被弃用。这个项目(作为“个人项目”)可能没问题,但我不会将它用于任何将要投入生产的东西。【参考方案3】: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 支持的话)。
【讨论】:
【参考方案4】:在将端口设置为 587 并禁用 SSL 之前,我遇到了同样的问题。
【讨论】:
【参考方案5】:我认为您应该恢复到using System.Web.Mail
,它可以让您控制无法通过较新的 System.Net 访问的字段。
试着和那些一起玩。例如你可以试试这个:
(使用记录在here,字段记录在here)
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");
【讨论】:
以上是关于雅虎邮箱的 C# SMTP 电子邮件发送代码失败,但适用于其他服务器,有人可以帮忙吗?的主要内容,如果未能解决你的问题,请参考以下文章