Как отправить несколько писем за один сеанс? - PullRequest
8 голосов
/ 02 декабря 2010

Я хочу отправить тысячи разных писем разным получателям и хотел бы открыть соединение с моим SMTP и удержать его.Я надеюсь, что это быстрее, чем снова открыть соединение для ошибочной почты.Я хотел бы использовать Apache Commons Email для этого, но в случае необходимости мог бы прибегнуть к Java Mail API.

Сейчас я делаю это, и каждый раз открывается, закрывает соединение:

HtmlEmail email = new HtmlEmail();
email.setHostName(server.getHostName());
email.setSmtpPort(server.getPort());
email.setAuthenticator(new DefaultAuthenticator(server.getUsername(), server.getPassword()));
email.setTLS(true);
email.setFrom("test@example.com");
email.addTo(to);
email.setSubject(subject);
email.setHtmlMsg(htmlMsg);
email.send();

Ответы [ 4 ]

18 голосов
/ 04 декабря 2010

Вот мой класс теста производительности.Отправка писем по одному соединению происходит в 4 раза быстрее, чем каждый раз при повторном открытии соединения (что происходит при использовании обычной почты).Производительность может быть повышена с помощью нескольких потоков.

    Properties properties = System.getProperties();
    properties.put("mail.smtp.host", server);
    properties.put("mail.smtp.port", "" + port);

    Session session = Session.getInstance(properties);
    Transport transport = session.getTransport("smtp");

    transport.connect(server, username, password);

    for (int i = 0; i < count; i++) {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        InternetAddress[] address = {new InternetAddress(to)};
        message.setRecipients(Message.RecipientType.TO, address);

        message.setSubject(subject + "JavaMail API");
        message.setSentDate(new Date());

        setHTMLContent(message);
        message.saveChanges();
        transport.sendMessage(message, address);

    }

    transport.close();
3 голосов
/ 15 октября 2012

Вы можете использовать свой предыдущий код, но добавьте следующее, чтобы получить базовый сеанс

email.getMailSession();

Вы можете добавить дополнительные свойства java почты с помощью

email.getMailSession().getProperties().put(<key>, <value>);
1 голос
/ 02 декабря 2010

Посмотрите на http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html. Есть пример, показывающий, как отправить электронное письмо.Вы должны быть в состоянии отправить больше, прежде чем вызывать close () для транспорта.

0 голосов
/ 24 октября 2018

код xtra вообще не нужен, просто укажите всех получателей электронной почты и разделите их запятыми.

MimeMessage pesan = new MimeMessage(session); pesan.setFrom(new InternetAddress("email_from@host.com")); pesan.setRecipients(Message.RecipientType.TO, InternetAddress.parseHeader("first_email@host.com,second_email@host.com,dst_email@host.com",false));

и сделайте то же самое для Message.RecipientType.CC и Message.RecipientType.BCC, еслиесть более 1 получателей электронных писем, которые надеются на помощь:) ..

...