【问题标题】:The SMTP server requires a secure connection or the client was not authenticated. Must issue a Must issue a STARTTLS command firstSMTP 服务器需要安全连接或客户端未通过身份验证。必须先发出 必须发出 STARTTLS 命令
【发布时间】:2018-10-05 21:38:52
【问题描述】:

当我尝试向我自己的环境发送外部电子邮件时,我的 try{} catch{} 语句出现以下错误。在查看了多个帖子后,我找到了任何答案,因为我所有的 Smpt 配置似乎都是正确的。此错误仅发生在 gmail 地址...

错误:

System.Net.Mail.SmtpException: 'SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是: 5.7.0 必须首先发出 STARTTLS 命令。 g18-v6sm1366471iob.79 - gsmtp'

配置:

MyServer.UseDefaultCredentials = false;
port is 587.
network host="smtp.gmail.com 
enableSsl="true" 

我的 catch 块出错:

catch (Exception ex)
{
    System.Diagnostics.Debug.Print(ex.Message);

    myReturn = 0;
    throw;
}

完整代码:

    public static int SendEmail(xxx.Models.Email passEmail, string fromEmail)
    {
        int myReturn = 0;

        // Get SMTP properties for specific employee
        SmtpSettings mySmtpSettings = ServiceAssistantService.SmtpSettingsService.GetSmtpSettings(passEmail.Employee.ID);
        if ((mySmtpSettings == null || string.IsNullOrWhiteSpace(mySmtpSettings.UserID) || string.IsNullOrWhiteSpace(mySmtpSettings.Password) || string.IsNullOrWhiteSpace(mySmtpSettings.Server) || mySmtpSettings.Port == 0)
            && passEmail.EmailSettings != null)
            mySmtpSettings = passEmail.EmailSettings;

        SmtpClient MyServer = new SmtpClient();
        MailMessage MyMessage = new MailMessage();

        try
        {

            // Specify the properties of the SMTP Server
            MyServer.Host = mySmtpSettings.Server.Trim();
            MyServer.Port = mySmtpSettings.Port;
            MyServer.EnableSsl = mySmtpSettings.UseSecure;
            MyServer.UseDefaultCredentials = false;


            // Provide specific credentials to SmptServer
            NetworkCredential NC = new NetworkCredential();
            NC.UserName = mySmtpSettings.UserID;
            NC.Password = mySmtpSettings.Password;
            MyServer.Credentials = NC;


            if (fromEmail.IsValidEmailAddress())
            {
                MailAddress from = new MailAddress(fromEmail, fromEmail);
                MyMessage.From = from;
            }

            // Create TO addresses
            foreach (string myTo in passEmail.emailTo)
            {
                var myToAddresses = myTo.Replace(" ", "").Replace(";", ",").Split(',');
                foreach(var toAddress in myToAddresses)
                {
                    if (toAddress.Trim() != "" && toAddress.Trim().IsValidEmailAddress())
                    {
                        MailAddress receiver = new MailAddress(toAddress.Trim(), toAddress.Trim());
                        MyMessage.To.Add(receiver);
                    }
                }
            }

            // Create CC address
            foreach (string myCC in passEmail.emailCC)
            {
                if (myCC.Trim() != "" && myCC.Trim().IsValidEmailAddress())
                {
                    MailAddress receiver = new MailAddress(myCC.Trim(), myCC.Trim());
                    MyMessage.CC.Add(receiver);
                }
            }

            // Create BCC address
            foreach (string myBCC in passEmail.emailBCC)
            {
                if (myBCC.Trim() != "" && myBCC.Trim().IsValidEmailAddress())
                {
                    MailAddress receiver = new MailAddress(myBCC.Trim(), myBCC.Trim());
                    MyMessage.Bcc.Add(receiver);
                }
            }

            // HTML or Plain Text
            MyMessage.IsBodyHtml = passEmail.emailIsHTML;

            // Populate Subject/Body
            MyMessage.Subject = (passEmail.emailSubject ?? "").Trim();
            MyMessage.Body = (passEmail.emailBody ?? "").Trim();

            // Create Attachments
            if (passEmail.emailAttachments != null)
            {
                foreach (Attachment myFile in passEmail.emailAttachments)
                {
                    if (myFile != null)
                    {
                        MyMessage.Attachments.Add(myFile);
                    }
                }
            }


            // VALIDATION START 
            if (mySmtpSettings.Server.Trim() == "" || mySmtpSettings.Port == 0)
            {
                throw new System.InvalidOperationException("E-Mail Server Not Configured");
            }
            else if (mySmtpSettings.UserID.Trim() == "" || mySmtpSettings.Password.Trim() == "")
            {
                throw new System.InvalidOperationException("E-Mail Sending Credentials Not Configured");
            }
            else if (MyMessage.From.Address == "")
            {
                throw new System.InvalidOperationException("Employee Not Configured For E-Mail");
            }
            // VALIDATION END


            // Send the e-mail message
            MyServer.Send(MyMessage);


            // Populate the EMAIL LOG in the database
            myReturn = ServiceAssistantService.EmailLogService.SaveEmailLog(new EmailLog()
            {
                CustomerID = passEmail.CustomerID,
                EmployeeId = passEmail.Employee.ID,
                actionId = passEmail.ActionID,
                attemptId = passEmail.AttemptID,
                ProgramId = passEmail.ProgramID,
                ServiceId = passEmail.ServiceID,
                From = fromEmail,

                To = string.Join(",", passEmail.emailTo),
                BCC = string.Join(",", passEmail.emailBCC),
                CC = string.Join(",", passEmail.emailCC),

                Subject = passEmail.emailSubject,
                Body = passEmail.emailBody,
                Attachments = (MyMessage.Attachments != null) ? MyMessage.Attachments.Count : 0,
            });


        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Print(ex.Message);

            myReturn = 0;
            throw;
        }
        finally
        {
            MyMessage.Dispose();
            MyServer.Dispose();
        }

        return myReturn;
    }

【问题讨论】:

  • 你确定这行分配true:MyServer.EnableSsl = mySmtpSettings.UseSecure;
  • 是的,它设置为 true。我所有的变量都设置正确,所以我不确定我真的错过了什么......谢谢。

标签: c# .net


【解决方案1】:

这是由 2 因素身份验证引起的问题。如果它关闭没有问题。

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 2016-02-17
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2023-03-21
    • 2011-05-28
    相关资源
    最近更新 更多