Comment envoyer plusieurs emails en une seule session?
-
30-09-2019 - |
Question
Je veux envoyer des milliers de courriels à des destinataires différents et souhaite ouvrir la connexion à mon SMTP et le maintenir. J'espère que cela est plus rapide puis rouvrez la connexion pour le courrier Ervy. Je voudrais utiliser Apache Commons Email pour cela, mais pourrait revenir à l'API Java courrier si nécessaire.
En ce moment I'am faire, ce qui ouvre un ferme la connexion à chaque fois:
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();
La solution
Voici ma classe de test de performance. L'envoi des mails en utilisant la connexion est une 4 fois rouvrent plus vite que la connexion à chaque fois (ce qui se passe lorsque vous utilisez courrier commun). La performance peut être poussé plus loin à l'aide de plusieurs threads.
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();
Autres conseils
Vous pouvez utiliser votre code plus tôt, mais ajouter ce qui suit pour obtenir la session sous-jacente
email.getMailSession();
Vous pouvez ajouter des propriétés supplémentaires de messagerie java par
email.getMailSession().getProperties().put(<key>, <value>);
Jetez un oeil à http: //java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html. Il est un exemple montrant comment envoyer un email. Vous devriez être en mesure d'envoyer plus avant d'appeler close () sur le transport.
pas de code besoin xtra du tout, il suffit de mettre vos tous les destinataires de courrier électronique et séparées par des virgules.
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));
et faire la même chose pour
Message.RecipientType.CC
et Message.RecipientType.BCC
s'il y a plus de 1 destinataires de courrier électronique
espère son aide:) ..