2010-12-02 5 views
7

Je veux envoyer des milliers d'e-mails différents à différents destinataires et voudrais ouvrir la connexion à mon SMTP et le maintenir. J'espère que ce sera plus rapide, puis rouvrir la connexion pour ervy mail. Je voudrais utiliser Apache Commons Email pour cela, mais je pourrais revenir à l'API Java Mail si nécessaire.Comment envoyer plusieurs emails en une session?

En ce moment I'am faire, ce qui ouvre une 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("[email protected]"); 
email.addTo(to); 
email.setSubject(subject); 
email.setHtmlMsg(htmlMsg); 
email.send(); 
+1

Gardez la session ouverte et envoyer 1000 emails et ** enfin ** clôturer la session. –

+0

Savez-vous si cela est possible avec le courrier électronique commun? –

+0

ça ne me semble pas ... J'utilise JavaMail full-out. –

Répondre

18

Voici ma classe de test de performance. L'envoi des mails en utilisant une connexion est 4 fois plus rapide que la réouverture de la connexion à chaque fois (ce qui se passe lorsque vous utilisez le courrier commun). La performance peut être poussée plus loin en utilisant 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(); 
3

Vous pouvez utiliser votre code plus tôt, mais ajouter ce qui suit pour obtenir la session sous-jacente

email.getMailSession(); 

Vous pouvez ajouter supplémentaires propriétés de messagerie java par

email.getMailSession().getProperties().put(<key>, <value>); 
Questions connexes