当我可以从邮件客户端发送电子邮件时,为什么不能从C#应用程序发送电子邮件?

时间:2018-07-12 16:08:38

标签: c# .net email email-integration

我有一个任务来解决C#应用程序未能发送自动电子邮件的原因。我仔细检查了源代码,发现绝对没有错。

因此,我尝试从Thunderbird(我通常使用的电子邮件客户端)发送电子邮件。我指定了相同的SMTP中继,相同的UID和密码,并且一切正常。

为找出问题,我尝试编写一个非常简短的C#控制台应用程序,以查看可能出了什么问题。我写了以下内容:

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

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("my.server.with.ssl", 465);
            client.EnableSsl = true;
            client.Credentials = new NetworkCredential("uid", "pwd");
            var message = new MailMessage("me@example.com", "myemail@mydomain", "Test Message Subject", "Test Message Body");
            client.Send(message);    
        }
    }
}

我输入了与Thunderbird中相同的凭据。运行以上命令时,出现以下错误:

  

未处理的异常:System.Net.Mail.SmtpException:发送邮件失败。 ---> System.IO.IOException:无法从传输连接net_io_connectionclosed读取数据。

如何从Thunderbird发送电子邮件很好,但是当我尝试从基本的C#应用​​程序发送电子邮件时,上面的简单编程却无法正常工作?

编辑,我尝试按照@stuartd所链接的问题中的建议将端口号更改为587,在这种情况下,我得到一个错误,提示The operation timed out.

编辑我曾尝试使用其他电子邮件服务器并调整设置,但到目前为止没有任何效果。我尝试连接到用于个人电子邮件的同一SMTP服务器,但显示连接超时错误。

编辑我不能说为什么,但是尽管我没有更改任何代码,但现在一切似乎都可以正常工作。似乎我的联系发生了奇怪的事情。

2 个答案:

答案 0 :(得分:0)

尝试使用默认构造函数并仅指定主机。 另外,某些服务器要求在客户端代表其发送电子邮件之前,对客户端进行身份验证。尝试更改UseDefaultCredentials

的值
var mail = new MailMessage();
mail.From = new MailAddress("xxx@gmx.net");
mail.To.Add("yyy@gmail.com");
mail.IsBodyHtml = true;
mail.Subject = "subject";
mail.Body = "content";

var client = new SmtpClient();
client.UseDefaultCredentials = false;
client.Host = "mail.gmx.net";
client.EnableSsl = true;
client.Credentials = new NetworkCredential("user", "pass");
client.Send(mail);

如果这无助于告诉我们服务器名称是否为公共名称

答案 1 :(得分:0)

尝试使用:

SmtpClient smtpClient =新的SmtpClient(“ mail.mymailhost.com”);

smtpClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;