在VB.NET中通过代码发送邮件时,确实会遇到邮箱服务的身份认证(Authentication)要求。特别是微软Outlook/Hotmail等服务,已经逐步禁用传统的“基本身份验证”(Basic Authentication),转而强制要求使用更安全的 OAuth 2.0 认证

下面我将为你说明如何处理身份认证问题,并提供代码示例。

⚠️ 重要提醒:认证方式的变化

微软已多次宣布并推迟禁用基本身份验证的时间线。根据我目前看到的信息,最新的计划是:

  • 2026年3月1日开始逐步淘汰通过SMTP AUTH发送电子邮件的基本身份验证。

  • 2026年4月30日预计将完全停用此方法9。
    尽管目前基本认证可能仍有效,但从长远和稳定的角度出发,强烈建议为新项目或重要应用直接采用OAuth 2.0认证

下面的表格汇总了不同邮箱类型推荐使用的认证方式和关键参数:

邮箱类型推荐认证方式SMTP 服务器端口 (推荐)加密方式注意事项
Outlook/HotmailOAuth 2.0smtp.office365.com587STARTTLS需在Azure AD注册应用并配置权限。未来必须使用OAuth19。
基本认证 (过渡)smtp.office365.com587STARTTLS目前可能有效,但会被逐步淘汰。需在账户设置中启用SMTP认证并可能使用应用密码。
QQ邮箱基本认证 (应用密码)smtp.qq.com465 或 587SSL 或 STARTTLS需在邮箱设置中开启SMTP服务并获取授权码(即应用密码),不要在代码中直接使用你的QQ密码。
163邮箱基本认证 (应用密码)smtp.163.com465 或 994SSL需在邮箱设置中开启SMTP服务并获取授权码(即应用密码),不要在代码中直接使用你的邮箱密码。

下面是针对不同认证方式的代码示例。

🔐 方法一:使用 OAuth 2.0 认证 (Outlook/Hotmail 推荐)

这是微软推荐的、面向未来的方式,但设置相对复杂。

