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

使用VB.NET通过smtp.office365.com发送邮件遇问题求助

Office365 SMTP 邮件发送问题修复方案(VB.NET + VS2010 WinForms)

问题场景

在Visual Studio 2010的Windows Forms项目中,使用VB.NET通过smtp.office365.com发送公司邮箱邮件时遇到两个问题:

  • 第一段代码运行约1分钟后抛出System.Net.Mail.SmtpException:操作超时
  • 第二段代码无报错,但邮件始终未送达

现有代码问题分析

第一段代码问题

  1. 端口赋值错误:SMTP.Port = "587"使用了字符串类型,Port属性需要整数类型,类型不匹配会导致连接异常
  2. 凭据设置顺序错误:未设置UseDefaultCredentials = False,Office365要求必须先禁用默认凭据,再设置自定义凭据,否则会被当前Windows系统凭据覆盖,导致认证失败
  3. 不安全的证书验证:直接返回True跳过证书验证,可能隐藏SSL连接的真实问题,且生产环境存在安全风险

第二段代码问题

使用SendAsync异步发送邮件,但未处理异步完成事件,也没有等待发送完成。如果方法执行完毕后程序退出,邮件发送进程会被中断,导致邮件无法送达。

修复后的可行代码

同步发送版本(推荐,适合WinForms场景)

Imports System.Net.Mail
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates

Public Class Form1

    Private Sub SendOffice365Email()
        Dim mail As New MailMessage()
        Dim smtpClient As New SmtpClient("smtp.office365.com", 587)

        ' 邮件内容设置
        mail.From = New MailAddress("你的发件邮箱@公司域名.com")
        mail.To.Add("收件邮箱@xxx.com")
        mail.Subject = "测试邮件"
        mail.Body = "这是通过Office365 SMTP发送的测试内容"
        mail.IsBodyHtml = False ' 若需HTML内容设为True

        ' SMTP核心配置
        smtpClient.EnableSsl = True
        smtpClient.UseDefaultCredentials = False ' 必须先禁用默认凭据
        smtpClient.Credentials = New System.Net.NetworkCredential("你的发件邮箱@公司域名.com", "邮箱密码/应用密码")
        smtpClient.Timeout = 10000 ' 设置超时时间为10秒,避免长时间等待

        ' 可选:仅测试环境使用证书验证跳过,生产环境请注释此段
        ServicePointManager.ServerCertificateValidationCallback = AddressOf ValidateCertificate

        Try
            smtpClient.Send(mail)
            MessageBox.Show("邮件发送成功")
        Catch ex As Exception
            MessageBox.Show("发送失败:" & ex.ToString())
        Finally
            ' 释放资源
            mail.Dispose()
            smtpClient.Dispose()
        End Try
    End Sub

    ' 证书验证方法(测试环境用,生产环境建议删除,使用默认验证)
    Private Function ValidateCertificate(sender As Object, cert As X509Certificate, chain As X509Chain, errors As SslPolicyErrors) As Boolean
        ' 生产环境请根据实际证书错误判断,不要直接返回True
        Return True
    End Function

    ' 示例:点击按钮触发发送
    Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
        SendOffice365Email()
    End Sub
End Class

异步发送版本(需处理生命周期)

如果必须使用异步发送,需确保程序在发送完成前不退出,并处理异步事件:

Imports System.Net.Mail

Public Class Form1
    Private WithEvents smtpClient As SmtpClient

    Private Sub SendOffice365EmailAsync()
        Dim mail As New MailMessage()
        smtpClient = New SmtpClient("smtp.office365.com", 587)

        mail.From = New MailAddress("你的发件邮箱@公司域名.com")
        mail.To.Add("收件邮箱@xxx.com")
        mail.Subject = "异步测试邮件"
        mail.Body = "这是异步发送的测试内容"

        smtpClient.EnableSsl = True
        smtpClient.UseDefaultCredentials = False
        smtpClient.Credentials = New System.Net.NetworkCredential("你的发件邮箱@公司域名.com", "邮箱密码/应用密码")
        smtpClient.Timeout = 10000

        Try
            smtpClient.SendAsync(mail, mail) ' 传递邮件对象作为用户令牌
        Catch ex As Exception
            MessageBox.Show("异步发送启动失败:" & ex.ToString())
        End Try
    End Sub

    ' 异步发送完成事件处理
    Private Sub smtpClient_SendCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles smtpClient.SendCompleted
        Dim mail As MailMessage = DirectCast(e.UserState, MailMessage)
        Try
            If e.Error IsNot Nothing Then
                MessageBox.Show("异步发送失败:" & e.Error.ToString())
            ElseIf e.Cancelled Then
                MessageBox.Show("发送已取消")
            Else
                MessageBox.Show("异步邮件发送成功")
            End If
        Finally
            mail.Dispose()
            smtpClient.Dispose()
        End Try
    End Sub

    Private Sub btnSendAsync_Click(sender As Object, e As EventArgs) Handles btnSendAsync.Click
        SendOffice365EmailAsync()
    End Sub
End Class

额外注意事项

  1. 账号权限:确保你的Office365账号允许SMTP发送,部分企业可能禁用SMTP协议,或需要开启POP/IMAP服务;如果账号开启了多因素认证(MFA),需使用应用密码替代普通密码
  2. 防火墙/代理:检查本地防火墙或公司网络是否允许访问smtp.office365.com的587端口
  3. .NET Framework版本:VS2010默认使用.NET Framework 4.0,上述代码完全兼容该版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:27:54