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

Jmeter模拟安全邮箱发送邮件:附件未Base64编码问题求助

嘿,这个问题我之前帮朋友解决过,JMeter默认的邮件处理有时候确实会在编码上踩坑,尤其是对接安全邮箱系统的时候,给你几个靠谱的解决方案:

方法1:调整SMTP请求采样器的内置设置

如果你用的是JMeter自带的SMTP请求采样器,先检查这些关键配置,大概率能解决问题:

  • 在「附件」区域,务必勾选「使用MIME」选项
  • 找到「内容传输编码」的下拉菜单,直接选择base64
  • 同时确认附件的MIME类型设置正确(比如PDF填application/pdf,图片填image/jpeg),正确的MIME类型是编码生效的前提

如果这个方法没搞定,可能是CJS安全邮箱有特殊格式要求,这时候就得用自定义脚本完全控制邮件内容了。

方法2:用Groovy脚本手动实现附件Base64编码

Groovy可以直接调用JavaMail API,能完全自定义邮件的每一部分,包括附件的编码逻辑。步骤如下:

  1. 确保JMeter的lib目录下有JavaMail相关的jar包(mail.jar和activation.jar,没有的话手动下载添加)
  2. 添加一个JSR223 Sampler,选择Groovy语言,粘贴下面的示例代码,替换成你的邮箱配置:
import javax.mail.*
import javax.mail.internet.*
import java.util.Properties
import java.nio.file.Files
import java.nio.file.Paths
import java.util.Base64

// 配置SMTP服务器信息
Properties props = new Properties()
props.put("mail.smtp.host", "你的SMTP服务器地址")
props.put("mail.smtp.port", "465") // 根据你的邮箱端口调整,比如SSL用465,TLS用587
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.ssl.enable", "true") // 如果是SSL加密的话开启

// 邮箱认证
Session session = Session.getInstance(props, new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("你的安全邮箱账户", "你的授权码/密码")
    }
})

// 创建邮件对象
MimeMessage message = new MimeMessage(session)
message.setFrom(new InternetAddress("发件人邮箱"))
message.addRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱"))
message.setSubject("测试带Base64编码附件的邮件", "UTF-8")

// 构建多部分邮件内容(正文+附件)
MimeMultipart multipart = new MimeMultipart()

// 添加正文部分
MimeBodyPart textPart = new MimeBodyPart()
textPart.setText("这是测试邮件的正文内容", "UTF-8")
multipart.addBodyPart(textPart)

// 处理附件:读取文件并转为Base64编码
MimeBodyPart attachmentPart = new MimeBodyPart()
String attachmentPath = "本地附件的绝对路径,比如C:/test.pdf"
byte[] fileBytes = Files.readAllBytes(Paths.get(attachmentPath))
String base64Attachment = Base64.getEncoder().encodeToString(fileBytes)

// 设置附件的头信息和内容
attachmentPart.setContent(base64Attachment, "application/octet-stream; charset=UTF-8")
attachmentPart.setHeader("Content-Transfer-Encoding", "base64")
// 文件名编码,避免乱码
attachmentPart.setFileName(MimeUtility.encodeText("测试附件.pdf", "UTF-8", "B"))
attachmentPart.setDisposition(MimeBodyPart.ATTACHMENT)
multipart.addBodyPart(attachmentPart)

// 把多部分内容设置到邮件里
message.setContent(multipart)

// 发送邮件
Transport.send(message)
log.info("邮件发送成功!附件已通过Base64编码")

方法3:对比手动邮件的原始格式

有时候安全邮箱会有特殊的格式要求,你可以先手动发一封带附件的邮件,然后在邮箱里查看邮件源代码(比如Outlook里选「查看」→「查看邮件源代码」),对比JMeter发送的邮件头信息,看看有没有差异。比如手动邮件的附件部分可能有这些头:

Content-Type: application/pdf; name="test.pdf"
Content-Disposition: attachment; filename="test.pdf"
Content-Transfer-Encoding: base64

确保JMeter发送的邮件和这个格式完全一致,尤其是Content-Transfer-Encoding必须明确设置为base64。

优先试方法1,简单快捷;如果不行就用方法2的自定义脚本,灵活性拉满;最后别忘了对比手动邮件的格式,对齐安全邮箱的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:33:33