当前位置: 首页 > 知识库问答 >
问题:

提高通过Spring mail发送批量电子邮件的性能

颛孙凯定
2023-03-14

我有一个spring独立应用程序,它使用简单的spring电子邮件代码,如下所示,to消息是使用map中迭代的值构建的。

我已经对这个问题有了一些建议,但我需要一些具体的建议。下面是我的代码

for (Map.Entry<String, List<values>> entry : testMap
                .entrySet()) {
            String key = entry.getKey();
            StringBuilder htmlBuilder = new StringBuilder();            
            List<Model> valueList = entry.getValue();
            for (Model value : valueList) {
                htmlBuilder.append('List Values in the message');
            }
            mail.sendMail( msgFrom,body); // call my sendMail function in another class
        } 

发送邮件的代码:

        MimeMessage email = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(email, true);
        helper.setFrom(new InternetAddress(from));
        helper.setTo(new InternetAddress(to));
        helper.setText(msg, true);
        helper.addInline("identifier1234", res);
        mailSender.send(email);

发送邮件需要3到4秒钟。我每天有大约40万的用户列表要发送

我是否做错了什么,或者采取了其他方法来加快这个过程。我需要专家的建议

感谢您的时间和帮助:)

共有3个答案

漆雕亮
2023-03-14

您可以将sendMail封装到单独的可运行类中,并将任务放入ExecutorService(或者在sendMail方法之上使用@Async,但这很难配置——这只是我的观点)。

上官高翰
2023-03-14

基本上,答案是不要自己做这件事。

这里有一个非常详细的理由:如何每周发送100,000封电子邮件?

蒋何平
2023-03-14

依我看,发送邮件本身的过程可以得到改进,因为目前,每封邮件都会打开一个到邮件服务器的新连接。您可以通过使用批处理发送来改进它。

SpringMailSender接口本机支持发送一组消息,而不是单个消息,因此您不必明确地处理JavaMail会话。你可以简单地修改这个类实际上是通过这种方式发送邮件的

int batchSize = 16; // for example, adjust it to you needs
MimeMessage[] messages = new MimeMessage[batchSize];
int messageIndex = 0;

public void sendMail(String msgFrom, String body) {
    // prepare MimeMessage
    messages[messageIndex++] = email;
    if (messagesIndex == batchSize) {
        mailSender.send(messages);
        messageIndex = 0;
    }

public void sendLastMails() {
    if (messageIndex > 0) {
        MimeMessage[] lastMessages = new MimeMessage[messageIndex];
        for (int i =0; i<messageIndex; i++) {
            lastMessages[i] = messages[i];
    }
    mailSender.send(lastMessages);
}

编辑:

可以在多个地方调用sendLastMails方法。首先,必须在单例bean的destroy方法中调用它,以确保应用程序关闭时不会忘记任何消息。如果发送邮件的类是单例bean,那么声明bean的destroy方法sendLastMail,或者调用它就足够了。

然后,根据您自己的业务规则,可能会在发送一批邮件后调用它。典型用法:在你的例子中,你有testMap。你应该这样重写:

    for (Map.Entry<String, List<values>> entry : testMap
            .entrySet()) {
        ...
        mail.sendMail( msgFrom,body); // call my sendMail function in another class
    }
    mail.sendLastMails();

现在由你来决定,这一改进是否足够,或者你是否应该外包。

 类似资料:
  • 问题内容: 我有一个独立于Spring的应用程序,该应用程序使用以下简单的spring电子邮件代码,并且使用从map迭代的值构造。 我已经在这里对这个问题提出了一些建议,但是我需要一些具体的建议。下面是我的代码 发送邮件的代码: 发送邮件需要3到4秒钟。我每天有大约40万个大型用户要发送 我在做任何错误的事情还是其他方法来加快此过程。我需要专家的建议 感谢您的时间和帮助:) 问题答案: 恕我直言,

  • 问题内容: 我正在使用。 使用发送电子邮件(通过)的最佳方法是什么? 问题答案: 有关使用Outlook的解决方案,请参见下面的TheoretiCAL答案。 否则,请使用python随附的smtplib。请注意,这将要求您的电子邮件帐户允许smtp,默认情况下不一定启用此功能。 编辑: 此示例使用保留域,如RFC2606中所述 为了使它真正与gmail配合使用,Doe先生需要进入gmail中的选项

  • 我使用的PHPMailer表格在这里找到。 从网站下载的示例是“接触-3”,在引导主题中使用PHPMailer通过gmail发送SMTP电子邮件。当我使用“接触-1”时,它完全适用于我的托管域电子邮件地址,但SMTP版本适用于gmail地址,联系人表单不会提交。 在下面的代码中,我更改了以下行以添加我的gmail地址和gmail密码: 任何关于使用给定信息进行此工作的帮助都将不胜感激-提前感谢!

  • 问题内容: 在我的中,我具有以下内容: 我的电子邮件代码: 当然,如果通过设置调试服务器,则可以在终端中看到该电子邮件。 但是,我实际上如何不将电子邮件发送到调试服务器,而是发送到user@gmail.com? 阅读你的答案后,让我弄明白一点: 你不能使用localhost(简单的ubuntu pc)发送电子邮件吗? 我认为在django 1.3中已经过时了,取而代之的是? 问题答案: 将电子邮件

  • 我使用SendInBlue Java Api发送电子邮件,我在scala中编写了以下代码: 但我得到了这个错误:{“代码”:“失败”,“消息”:“需要有效的”至“电子邮件地址”,“数据”:[]}

  • 问题内容: 如何使用PHP发送带有图片的HTML格式的电子邮件? 我想要一个带有一些设置和HTML输出的页面,该页面通过电子邮件发送到一个地址。我该怎么办? 主要问题是附加文件。我怎样才能做到这一点? 问题答案: 非常简单,将图像保留在服务器上,然后将PHP + CSS发送给它们… 正是这一行告诉邮件发件人和收件人,该电子邮件包含(希望)格式正确的HTML,需要对其进行解释: 这是我获得信息的链接