使用不同的邮件api jar缓慢发送邮件性能(javamail)

参见英文答案 > MimeMessage.saveChanges is really slow                                    1个
我正在测试sendmail示例,如中所述
https://javaee.github.io/javamail/FAQ.这是一个简单的邮件发送操作,没有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 version 1.4ea

DEBUG: getProvider() returning
javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.s

mtp.SMTPTransport,Sun Microsystems, Inc]

DEBUG SMTP: useEhlo true, useAuth true

DEBUG SMTP: trying to connect to host “192.168.0.X”, port 25, isSSL
false

220 mail.******.com ESMTP Postfix

DEBUG SMTP: connected to host “192.168.0.X”, port: 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: Found extension “PIPELINING”, arg “”

DEBUG SMTP: Found extension “SIZE”, arg “102400000”

DEBUG SMTP: Found extension “VRFY”, arg “”

DEBUG SMTP: Found extension “ETRN”, arg “”

DEBUG SMTP: Found extension “STARTTLS”, arg “”

DEBUG SMTP: Found extension “AUTH”, arg “PLAIN LOGIN”

DEBUG SMTP: Found extension “AUTH=PLAIN”, arg “LOGIN”

DEBUG SMTP: Found extension “ENHANCEDSTATUSCODES”, arg “”

DEBUG SMTP: Found extension “8BITMIME”, arg “”

DEBUG SMTP: Found extension “DSN”, arg “”

DEBUG SMTP: Attempt to authenticate

AUTH LOGIN

334 VXNlcm5hbWU6

am9iaW4uZWxhbmppY2thbEBhbGNvbmVsZWN0cm9uaWNzLmNvbQ==

334 UGFzc3dvcmQ6

Sk9CSU5ANzc3TnM=

235 2.7.0 Authentication successful

DEBUG SMTP: use8bit false

MAIL FROM:

250 2.1.0 Ok

RCPT TO:

250 2.1.5 Ok

DEBUG SMTP: Verified Addresses

DEBUG SMTP: receiver@******.com

DATA

354 End data with .

Date: Thu, 14 Dec 2017 14:17:46 +0530 (IST)

From: sender@******.com

To: receiver@******.com

Message-ID: <396180261.01513241266298.JavaMail.sender@******

.com>

Subject: test3

MIME-Version: 1.0

Content-Type: multipart/mixed;

06003

——=_Part_0_2093176254.1513241266126

Content-Type: text/plain; charset=utf-8

Content-Transfer-Encoding: 7bit

test

——=_Part_0_2093176254.1513241266126–

.

250 2.0.0 Ok: queued as 7E38D48F0411

QUIT

221 2.0.0 Bye

Java Mail API 1.5.6

DEBUG: setDebug: JavaMail version 1.5.6

DEBUG: getProvider() returning
javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.s

mtp.SMTPTransport,Oracle]

DEBUG SMTP: useEhlo true, useAuth true

DEBUG SMTP: trying to connect to host “192.168.0.X”, port 25, isSSL
false

220 mail.******.com ESMTP Postfix

DEBUG SMTP: connected to host “192.168.0.X”, port: 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: Found extension “PIPELINING”, arg “”

DEBUG SMTP: Found extension “SIZE”, arg “102400000”

DEBUG SMTP: Found extension “VRFY”, arg “”

DEBUG SMTP: Found extension “ETRN”, arg “”

DEBUG SMTP: Found extension “STARTTLS”, arg “”

DEBUG SMTP: Found extension “AUTH”, arg “PLAIN LOGIN”

DEBUG SMTP: Found extension “AUTH=PLAIN”, arg “LOGIN”

DEBUG SMTP: Found extension “ENHANCEDSTATUSCODES”, arg “”

DEBUG SMTP: Found extension “8BITMIME”, arg “”

DEBUG SMTP: Found extension “DSN”, arg “”

DEBUG SMTP: protocolConnect login, host=192.168.0.X, user=sender@alc

onelectronics.com, password=

DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN
DIGEST-MD5 NTL

M XOAUTH2

DEBUG SMTP: Using mechanism LOGIN

DEBUG SMTP: AUTH LOGIN command trace suppressed

DEBUG SMTP: AUTH LOGIN succeeded

DEBUG SMTP: use8bit false

MAIL FROM:

250 2.1.0 Ok

RCPT TO:

250 2.1.5 Ok

DEBUG SMTP: Verified Addresses

DEBUG SMTP: receiver@******.com

DATA

354 End data with .

Date: Thu, 14 Dec 2017 14:18:03 +0530 (IST)

From: sender@******.com

To: receiver@******.com

Message-ID: <1109371569.1.1513241292669@******.com>

Subject: test3

MIME-Version: 1.0

Content-Type: multipart/mixed;

06004

——=_Part_0_1349393271.1513241283434

Content-Type: text/plain; charset=utf-8

Content-Transfer-Encoding: 7bit

test

——=_Part_0_1349393271.1513241283434–

.

250 2.0.0 Ok: queued as D894D48F0411

DEBUG SMTP: message successfully delivered to mail server

QUIT

221 2.0.0 Bye

解决方法:

我不相信只有一个理由让它变慢.您可能需要在示例下面更改一些默认值.

In 1.6 document of the mail api.

Use the InetAddress.getCanonicalHostName method to determine the host name in the InternetAddress.getLocalAddress method. With some network configurations, InetAddress.getCanonicalHostName may be slow or may return an address instead of a host name. In that case, setting this System property to false will cause the InetAddress.getHostName method to be used instead. The default is true.

因此,如果使用false更改默认值,则可能会更改其性能.

我还建议检查java mail apis release notes以找出一些线索.

上一篇:linux – 用于sendmail的ssh隧道


下一篇:JavaScript加密和PHP解密