Как отправить несколько электронных писем за один сеанс?
-
30-09-2019 - |
Вопрос
Я хочу отправить тысячи различных электронных писем различным получателям и хотел бы открыть соединение с моим SMTP и удержать его. Я надеюсь, что это быстрее, чем открыть соединение для Ervy Mail. Я хотел бы использовать электронную почту Apache Commons для этого, но в случае необходимости можно вернуться к API Java Mail.
Прямо сейчас я делаю это, что открывает каждый раз соединяет связь:
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 раза быстрее, а затем каждый раз открывайте соединение (что происходит, когда вы используете почту Commons). Производительность можно продвинуть дальше с помощью нескольких потоков.
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();
Другие советы
Вы можете использовать свой предыдущий код, но добавить следующее, чтобы получить базовый сеанс
email.getMailSession();
Вы можете добавить дополнительные почтовые свойства Java
email.getMailSession().getProperties().put(<key>, <value>);
Посмотри на http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html. Анкет Есть пример, показывающий, как отправить электронное письмо. Вы должны быть в состоянии отправить больше, прежде чем звонить Close () на транспорте.
Вообще нет необходимости код 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 получателей электронной почты, надеюсь, это поможет :) ..