Apache Commons Email и повторное использование SMTP-подключений - PullRequest
6 голосов
/ 14 июля 2011

В настоящее время я использую Commons Email для отправки сообщений электронной почты, но мне не удалось найти способ обмена smtp-соединениями между отправленными электронными письмами.У меня есть код, подобный следующему:

    Email email = new SimpleEmail();
    email.setFrom("example@example.com");
    email.addTo("example@example.com");
    email.setSubject("Hello Example");
    email.setMsg("Hello Example");
    email.setSmtpPort(25);
    email.setHostName("localhost");
    email.send();

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

    Properties props = new Properties();
    props.setProperty("mail.transport.protocol", "smtp");
    Session mailSession = Session.getDefaultInstance(props, null);
    Transport transport = mailSession.getTransport("smtp");
    transport.connect("localhost", 25, null, null);

    MimeMessage message = new MimeMessage(mailSession);
    message.setFrom(new InternetAddress("example@example.com"));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress("example@example.com"));
    message.setSubject("Hello Example");
    message.setContent("Hello Example", "text/html; charset=ISO-8859-1");

    transport.sendMessage(message, message.getAllRecipients());

Поэтому мне было интересно, есть ли способ заставить Commons Email повторно использовать SMTP-соединениедля нескольких почтовых отправлений?Мне больше нравится API электронной почты Commons, но производительность довольно болезненная.

Спасибо, выкуп

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Я пришел к следующему решению после поиска в самом источнике.Это должно сработать, но могут быть и лучшие решения, о которых я не знаю

    Properties props = new Properties();
    props.setProperty("mail.transport.protocol", "smtp");
    Session mailSession = Session.getDefaultInstance(props, null);
    Transport transport = mailSession.getTransport("smtp");
    transport.connect("localhost", 25, null, null);

    Email email = new SimpleEmail();
    email.setFrom("example@example.com");
    email.addTo("example@example.com");
    email.setSubject("Hello Example");
    email.setMsg("Hello Example");
    email.setHostName("localhost"); // buildMimeMessage call below freaks out without this

    // dug into the internals of commons email
    // basically send() is buildMimeMessage() + Transport.send(message)
    // so rather than using Transport, reuse the one that I already have
    email.buildMimeMessage();
    Message m = email.getMimeMessage();
    transport.sendMessage(m, m.getAllRecipients());
1 голос
/ 02 января 2012

Не могли бы мы добиться этого проще, получив почтовый сеанс из первого письма с помощью getMailSession () и поместив его во все последующие сообщения с помощью setMailSession ()?

Не уверен на 100%, что такое

Обратите внимание, что передача имени пользователя и пароля (в случае аутентификации почты) создаст новый почтовый сеанс с DefaultAuthenticator.Это удобство, но может прийти неожиданно.Если используется аутентификация почты, но НЕТ имени пользователя и пароля, то реализация предполагает, что вы установили аутентификатор и будете использовать существующий почтовый сеанс (как и ожидалось).

из средства javadoc, хотя: -/ http://commons.apache.org/email/api-release/org/apache/commons/mail/Email.html#setMailSession%28javax.mail.Session%29

см. Также: https://issues.apache.org/jira/browse/EMAIL-96

Не уверен, как продолжить здесь ...

...