【问题标题】:Gmail SMTP failure using c# SmtpClient使用 c# SmtpClient 的 Gmail SMTP 失败
【发布时间】:2020-12-29 16:53:11
【问题描述】:

我们的应用程序可以通过 SmtpClient 发送电子邮件。我们的一位客户试图通过使用他的 gmail 帐户来执行此操作,但失败导致超时。但是,在我们的测试实验室中,它可以正常工作(使用另一个 gmail 帐户)。

在跟踪中,我可以看到服务器没有用证书、服务器密钥交换、服务器问候完成来回答。我想知道这可能是什么原因?

我还在跟踪中注意到,客户使用的是 TLSv1,所以我尝试在 Windows7 系统上复制该错误,但它仍然对我有效。

    oSmtp = new SmtpClient(this.host, this.port);
                oSmtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                oSmtp.EnableSsl = ssl;
                NetworkCredential oCredential = new NetworkCredential(this.userName, this.password);
                oSmtp.Credentials = oCredential;
                oSmtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
                string userState = null;
                oSmtp.SendAsync(oMsg, userState);

就代码而言,enableSsl 为 true,端口为 587,我们还指示我们的客户检查他的 gmail 帐户并允许安全性较低的应用程序。

我们会询问客户更具体的细节,并尝试在我们的应用程序中添加更多的痕迹,但我想知道是否有任何东西可以阻止服务器使用证书来回答,...

检查痕迹显示客户 Client Hello 和我们的测试 Client Hello 之间没有显着差异。

谢谢!

【问题讨论】:

  • 请编辑您的问题并包含实际代码和堆栈跟踪而不是图像。询问用户是否启用了 2fa?
  • 我会问一下 2fa。我会尝试在我们的实验室进行测试,看看我们是否得到类似的结果
  • 刚在实验室做了个测试,gmail账号是2fa,连Server Hello部分都进不去。
  • 为了在帐户上使用启用了 2fa 的 SMTP 服务器,您需要创建一个 app password 并使用它而不是密码本身。 SMTP 服务器无法处理 2fa 调用。
  • 我不打算在启用 2fa 的情况下使用 smtp。我刚刚对当前应用程序进行了测试,看看如果帐户有 2fa,它与服务器的通信能走多远。对比结果,客户端没有开启2fa。

标签: c# ssl smtp gmail


【解决方案1】:

这是我几天前使用的工作示例:

            string fromAddress = "fromaddress@gmail.com";
            var toAddress = new MailAddress("fake@email.com", "To person");
            const string fromPassword = "pass";
            const string subject = "test";
            const string body = "Hey now!!";

            using (MailMessage mail = new MailMessage())
            {
                mail.From = new MailAddress(fromAddress);
                mail.To.Add(toAddress);
                mail.Subject = subject;
                mail.Body = body;
                mail.IsBodyHtml = true;
                //mail.Attachments.Add(new Attachment("C:\\file.zip"));
               
                using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
                {
                    smtp.UseDefaultCredentials = false;
                    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
                    smtp.EnableSsl = true;
                    smtp.Send(mail);
                }
            }

还要确保为您用来发送数据的 gmail 启用 Less secure app access

【讨论】:

  • 谢谢!对于我们所有其他客户(我不知道有多少人在使用 gmail),代码本身可以正常工作,并且可以在实验室(使用 gmail 帐户)中工作。只是这个客户无法使用他的 gmail 帐户发送电子邮件。我们指示他启用不太安全的应用程序访问。并且还进行了测试,看看如果他没有启用它,与 gmail 服务器的通信会走多远。比较结果,我们得出的结论是他确实启用了它
  • @AlexandraRamona 所以它可能只需要启用不太安全的应用程序访问
  • 在我们的实验室中,如果我们使用 gmail 客户端而没有启用不太安全的应用程序,并且我们不会到达服务器发送 Server Hello 的部分。虽然对于我们的客户来说会发生这种情况,所以我们得出结论他确实启用了这个选项。但是服务器正在继续握手并且不发送错误。这很奇怪
猜你喜欢
  • 2017-10-19
  • 2019-01-20
  • 2020-09-24
  • 2020-05-15
  • 2017-10-26
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
相关资源
最近更新 更多