这个问题在这里已有答案:
我正在测试https://javaee.github.io/javamail/FAQ中所述的sendmail示例 . 这是一个简单的邮件发送操作,没有SSL,也没有附件 . 它在任何地方都可以正常工作,但在客户端上,当邮件api变得更新时,我们会有一个去线性能 .
服务器是windows,java 1.8.131,在所有测试用例中使用相同的邮件服务器和邮件帐户以及相同的地址和java源 . 唯一的区别是使用的mailapi . 我运行程序
java -cp javax.mail.1.X.X.jar; sendmailtesttool.jar SendMail
我为每个邮件api尝试了100次并获得平均持续时间 .
-
JavaMailApi版本:1.4.0持续时间<1秒 .
-
JavaMailApi版本:1.4.2持续时间9-10秒 .
-
JavaMailApi版本:1.5.2持续时间29-30秒 .
-
JavaMailApi版本:1.5.6持续时间29-30秒 .
-
JavaMailApi版本:1.6.0持续时间29-30秒 .
使用的来源:
Properties properties = new Properties();
properties.put("mail.smtp.host", 192.168.0.X); // use default port25
Session session = Session.getInstance(properties);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(..);
msg.setSubject(..);
msg.setRecipients(..);
//no attachments
MultiPart mp = new MultiPart();
MimeBodyPart bp = new MimeBodyPart();
DataSource ds = ByteArrayDataSource("foo"..);
DataHandler dh = new DataHandler(ds);
bp.setDataHandler(dh);
mp.addBodyPart(bp);
msg.setContent(mp);
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
msg.saveChanges(); // is really needed ? (no reply/forward)
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
我添加了测试工具的输出:
Java Mail Api 1.4.0
Sending mail.....start
Setting port to:25
Setting host to:192.168.0.213
Set additional session prop host to prevent HELO
Set additional session prop from to prevent EHLO
Session generated with authenticator took:63
Message generated took:47
Parse from address took:0
Set from address to message took:0
Set recipients took:0
Get all recipients took:0
Set cc, bcc took:0
Parse subject took:16
Set subject to message took:0
Set body text took:0
Set content took:0
Set sent date took:15
Transport generated took:32
Connected to transport took:93
Save changes took:0
Message send took:94
Transport closed took:0
Message id fetched took:0
发送邮件.....在391完成
平均值为:391.0
Java Mail Api 1.5.6
Sending mail.....start
Setting port to:25
Setting host to:192.168.0.213
Set additional session prop host to prevent HELO
Set additional session prop from to prevent EHLO
Session generated with authenticator took:62
Message generated took:63
Parse from address took:0
Set from address to message took:16
Set recipients took:0
Get all recipients took:0
Set cc, bcc took:0
Parse subject took:0
Set subject to message took:0
Set body text took:0
Set content took:0
Set sent date took:15
Transport generated took:32
Connected to transport took:9126
Save changes took:0
Message send took:47
Transport closed took:0
Message id fetched took:0
发送邮件.....在9423完成
平均值为:9423.0
jvm邮件调试输出
Java Mail API 1.4.0
DEBUG:setDebug:JavaMail版本1.4ea DEBUG:getProvider()返回javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.s mtp.SMTPTransport,Sun Microsystems,Inc] DEBUG SMTP:useEhlo true,useAuth true DEBUG SMTP:尝试连接到主机“192.168.0.X”,端口25,isSSL false 220 mail . ****** . ESMTP Postfix DEBUG SMTP:连接到主机“192.168.0.X”,端口:25 EHLO WIN-0RL58R42TTN 250-mail . ****** . com 250-PIPELINING 250-SIZE 102400000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN 250-AUTH = PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN DEBUG SMTP:找到扩展名“PIPELINING”,arg“”DEBUG SMTP:找到扩展名“SIZE”,arg“102400000”DEBUG SMTP:找到扩展名“VRFY”,arg“”DEBUG SMTP:找到扩展名“ETRN”,arg“” DEBUG SMTP:找到扩展名“STARTTLS”,arg“”DEBUG SMTP:找到扩展名“AUTH”,arg“PLAIN LOGIN”DEBUG SMTP:找到扩展名“AUTH = PLAIN”,arg“登录”调试SMTP:找到扩展名“ENHANCEDSTATUSCODES”, arg“”DEBUG SMTP:找到扩展名“8BITMIME”,ar g“”DEBUG SMTP:找到扩展名“DSN”,arg“”DEBUG SMTP:尝试验证AUTH LOGIN 334 VXNlcm5hbWU6 am9iaW4uZWxhbmppY2thbEBhbGNvbmVsZWN0cm9uaWNzLmNvbQ == 334 UGFzc3dvcmQ6 Sk9CSU5ANzc3TnM = 235 2.7.0验证成功DEBUG SMTP:use8bit false MAIL FROM:250 2.1.0确定RCPT TO:250 2.1.5 Ok DEBUG SMTP:已验证地址DEBUG SMTP:receiver@******.com DATA 354结束数据 . 日期:2017年12月14日星期四14:17:46 0530(IST)发件人:sender@******.com致:receiver@******.com消息ID:<396180261.01513241266298.JavaMail.sender @ ****** .com>主题:test3 MIME-Version:1.0 Content-Type:multipart / mixed;边界= “---- = _ Part_0_2093176254.1513241266126”
------ = _ Part_0_2093176254.1513241266126 Content-Type:text / plain; charset = utf-8 Content-Transfer-Encoding:7bit test ------ = _ Part_0_2093176254.1513241266126-- . 250 2.0.0好的:排队为7E38D48F0411退出221 2.0.0再见
Java Mail API 1.5.6
DEBUG:setDebug:JavaMail 1.5.6版DEBUG:getProvider()返回javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.s mtp.SMTPTransport,Oracle] DEBUG SMTP:useEhlo true,useAuth true DEBUG SMTP:尝试连接到主机“192.168.0.X”,端口25,isSSL false 220 mail . ****** . ESMTP Postfix DEBUG SMTP:连接到主机“192.168.0.X”,端口:25 EHLO WIN -0RL58R42TTN 250-mail . ****** . 250-PIPELINING 250-SIZE 102400000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN 250-AUTH = PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN DEBUG SMTP:找到扩展名“PIPELINING”,arg“”DEBUG SMTP:找到扩展名“SIZE”,arg“102400000”DEBUG SMTP:找到扩展名“VRFY”,arg“”DEBUG SMTP:找到扩展名“ETRN”,arg“”DEBUG SMTP :找到扩展名“STARTTLS”,arg“”DEBUG SMTP:找到扩展名“AUTH”,arg“PLAIN LOGIN”DEBUG SMTP:找到扩展名“AUTH = PLAIN”,arg“登录”调试SMTP:找到扩展名“ENHANCEDSTATUSCODES”,arg“ “DEBUG SMTP:找到扩展名”8BITMIME“,”arg“”DEBUG SMTP :找到扩展名“DSN”,arg“”DEBUG SMTP:protocolConnect登录,host = 192.168.0.X,user = sender @ alc onelectronics.com,password = DEBUG SMTP:尝试使用机制进行身份验证:LOGIN PLAIN DIGEST-MD5 NTL M XOAUTH2 DEBUG SMTP:使用机制LOGIN DEBUG SMTP:禁止AUTH LOGIN命令跟踪DEBUG SMTP:AUTH LOGIN成功DEBUG SMTP:use8bit false MAIL FROM:250 2.1.0 Ok RCPT TO:250 2.1.5 Ok DEBUG SMTP:Verified Address DEBUG SMTP:receiver@******.com DATA 354结束数据 . 日期:2017年12月14日星期四14:18:03 0530(IST)发件人:sender@******.com致:receiver@*****.com消息ID:<1109371569.1.1513241292669@ *****.com:Subject:test3 MIME-Version:1.0 Content-Type:multipart / mixed;边界= “---- = _ Part_0_1349393271.1513241283434”
------ = _ Part_0_1349393271.1513241283434 Content-Type:text / plain; charset = utf-8 Content-Transfer-Encoding:7bit test ------ = _ Part_0_1349393271.1513241283434-- . 250 2.0.0确定:排队为D894D48F0411 DEBUG SMTP:消息已成功发送到邮件服务器QUIT 221 2.0.0再见
2 回答
我不相信只有一个理由让它变慢 . 您可能需要在示例下面更改一些默认值 .
In 1.6 document of the mail api.
因此,如果使用false更改默认值,则可能会更改其性能 .
我还建议检查java mail apis release notes以找出一些线索 .
您的代码中存在错误 . 使用session.getTransport而不是session.getInstance获取Transport对象;我们在调用transport.connect(host,..)时看不到主机初始化的位置;如果您设置了正确的属性并且没有任何DNS解决问题,则connect(用户,密码)应该足够了 .