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

VB通过Outlook发送邮件失败求助:代码及配置排查

VB.NET 通过 Outlook/Office 365 SMTP 发送邮件失败的排查与解决

问题背景

使用Visual Studio 2013 + .NET Framework 4.5开发VB程序,通过Outlook/Office 365 SMTP服务器发送邮件时失败,但相同代码在Gmail环境下正常运行。已开启Outlook邮箱两步验证并生成应用密码,尝试普通密码、应用密码及更换微软SMTP服务器均无效。

错误截图:
错误截图

原代码:

Imports System.Net
Imports System.Net.Mail

Public Class frmEmail

    Private Sub btnEnviar_Click(sender As Object, e As EventArgs) Handles btnEnviar.Click
        Try
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

            Dim strSmtpServer As String = "smtp.office365.com"
            Dim strSmtpPort As Integer = 587
            Dim strEmail As String = "email@outlook.com"
            Dim strSenha As String = "senhaaplicativo"

            Dim strRemetente As String = "email@outlook.com"
            Dim strDestinatario As String = "destinatario@gmail.com"
            Dim strAssunto As String = "Assunto do e-mail"
            Dim strMensagem As String = "Corpo do e-mail"

            Dim smtp As New SmtpClient(strSmtpServer)
            smtp.Port = strSmtpPort
            smtp.Credentials = New NetworkCredential(strEmail, strSenha)
            smtp.EnableSsl = True

            Dim mail As New MailMessage()
            mail.From = New MailAddress(strRemetente)
            mail.To.Add(strDestinatario)
            mail.Subject = strAssunto
            mail.Body = strMensagem

            smtp.Send(mail)
            MsgBox("E-mail enviado com sucesso!", MsgBoxStyle.Information)
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
End Class

核心问题排查与解决方案

1. 必须禁用默认凭据(关键遗漏)

SmtpClient默认UseDefaultCredentials为True,会覆盖手动设置的账号密码,导致认证失败。需显式设置为False,且必须在设置Credentials之前执行:

smtp.UseDefaultCredentials = False
smtp.Credentials = New NetworkCredential(strEmail, strSenha)

2. 完善TLS协议配置(适配.NET 4.5)

.NET Framework 4.5中虽支持Tls12,但补充兼容Tls11可避免协议不兼容问题:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12

3. 确认应用密码有效性

  • 生成应用密码时需选择「其他应用(自定义名称)」
  • 复制完整16位密码,确保无空格或遗漏字符
  • 若密码不确定,重新生成新的应用密码

4. 补充SMTP客户端额外配置

添加以下配置确保符合Office 365发送要求:

smtp.DeliveryMethod = SmtpDeliveryMethod.Network
smtp.Timeout = 10000 ' 设置超时时间,避免无响应

修改后的完整代码

Imports System.Net
Imports System.Net.Mail

Public Class frmEmail

    Private Sub btnEnviar_Click(sender As Object, e As EventArgs) Handles btnEnviar.Click
        Try
            ' 配置TLS协议,适配.NET 4.5
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12

            Dim strSmtpServer As String = "smtp.office365.com"
            Dim strSmtpPort As Integer = 587
            Dim strEmail As String = "email@outlook.com"
            Dim strSenha As String = "senhaaplicativo"

            Dim strRemetente As String = "email@outlook.com"
            Dim strDestinatario As String = "destinatario@gmail.com"
            Dim strAssunto As String = "Assunto do e-mail"
            Dim strMensagem As String = "Corpo do e-mail"

            Dim smtp As New SmtpClient(strSmtpServer)
            smtp.Port = strSmtpPort
            ' 先禁用默认凭据,再设置自定义凭据
            smtp.UseDefaultCredentials = False
            smtp.Credentials = New NetworkCredential(strEmail, strSenha)
            smtp.EnableSsl = True
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network
            smtp.Timeout = 10000

            Dim mail As New MailMessage()
            mail.From = New MailAddress(strRemetente)
            mail.To.Add(strDestinatario)
            mail.Subject = strAssunto
            mail.Body = strMensagem
            ' 可选:设置编码避免乱码
            mail.SubjectEncoding = System.Text.Encoding.UTF8
            mail.BodyEncoding = System.Text.Encoding.UTF8

            smtp.Send(mail)
            MsgBox("E-mail enviado com sucesso!", MsgBoxStyle.Information)
        Catch ex As Exception
            MsgBox($"Erro: {ex.Message}{Environment.NewLine}Detalhes: {ex.InnerException?.Message}", MsgBoxStyle.Critical)
        End Try
    End Sub
End Class

额外排查点

  • 检查防火墙/杀毒软件是否阻止了587端口的出站连接
  • 确认服务器网络环境是否需要代理,若有需配置smtp.Proxy属性
  • 登录网页版Outlook检查发件人邮箱是否被限制发送邮件

内容的提问来源于stack exchange,提问作者Gabriel de Morais

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:28:12