【问题标题】:Can't send email using implicit SSL smtp server无法使用隐式 SSL smtp 服务器发送电子邮件
【发布时间】:2013-02-23 10:01:56
【问题描述】:

我通过复制KB article 中的代码编写了一个示例程序,并对用户信息进行了一些小的编辑。它使用已弃用的 .NET 库 System.Web.Mail 来执行此操作,因为新的 System.Net.Mail 不支持隐式 SSL。我在端口 465 上使用 Google smtp 服务器对其进行了测试,这是他们的隐式电子邮件端口,一切正常。然而,当我把它交给一个客户在他的网络上测试它时,什么都没有发送/接收,这是错误:

2013-03-07 15:33:43 - The transport failed to connect to the server.
2013-03-07 15:33:43 -    at System.Web.Mail.SmtpMail.LateBoundAccessHelper.CallMethod(Object obj, String methodName, Object[] args)
2013-03-07 15:33:43 -    at System.Web.Mail.SmtpMail.CdoSysHelper.Send(MailMessage message)
2013-03-07 15:33:43 -    at System.Web.Mail.SmtpMail.Send(MailMessage message)

在电子邮件 SSL 方面我不是很精通,所以这是我对根本原因的可能理论:

假设他使用了正确的 smtp 服务器和正确的端口(SSL 端口),我想知道是否有以下任何原因:

  1. 他们在邮件服务器上使用 SSL,但他没有在运行我的程序的机器上安装证书,即使他在同一个域中并使用同一个电子邮件域作为发件人。

  2. 他们使用 SSL,但他们可能使用 NTLM 或匿名身份验证,而我的程序使用基本身份验证。

对不起,如果我提供的信息很少,因为我自己在这个领域很陌生,所以我还在研究更多。

你知道我可以采取什么步骤来确保我的小测试程序可以使用隐式 SSL 电子邮件服务器的 smtp 服务器发送吗?

编辑:我确实在我的代码中添加了以下行以表明我正在使用 SSL。

oMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");

【问题讨论】:

    标签: c# ssl smtp smtpclient


    【解决方案1】:

    也许现在回答太晚了,但请查看https://sourceforge.net/p/netimplicitssl/wiki/Home/

    您可以将邮件发送到端口 465 不需要修改你的代码,就这么多。

    来自项目的维基页面:

    var mailMessage = new MimeMailMessage();
    mailMessage.Subject = "test mail";
    mailMessage.Body = "hi dude!";
    mailMessage.Sender = new MimeMailAddress("you@gmail.com", "your name");
    mailMessage.IsBodyHtml = true;
    mailMessage.To.Add(new MimeMailAddress("yourfriend@gmail.com", "your friendd's name")); 
    mailMessage.Attachments.Add(new MimeAttachment("your file address"));
    var emailer = new SmtpSocketClient();
    emailer.Host = "your mail server address";
    emailer.Port = 465;
    emailer.EnableSsl = true;
    emailer.User = "mail sever user name";
    emailer.Password = "mail sever password" ;
    emailer.AuthenticationMode = AuthenticationType.PlainText;
    emailer.MailMessage = mailMessage;
    emailer.OnMailSent += new SendCompletedEventHandler(OnMailSent);
    //Send email
    emailer.SendMessageAsync();
    
    // A simple call back function:
    private void OnMailSent(object sender, AsyncCompletedEventArgs asynccompletedeventargs)
    {
        Console.Out.WriteLine(asynccompletedeventargs.UserState.ToString());
    }
    

    【讨论】:

      【解决方案2】:

      这里我使用 gmail smtp 使用 c# 发送邮件。请参阅下面的代码。它会给你一个洞察力,这些东西是如何工作的。将 gmail 设置替换为您的电子邮件服务器设置。不用担心安全证书,它们将由框架自己处理。

          public static bool SendMail(string to, string subject, string body)
          {
              bool result;
              try
              {
                  var mailMessage = new MailMessage
                  {
                      From = new MailAddress("your email address")
                  };
      
                  mailMessage.To.Add(new MailAddress(to));
                  mailMessage.IsBodyHtml = true;
                  mailMessage.Subject = subject;
                  mailMessage.Body = body;
                  var userName = "your gmail username";
                  var password = "your gmail password here";
                  var smtpClient = new SmtpClient
                  {
                      Credentials = new NetworkCredential(userName, password),
                      Host = smtp.gmail.com,
                      Port = 587,
                      EnableSsl = true
                  };
      
                  smtpClient.Send(mailMessage);
                  result = true;
              }
              catch (Exception)
              {
                  result = false;
              }
              return result;
          }
      

      您引用的那段代码非常陈旧且过时。 CDO 在 ASP 应用程序中用于发送邮件。我想你还没有向下滚动查看

      Article ID: 555287 - Last Review: April 7, 2005 - Revision: 1.0
      APPLIES TO
      Microsoft .NET Framework 1.1
      

      您引用的代码已经很老了...无论如何按照显示的代码进行操作,一切都会好起来的...

      更新

      我的错,我没有仔细阅读。但是

      我将保留上面的代码,因为它可能对您有所帮助 或任何其他需要通过 SSL 发送邮件功能的人 gmail 或任何其他服务器。

      。那么在这种情况下,您需要一些第三方应用程序。我为您找到了一个库See here

      【讨论】:

      • 谢谢阿米特,不幸的是这对我不起作用,因为我看到你正在使用 System.Net.Mail 库。它只支持显式 SSL 而不是隐式 SSL 的 TLS。如果您将其更改为端口 465,您的代码将不会发送,因为端口 587 上的 gmail 是显式 SSL,而 465 是隐式 SSL
      猜你喜欢
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 2012-06-10
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多