Как отправить несколько писем за один сеанс?

Я хочу отправить тысячи разных писем разным получателям и хотел бы открыть соединение с моим SMTP и удерживать его. Я надеюсь, что это быстрее, чем повторно открыть соединение для электронной почты. Я хотел бы использовать для этого электронную почту Apache Commons, но при необходимости мог бы вернуться к 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("[email protected]");
email.addTo(to);
email.setSubject(subject);
email.setHtmlMsg(htmlMsg);
email.send();

person Tim Büthe    schedule 02.12.2010    source источник
comment
Оставьте сеанс открытым, отправьте 1000 электронных писем и наконец закройте сеанс.   -  person Buhake Sindi    schedule 02.12.2010
comment
Знаете ли вы, возможно ли это с обычной электронной почтой?   -  person Tim Büthe    schedule 02.12.2010
comment
не похоже... Я полностью использую JavaMail.   -  person Buhake Sindi    schedule 02.12.2010


Ответы (4)


Вот мой класс тестирования производительности. Отправка писем с использованием одного соединения в 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();
person Tim Büthe    schedule 04.12.2010

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

email.getMailSession();

Вы можете добавить дополнительные свойства почты Java,

email.getMailSession().getProperties().put(<key>, <value>);
person hsampson    schedule 15.10.2012

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

person adrianboimvaser    schedule 02.12.2010

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

MimeMessage pesan = new MimeMessage(session); pesan.setFrom(new InternetAddress("[email protected]")); pesan.setRecipients(Message.RecipientType.TO, InternetAddress.parseHeader("[email protected],[email protected],[email protected]",false));

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

person Mang Jojot    schedule 24.10.2018
comment
Вы упустили суть. Я хотел отправить много отдельных писем множеству разных получателей. Не одна и та же почта для всех из них. - person Tim Büthe; 24.10.2018