如何通过JMeter使用密钥向outlook.office365.com发送邮件
解决JMeter使用Client ID/密钥连接Office 365 SMTP发送邮件的问题
因为JMeter原生的SMTP Sampler并不支持OAuth 2.0认证(这是Office 365当前推荐的SMTP认证方式,尤其是服务账号/客户端凭证场景),所以我们需要分两步实现:先获取OAuth 2.0访问令牌,再通过Groovy代码结合JavaMail API完成邮件发送。
步骤1:获取OAuth 2.0访问令牌
我们可以通过Office 365的客户端凭证流(Client Credentials Flow),用你的Client ID和密钥获取访问令牌,具体操作如下:
在JMeter中添加一个HTTP Request Sampler,配置信息如下:
- 请求方法:
POST - 请求URL:
https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token小提示:如果不知道租户ID,可用
common临时替代,但更推荐使用具体租户ID以避免权限范围问题 - 内容编码:
UTF-8 - 请求参数(添加到「Parameters」面板):
grant_type:client_credentialsclient_id:你的Client IDclient_secret:你的密钥scope:https://outlook.office365.com/.default
- 请求方法:
为这个HTTP请求添加一个JSON Extractor(作为子节点),提取返回的令牌:
- 引用名称:
access_token - JSON Path表达式:
$.access_token - 匹配数字:
1
- 引用名称:
步骤2:用JSR223 Sampler编写Groovy代码发送邮件
JMeter的JSR223 Sampler支持Groovy脚本,我们可以用它结合JavaMail API实现OAuth认证的邮件发送:
确保JMeter的
lib目录下有以下依赖包(没有的话需要手动添加):jakarta.mail.jar(或旧版mail.jar)jakarta.activation.jar(或旧版activation.jar)
提示:这些包可以从Maven仓库下载,推荐使用最新稳定版本
添加一个JSR223 Sampler,选择语言为
groovy,然后在脚本区域输入以下代码:
import jakarta.mail.* import jakarta.mail.internet.* import java.util.Properties // 配置SMTP服务器参数 Properties props = new Properties() props.put("mail.smtp.host", "smtp.office365.com") props.put("mail.smtp.port", "587") props.put("mail.smtp.auth", "true") props.put("mail.smtp.starttls.enable", "true") props.put("mail.smtp.auth.mechanisms", "XOAUTH2") // 配置OAuth2认证逻辑 Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { // 传入空用户名+提取到的access_token return new PasswordAuthentication("", vars.get("access_token")) } }) try { // 构建邮件内容 MimeMessage message = new MimeMessage(session) message.setFrom(new InternetAddress("你的发件邮箱@domain.com")) // 必须是应用有权限发送的邮箱 message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("收件人邮箱@domain.com")) message.setSubject("JMeter OAuth2测试邮件") message.setText("这是通过JMeter结合OAuth2认证发送的测试邮件内容") // 发送邮件 Transport.send(message) log.info("邮件发送成功!") } catch (MessagingException e) { log.error("邮件发送失败: " + e.getMessage()) throw e }
关键注意事项:
- 你的Azure AD应用必须已被授予SMTP.Send的应用权限(在Azure门户的应用注册中配置权限并完成管理员同意)
- 发件邮箱必须是应用被允许代表发送的邮箱(客户端凭证流场景下,通常需要提前配置邮箱的发送权限)
- 可以添加Debug Sampler验证
access_token变量是否被正确提取
内容的提问来源于stack exchange,提问作者themaster
相关产品推荐
相关产品推荐

