You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用双因素认证与应用密码后SmtpClient异常问题求助

Gmail SMTP 认证失败问题:5.7.0 Authentication Required

我使用CreateUserWizard控件实现用户注册时发送验证邮件,通过Gmail应用密码完成邮件发送,相关代码如下:

NewUserWizard 事件处理代码

Protected Sub NewUserWizard_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles NewUserWizard.SendingMail
    ' 获取刚创建用户的UserId
    Dim newUser As MembershipUser = Membership.GetUser(NewUserWizard.UserName)
    Dim newUserId As Guid = CType(newUser.ProviderUserKey, Guid)
    ' 其他业务代码...

    Dim obj As SecurePassword = New SecurePassword()
    Dim google As GoogleOauth = New GoogleOauth()

    ' 替换邮件内容中的验证URL占位符
    e.Message.Body = e.Message.Body.Replace("<%VerificationUrl%>", fullUrl)
    Select Case ConfigurationSettings.AppSettings("WhichSMTP")
        Case "gmail"
            Try
                obj.SendViaGmail(e.Message.Subject, e.Message.Body, e.Message.To.ToString())
            Catch ex As Exception
                Response.Write("Error sending email  " & ex.Message)
            End Try
      End Select
    End Sub

Secure.vb 中的邮件发送方法

Public Function SendViaGmail(subject As String, body As String, recipients As String)
        
        Dim fromEmail As String = ConfigurationSettings.AppSettings("ContactEmail")

        Dim smtpClient As Mail.SmtpClient = New Mail.SmtpClient("smtp.gmail.com") With {
            .Port = 587,
            .DeliveryMethod = SmtpDeliveryMethod.Network,
            .Credentials = New NetworkCredential(fromEmail, "APP_PWD"), 
            .EnableSsl = True
            }

        Dim mailMessage As MailMessage = New MailMessage With {
        .From = New Mail.MailAddress(fromEmail),
        .Subject = subject,
        .Body = body,
        .IsBodyHtml = True
    }

        mailMessage.[To].Add(recipients)
        If smtpClient IsNot Nothing Then
            smtpClient.Send(mailMessage)
        End If
    End Function

问题描述

持续收到错误提示:SMTP服务器需要安全连接或客户端未认证。服务器响应:5.7.0 Authentication Required,且成功收到邮件后应用会崩溃。已为Gmail账号启用双因素认证并生成应用密码,尝试过StackOverflow上的各类方案(如调整凭证配置顺序),均无效。

更新操作

将web.config中mailSettings的密码替换为应用密码后,问题依旧:

<system.net>
<mailSettings>
  <smtp deliveryMethod="Network" from="vl@gmail.com">
    <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" userName="vl@gmail.com" password="****" />
  </smtp>
</mailSettings>
</system.net> 

解决方案

1. 修正硬编码的应用密码问题

你的SendViaGmail方法中硬写了"APP_PWD",这是核心错误,需从配置文件读取真实的应用密码:

' 从web.config的mailSettings中读取密码
Dim smtpSettings As System.Net.Configuration.SmtpSection = CType(ConfigurationManager.GetSection("system.net/mailSettings/smtp"), System.Net.Configuration.SmtpSection)
Dim appPassword As String = smtpSettings.Network.Password

' 重构SMTP客户端配置
Dim smtpClient As Mail.SmtpClient = New Mail.SmtpClient("smtp.gmail.com") With {
    .Port = 587,
    .DeliveryMethod = SmtpDeliveryMethod.Network,
    .EnableSsl = True,
    .Credentials = New NetworkCredential(fromEmail, appPassword)
}

或在web.config新增独立配置项后读取:

<!-- web.config中添加 -->
<appSettings>
  <add key="GmailAppPassword" value="你的完整应用密码"/>
</appSettings>
' 代码中读取
Dim appPassword As String = ConfigurationSettings.AppSettings("GmailAppPassword")

2. 解决重复发送导致的应用崩溃

NewUserWizard_SendingMail是控件自带的邮件触发事件,控件本身会自动执行邮件发送逻辑,你手动调用SendViaGmail会导致双重发送,引发崩溃。二选其一处理:

  • 关闭控件自带发送:在CreateUserWizard属性中设置DisableCreatedUser="true",完全自定义发送流程;
  • 移除手动发送代码,直接通过配置好的web.config让控件自动发送e.Message。

3. 验证谷歌账号安全配置

  • 确认生成应用密码时,选择的应用类型为「邮件」,且对应账号与代码中fromEmail一致;
  • 登录谷歌账号查看「最近安全活动」,若存在被拦截的SMTP登录记录,点击「这是我本人操作」放行;
  • 确保账号未开启「不太安全的应用访问」(启用双因素认证后该选项会自动隐藏,无需操作)。

4. 调整SMTP配置顺序

部分环境下,先开启SSL再设置凭证能解决认证问题,调整配置顺序如步骤1中的代码所示。

5. 捕获完整异常信息

当前仅输出ex.Message无法定位深层问题,改为捕获完整异常:

Catch ex As Exception
    Response.Write("Error sending email: " & ex.ToString())
End Try

通过完整异常堆栈和服务器响应信息,进一步排查潜在问题。


内容的提问来源于stack exchange,提问作者Samra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:25:56