4

我正在编写一个 Java 群发电子邮件应用程序来发送电子邮件,每天向用户发送 50,000 到 100,000 封电子邮件。

目前的计划是将发送委托给 sendmail(在本地 unix 服务器上)。

根据我们的测试,sendmail 每秒最多发送 5 封电子邮件。

JavaMail 会是更快的选择吗?

有谁知道发送电子邮件的更快方法。我们希望尽快完成这个过程。

编辑:顺便说一句,也会附上一个pdf

4

4 回答 4

6

你不是在比较喜欢和喜欢。JavaMail 与 SMTP 对话以将其移交给最近的邮件服务器。Sendmail 是一个邮件传输代理,负责将电子邮件路由到其目的地。

一个常见的设置是使用 JavaMail 通过 SMTP 将电子邮件中继到 Sendmail 服务器的 Java 应用程序。两者不是竞争对手,它们是一起使用的。sendmail 服务器应该能够比任何 java 应用程序更快地接受来自 javamail 的传递,但是它会以自己的速率异步传递它们。

于 2009-11-22T21:53:45.323 回答
4

这可能有点太老了,但我只是设法让 javamail 和 sendmail 一起工作。它实际上超级简单,我觉得自己没有更快地完成它很愚蠢......

让我们暂时忽略 sendmail。我们如何通过 javamail 发送电子邮件?网上有很多教程,但它是如何完成的:

  1. 使用适当的身份验证器创建会话;
  2. 创建您的 MimeMessage 对象(这里是您添加所有收件人地址的地方);
  3. 使用您的消息调用 Transport.send()。

如果您的 SMTP 服务器只发送最多 100 个收件人(如我的)的电子邮件怎么办?这就是 sendmail 发挥作用的时候。您可以将 sendmail 视为您自己的 SMTP 服务器。所以先安装吧。如果您正在运行 Ubuntu(像我一样),只需执行以下操作:

sudo apt-get install sendmail

安装很快就结束了。之后,sendmail 就可以使用了。我没有费心配置任何类型的身份验证或其他任何方式,但如果您的服务器在 Internet 上有一个公共 IP,那么这样做可能是个好主意。现在,不要将您的 java 代码(使用 javamail)指向您的 SMTP 服务器,只需将其指向 localhost(或您刚刚安装 sendmail 的任何机器)。

您甚至可以使用常规邮件客户端(thunderbird、outlook、windows mail 或任何您喜欢的东西)测试您的 sendmail 安装。只需将您的 SMTP 服务器配置到您安装 sendmail 的机器上。你猜怎么着?有用!

只是不要用它向全世界发送电子邮件......;)

于 2010-04-23T00:25:03.557 回答
1

First of all, I suppose this is for legitimate reasons and not spamming?

Sendmail is very, very fast for sending emails. What is not so fast is the DNS lookups needed to locate the mailservers for the domain - you need to do a MX query for each - and that would fit fine with the 5 messages pr second you report.

When that is said, you would probably be best off with standard high-performance mailing list software where you construct the message with javamail and tell the mailing list software to send it to everybody. Also ally with e.g. Google Mail as they scale well, to actually get them all sent. Google Apps for Java can allow you to send from within the Google cloud.

Back in ancient history when I worked with that Majordomo worked fine with sendmail. ezmlm works well with qmail (but is probably abandoned by now) and I think mjmlm works well with postfix.

于 2009-11-22T22:30:10.037 回答
1

如果我们使用 Tranport.send() - 静态方法,在 Java 邮件程序中用于发送邮件,此方法对列表中存在的每个电子邮件地址进行握手。(握手是:来自客户端的请求 -> 来自服务器的响应 -> 确认。),即每次关闭与 SMTP 邮件服务器的连接。这是提高性能的方法..,通过它我们可以只进行一次握手,并且大大减少了 SMTP 流量。并一次性将邮件发送给所有收件人,请参阅 SCR#A 以获取此场景的 SMTP 流量。这是供参考的代码,

代替,

Transport.send(msg);

我们应该使用下面的代码,

                            msg.saveChanges(); // implicit with Transport.send()
                            Transport tr = session.getTransport("smtp");
                            tr.connect(smtphost, username, password);
                            msg.saveChanges();   // don't forget this
                            tr.sendMessage(msg, msg.getAllRecipients());
                            tr.close();

用于发送批量邮件。

在这里,您可以使用 Wire Shark 工具查看网络流量。

需要什么,使用邮件服务器进行设置。--> 安装了 Wire Shark 工具和 Apache tomcat 6.0 的本地 m/c,它应该能够 ping 您的邮件服务器,例如 relay.abcxyz.com

现在为这两种情况运行测试台。

于 2011-07-19T14:12:26.780 回答