VB.NET Web Form点击btnSubmit发送邮件触发Catch异常报错
问题场景
在ASP.NET Web Form(.aspx.vb后置代码)中实现btnSubmit按钮点击发送邮件功能时,代码进入Catch ex As Exception异常分支,邮件发送失败。原有实现代码如下:
Dim mail As MailMessage = New MailMessage mail.From = New MailAddress("example@gmail.com") mail.To.Add(New MailAddress("example@gmail.com")) mail.Subject = "TEST SUBJECT" mail.Body = "Test Message" mail.IsBodyHtml = True Dim client As SmtpClient = New SmtpClient("smtp.gmail.com", 587) client.EnableSsl = True Try client.Send(mail) MsgBox("Sending Email succeeded") 'Return True if there is nothing error while sending email. Catch ex As Exception MsgBox("Sending Email failed. Please try again") End Try
故障原因
- 核心配置缺失:Gmail SMTP服务强制要求身份验证,原有代码未给
SmtpClient配置账号凭证,请求会被服务端直接拒绝 - 方法调用错误:
MsgBox是桌面端程序的弹窗方法,仅能在本地客户端上下文运行,在Web服务端调用会直接抛出异常,无法给浏览器端用户弹出提示 - 账号权限限制:Gmail已下线低安全性应用访问入口,直接使用账号登录密码调用SMTP会被安全策略拦截
- 资源未正确释放:
MailMessage、SmtpClient均为非托管资源对象,未做释放处理偶发会触发资源占用类异常
修正后代码
' 写在btnSubmit按钮的服务端Click事件方法中 ' 请将以下常量替换为实际的账号信息,发件人密码需使用Gmail生成的16位应用专用密码,不要使用账号登录密码 Const senderAddress As String = "你的发件Gmail邮箱@gmail.com" Const senderPassword As String = "Gmail账号生成的16位应用专用密码" Const receiverAddress As String = "收件人邮箱地址@gmail.com" Using mail As New MailMessage() mail.From = New MailAddress(senderAddress) mail.To.Add(New MailAddress(receiverAddress)) mail.Subject = "TEST SUBJECT" mail.Body = "Test Message" mail.IsBodyHtml = True Using client As New SmtpClient("smtp.gmail.com", 587) client.EnableSsl = True ' 补充缺失的SMTP身份验证配置 client.Credentials = New System.Net.NetworkCredential(senderAddress, senderPassword) Try client.Send(mail) ' 替换服务端非法弹窗方法,注册客户端脚本给用户弹出提示 ClientScript.RegisterStartupScript(Me.GetType(), "sendSuccess", "alert('邮件发送成功');", True) Catch ex As Exception ' 调试阶段可输出ex.Message查看具体错误原因,正式环境可隐藏详细报错 ClientScript.RegisterStartupScript(Me.GetType(), "sendFail", $"alert('邮件发送失败,请稍后重试');", True) End Try End Using End Using
前置配置要求
- 发件用的Gmail账号必须先开启两步验证,之后在账号安全设置页面生成16位长度的应用专用密码,作为SMTP登录的凭证使用
- 部署代码的服务器需要放行对
smtp.gmail.com587端口的出站请求,避免被防火墙、网络策略拦截 - 所有Web服务端代码中禁止调用WinForm、WPF等桌面框架专属的UI交互方法,这类方法无法在Web场景下正常工作
内容的提问来源于stack exchange,提问作者Una O Lian
相关产品推荐
相关产品推荐

