Jmeter 5.5 SMTP Sampler XML配置无法设置邮件头部求助
问题背景
我使用以下JMeter测试计划配置(.jmx文件)进行本地性能测试,该配置可正常向localhost:8080发送带8MB附件的邮件,但需要为邮件添加自定义Date头部。
原始测试计划XML:
<?xml version="1.0" encoding="UTF-8"?> <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Perf Tests" enabled="true"> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Big - 8mb attachment" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">10</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">5</stringProp> <stringProp name="ThreadGroup.ramp_time">5</stringProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp> </ThreadGroup> <hashTree> <SmtpSampler guiclass="SmtpSamplerGui" testclass="SmtpSampler" testname="Email - 8mb attachment" enabled="true"> <stringProp name="SMTPSampler.server">localhost</stringProp> <stringProp name="SMTPSampler.serverPort">8080</stringProp> <stringProp name="SMTPSampler.serverTimeout">15000</stringProp> <stringProp name="SMTPSampler.serverConnectionTimeout">15000</stringProp> <stringProp name="SMTPSampler.mailFrom">bobby.hill@hey.com</stringProp> <stringProp name="SMTPSampler.replyTo"></stringProp> <stringProp name="SMTPSampler.receiverTo">bobby.hill@hey.com</stringProp> <stringProp name="SMTPSampler.receiverCC"></stringProp> <stringProp name="SMTPSampler.receiverBCC"></stringProp> <stringProp name="SMTPSampler.subject">Perf Test - 1 attachment 8mb</stringProp> <stringProp name="SMTPSampler.suppressSubject">false</stringProp> <stringProp name="SMTPSampler.include_timestamp">false</stringProp> <stringProp name="SMTPSampler.message">Hello World - Perf Test!</stringProp> <stringProp name="SMTPSampler.plainBody">false</stringProp> <stringProp name="SMTPSampler.attachFile">8mb-content-size.pdf</stringProp> <stringProp name="SMTPSampler.useSSL">false</stringProp> <stringProp name="SMTPSampler.useStartTLS">false</stringProp> <stringProp name="SMTPSampler.trustAllCerts">false</stringProp> <stringProp name="SMTPSampler.enforceStartTLS">false</stringProp> <stringProp name="SMTPSampler.useLocalTrustStore">false</stringProp> <stringProp name="SMTPSampler.trustStoreToUse"></stringProp> <stringProp name="SMTPSampler.tlsProtocols"></stringProp> <boolProp name="SMTPSampler.use_eml">false</boolProp> <stringProp name="SMTPSampler.emlMessageToSend"></stringProp> <stringProp name="SMTPSampler.useAuth">false</stringProp> <stringProp name="SMTPSampler.password"></stringProp> <stringProp name="SMTPSampler.username"></stringProp> <stringProp name="SMTPSampler.messageSizeStatistics">false</stringProp> <stringProp name="SMTPSampler.enableDebug">false</stringProp> <collectionProp name="SMTPSampler.headerFields"/> </SmtpSampler> <hashTree/> </hashTree> </hashTree> </hashTree> </jmeterTestPlan>
尝试过的配置及问题
1. 添加HTTP Header Manager
在SmtpSampler元素前添加HTTP Header Manager,配置如下:
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> <collectionProp name="HeaderManager.headers"> <elementProp name="Date" elementType="Header"> <stringProp name="Header.name">Date</stringProp> <stringProp name="Header.value">Fri, 21 Nov 1997 09:55:06 -0600</stringProp> </elementProp> </collectionProp> </HeaderManager>
问题:无法设置SMTP消息的Date头部,HTTP Header Manager仅对HTTP请求生效,不作用于SMTP Sampler。
2. 用Header类型元素替换headerFields
将<collectionProp name="SMTPSampler.headerFields"/>替换为以下配置:
<collectionProp name="SMTPSampler.headerFields"> <elementProp name="Date" elementType="Header"> <stringProp name="Header.name">Date</stringProp> <stringProp name="Header.value">Fri, 21 Nov 1997 09:55:06 -0600</stringProp> </elementProp> </collectionProp>
问题:抛出ClassCastException错误:
java.lang.ClassCastException: class org.apache.jmeter.protocol.http.control.Header cannot be cast to class org.apache.jmeter.config.Argument (org.apache.jmeter.protocol.http.control.Header and org.apache.jmeter.config.Argument are in unnamed module of loader org.apache.jmeter.DynamicClassLoader @372f7a8d)
原因是SMTP Sampler的headerFields集合期望的是Argument类型,而非HTTP的Header类型。
3. 使用Argument类型元素配置
尝试用Argument类型配置headerFields:
<collectionProp name="SMTPSampler.headerFields"> <elementProp name="date" elementType="Argument"> <stringProp name="Argument.name">Date</stringProp> <stringProp name="Argument.value">Fri, 21 Nov 1997 09:55:06 -0600</stringProp> </elementProp> </collectionProp>
问题:配置仍失败,因为缺少了Argument的metadata属性,且elementProp的name需与头部名称一致。
正确配置示例
SMTP Sampler的headerFields集合需要使用Argument类型元素,且每个Argument必须包含metadata属性(值设为=即可),同时elementProp的name属性需与头部名称匹配。以下是正确的配置:
替换原SmtpSampler中的<collectionProp name="SMTPSampler.headerFields"/>为:
<collectionProp name="SMTPSampler.headerFields"> <elementProp name="Date" elementType="Argument"> <stringProp name="Argument.name">Date</stringProp> <stringProp name="Argument.value">Fri, 21 Nov 1997 09:55:06 -0600</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp>
完整的SmtpSampler配置片段:
<SmtpSampler guiclass="SmtpSamplerGui" testclass="SmtpSampler" testname="Email - 8mb attachment" enabled="true"> <!-- 其他原有配置保持不变 --> <stringProp name="SMTPSampler.enableDebug">false</stringProp> <collectionProp name="SMTPSampler.headerFields"> <elementProp name="Date" elementType="Argument"> <stringProp name="Argument.name">Date</stringProp> <stringProp name="Argument.value">Fri, 21 Nov 1997 09:55:06 -0600</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </SmtpSampler>
该配置会成功为SMTP邮件添加自定义Date头部,解决之前的类型转换错误和配置失效问题。
内容的提问来源于stack exchange,提问作者Simon Tower