前期准备(在Azure Portal中配置):
  1. 注册应用程序:访问 Azure Portal (https://portal.azure.com),在“Azure Active Directory”中注册一个新应用程序。

  2. 添加客户端密码:在应用的“证书和密码”部分,创建一个新的客户端密码,并妥善保存其(稍后代码中会用到)。

  3. 配置API权限:在应用的“API权限”中,添加 SMTP.Send 权限(属于 Office 365 Exchange Online),并代表你的组织授予管理员同意

VB.NET 代码示例 (使用 MailKit 库)

.NET Framework 内置的 SmtpClient 对 OAuth 2.0 的支持不佳,推荐使用更现代且支持更好的 MailKit 库。你可以通过NuGet包管理器安装 MailKit 和 MimeKit


Imports MailKit.Net.Smtp
Imports MailKit.Security
Imports MimeKit
Imports System.Threading' 注意:此示例需要安装 MailKit 和 MimeKit NuGet 包。
Public Async Function SendEmailViaOAuthAsync() As TaskDim message As New MimeMessage()message.From.Add(New MailboxAddress("你的名字", "your_email@outlook.com")) ' 你的Outlook邮箱message.To.Add(New MailboxAddress("收件人名字", "recipient@example.com")) ' 收件人邮箱message.Subject = "这是一封测试邮件"message.Body = New TextPart("plain") With {.Text = "这是一封使用VB.NET和OAuth 2.0发送的测试邮件。"}Using client As New MailKit.Net.Smtp.SmtpClient()Try' 连接到Outlook SMTP服务器Await client.ConnectAsync("smtp.office365.com", 587, SecureSocketOptions.StartTls)' 请注意:这里的密码是你在Azure应用中创建的“客户端密码”,不是你的邮箱密码!Dim oauth2 As New SaslMechanismOAuth2("your_email@outlook.com", "你的客户端密码")' 进行OAuth 2.0认证Await client.AuthenticateAsync(oauth2)' 发送邮件Await client.SendAsync(message)Console.WriteLine("邮件发送成功!")Catch ex As ExceptionConsole.WriteLine("发送失败: " & ex.ToString())FinallyAwait client.DisconnectAsync(True)End TryEnd Using
End Function

🔓 方法二:使用基本认证 (传统方式,可能逐步淘汰)

对于QQ、163等邮箱,目前通常仍使用基本认证,但需使用应用专用密码(授权码)。对于Outlook/Hotmail,此方式未来会失效。

VB.NET 代码示例 (使用 System.Net.Mail.SmtpClient)
Imports System.Net.Mail
Imports System.NetPublic Sub SendEmailViaBasicAuth()Using smtpClient As New SmtpClient("smtp.office365.com") ' 对于Outlook。QQ邮箱用 "smtp.qq.com", 163邮箱用 "smtp.163.com"smtpClient.Port = 587 ' Outlook端口。QQ也可用587或465,163常用465或994smtpClient.Credentials = New NetworkCredential("your_email@outlook.com", "你的密码或授权码") ' 对于Outlook,如果开启了双因素认证,这里可能需要应用密码。对于QQ/163,此处填授权码。smtpClient.EnableSsl = True ' 启用加密连接。对于端口465,有时可能需要其他配置。Dim mailMessage As New MailMessage()mailMessage.From = New MailAddress("your_email@outlook.com")mailMessage.To.Add("recipient@example.com")mailMessage.Subject = "VB.NET 基本认证测试"mailMessage.Body = "这是一封使用基本认证发送的测试邮件。"TrysmtpClient.Send(mailMessage)Console.WriteLine("邮件发送成功!")Catch ex As ExceptionConsole.WriteLine("发送失败: " & ex.ToString())End TryEnd Using
End Sub

⚠️ 发送邮件时的其他注意事项

除了认证方式,以下几点也需要留意:

  • 端口与加密:不同的邮箱服务商可能支持不同的端口和加密方式(SSL/TLS)。如果默认端口不行,可以尝试其他常用端口。

  • 授权码/应用密码:对于QQ、163等邮箱,为了安全,务必在邮箱设置中开启SMTP服务并获取专用的授权码,不要在代码中直接使用你的邮箱登录密码。

  • 服务器限制:免费邮箱通常对每日发信数量、频率有限制,大量发送需注意。

  • 垃圾邮件风险:注意邮件内容格式,避免被收件方服务器误判为垃圾邮件。对于大批量发件人,微软等提供商还要求配置SPF、DKIM、DMARC等记录以提高发信信誉和成功率7。

💎 总结与建议

在VB.NET中发送邮件,处理认证的关键是:

  1. 认清邮箱类型:确认你使用的是Outlook/Hotmail还是国内邮箱(QQ、163)。

  2. 选择认证方式

    • Outlook/Hotmail首选 OAuth 2.0(尽管设置稍复杂,但一劳永逸)。暂时可测试基本认证,但需知它终将失效。

    • QQ/163等国内邮箱:使用基本认证,但密码处填写你在邮箱设置中获取的授权码

  3. 使用合适的库和参数:对于OAuth 2.0,推荐使用 MailKit 库。对于基本认证,System.Net.Mail.SmtpClient 基本够用,但请注意微软也已建议使用 MailKit 等替代方案。

希望这些信息能帮助你顺利地在VB.NET中实现邮件发送功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96318.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96318.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96318.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络运维】Shell:变量进阶知识

Shell 变量进阶知识 Shell 中的特殊变量 位置参数变量 Shell 脚本中常用的位置参数变量如下: $0:获取当前执行的 Shell 脚本文件名(包含路径时包括路径)$n:获取第 n 个参数值(n>9 时需使用 ${n}&#xf…

部署Qwen2.5-VL-7B-Instruct-GPTQ-Int3

模型下载 from modelscope import snapshot_download model_dir snapshot_download(ChineseAlpacaGroup/Qwen2.5-VL-7B-Instruct-GPTQ-Int3)相关包导入 import os import numpy as np import pandas as pd from tqdm import tqdm from datetime import datetime,timedelta fro…

sourcetree 拉取代码

提示:文章旨在于教授大家 sourcetree 拉取代码的方式,关于代码的提交合并等操作后续会补充。 文章目录前言一、sourcetree 安装二、http 与 ssh 拉取代码1.http 方式(1)生成 token(2)拼接项目的 url&#x…

epoll模型网络编程知识要领

1、程序初始化创建监听socket调用bind函数绑定ip地址、port端口号调用listen函数监听调用epoll_create函数创建epollfd调用epoll_ctrl函数将listenfd绑定到epollfd上,监测listenfd的读事件在一个无限循环中,调用epoll_wait函数等待事件发生2、处理客户端…

15-day12LLM结构变化、位置编码和投机采样

多头机制transformer结构归一化层选择 归一化层位置归一化层类型激活函数Llama2结构MoE架构 混合专家模型DeepSeek MLA为何需要位置编码目前的主流位置编码正余弦位置编码可学习位置编码ROPE旋转位置编码推导参考: https://spaces.ac.cn/archives/8265 https://zhua…

记录 docker容器打包成镜像 在其他服务器快速启动镜像和容器

我有个nginx服务器 需要在其他服务器直接部署使用 里面都是完整的 使用 docker ps 查看容器id 进行打包成镜像docker commit [容器ID或名称] 新镜像名:版本 docker commit 28f60e2206b2 my-nginx-custom:v1镜像保存成文件 docker save -o my-nginx-custom.tar my-nginx-custom:…

使用LLaMA-Factory对大模型进行微调-详解

书接上回 启动llama Factory可视化页面 llamafactory-cli webui 如果想后台运行 使用 nohup llamafactory-cli webui &浏览器访问 http://127.0.0.1:7860/配置项主要参数: 参考: https://docs.coreshub.cn/console/compute_platform/help/llama_factory/ 模型路径 : 解…

【AI】录制自动生成UI自动化脚本

命令行输入:npx playwright codegen https://myerp.dmyc.XXX.com:9443/打开的浏览器上操作,会自动录制,并生成自动化脚本

深度剖析字节跳动VeOmni框架

背景与设计动机 随着推荐系统和AI模型走向多模态、多任务的趋势,字节跳动面临着训练、迭代效率和系统复杂度的双重挑战。一方面,各类业务(如新闻推荐、短视频、图文广告、电商带货等)都需要处理文本、图像、视频、音频等多种输入模…

OCR库pytesseract安装保姆级教程

本文将介绍使用工具安装OCR库pytesseract的详细流程。 Anaconda安装教程参考Anaconda安装保姆级教程。 目录 一、工具安装 二、创建虚拟环境 三、安装pytesseract 总结 一、工具安装 点击链接前往官网codetou.com,下载安装最新版即可,本篇博客以抠头…

开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案

在即时通讯与社交需求日益增长的今天,一款安全、稳定、功能全面的聊天软件成为不少团队和开发者的刚需。但市面上多数聊天 APP 要么依赖第三方插件,面临数据安全隐患和高额服务费;要么功能单一,难以满足复杂社交场景。今天给大家推…

残差神经网络(ResNet)

残差神经网络(Residual Neural Network,简称 ResNet)是深度学习领域的里程碑式模型,由何凯明等人在 2015 年提出,成功解决了深层神经网络训练中的梯度消失 / 爆炸问题,使训练超深网络(如 152 层…

学习嵌入式之驱动

一、基础搭建1.基础:c语言 软件编程语言 数据结构 软件编程思想2.驱动实现目标如果将Linux系统细致到开发板平台上? Liunx系统与硬件设备的适配3.自我能力的锻炼继续强化C语言锻炼大型代码阅读和分析能力学习大型项目的代码搭建和管理的能力…

在 Golang 中复用 HTTP 连接

问题提出最近在实现一个转发大模型调用请求的中转功能,涉及到要构造client发送请求的内容,一开始我每次都是新建一个client来发送请求,这样的代码实现存在一些问题——每次都要构造新的client,并且要重新建立连接。后面了解到在Go…

前端:el-upload文件上传与FormData 对象

<el-uploadclass"uploadDemo":limit"1"dragaccept".xls,.xlsx" <!-- 只保留Excel格式 -->:on-exceed"handleExceedFileLimit":on-change"handleChangeExcelFile":on-remove"handleRemoveExcelFile":bef…

自然处理语言NLP:One-Hot编码、TF-IDF、词向量、NLP特征输入、EmbeddingLayer实现、word2vec

文章目录自然语言处理&#xff08;NLP&#xff09;一、什么是自然语言处理&#xff08;NLP&#xff09;&#xff1f;二、NLP 的核心目标三、NLP 的主要应用方向&#xff08;应用场景&#xff09;四、NLP 的基本概念五、NLP 的基本处理流程1. 文本预处理2. 特征表示3. 模型选择与…

单词记忆-轻松记忆10个实用英语单词(13)

1. board含义&#xff1a;板子&#xff1b;董事会&#xff1b;登机 读音标注&#xff1a;/bɔːrd/ 例句&#xff1a;Write your name on the board. 译文&#xff1a;把你的名字写在板上。 衍生含义&#xff1a;董事会&#xff08;如“board of directors”&#xff09;&#…

Spring循环依赖源码调试详解,用两级缓存代替三级缓存

Spring循环依赖源码详解&#xff0c;改用两级缓存并实验 背景 最近一直在研究Spring的循环依赖&#xff0c;发现好像两级缓存也能解决循环依赖。 关于为何使用三级缓存&#xff0c;大致有两个原因 对于AOP的类型&#xff0c;保证Bean生命周期的顺序 对于有AOP代理增强的类型&am…

亚马逊BALL PIT球池外观专利侵权指控?不侵权意见书助力4条链接申诉成功!

儿童球池作为玩具品类中常见的一款产品&#xff0c;能够给儿童提供游乐的安全空间&#xff0c;深受亚马逊平台用户的喜爱。然而在近期&#xff0c;赛贝收到了部分亚马逊卖家的咨询&#xff0c;原因是他们在售的儿童球池产品链接被美国外观专利USD1009203S&#xff08;下称203专…

开源,LangExtract-Python库用LLM从非结构化文本提取结构化信息

摘要&#xff1a; LangExtract是一个Python库&#xff0c;利用大语言模型&#xff08;LLM&#xff09;根据用户定义指令从非结构化文本文档中提取结构化信息。它具备精确源定位、可靠结构化输出、长文档优化、交互式可视化、灵活LLM支持、适应任意领域等特点。可通过几行代码快…