Jmeter模拟安全邮箱发送邮件:附件未Base64编码问题求助
嘿,这个问题我之前帮朋友解决过,JMeter默认的邮件处理有时候确实会在编码上踩坑,尤其是对接安全邮箱系统的时候,给你几个靠谱的解决方案:
方法1:调整SMTP请求采样器的内置设置
如果你用的是JMeter自带的SMTP请求采样器,先检查这些关键配置,大概率能解决问题:
- 在「附件」区域,务必勾选「使用MIME」选项
- 找到「内容传输编码」的下拉菜单,直接选择
base64 - 同时确认附件的MIME类型设置正确(比如PDF填
application/pdf,图片填image/jpeg),正确的MIME类型是编码生效的前提
如果这个方法没搞定,可能是CJS安全邮箱有特殊格式要求,这时候就得用自定义脚本完全控制邮件内容了。
方法2:用Groovy脚本手动实现附件Base64编码
Groovy可以直接调用JavaMail API,能完全自定义邮件的每一部分,包括附件的编码逻辑。步骤如下:
- 确保JMeter的
lib目录下有JavaMail相关的jar包(mail.jar和activation.jar,没有的话手动下载添加) - 添加一个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
相关产品推荐
相关产品推荐

