Вы бы предпочли подключиться только один раз до цикла, а затем отправить каждое сообщение, используя Transport#sendMessage()
внутри цикла, а затем закрыть соединение после петля.Вторая проблема заключается в том, что вы нигде не передаете имя пользователя / пароль.
Вот как вы должны это сделать:
String host = "smtp.live.com";
int port = 587;
String username = "you@live.com";
String password = "yourpassword";
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", String.valueOf(port));
Session mailSession = Session.getDefaultInstance(props);
Transport transport = null;
try {
transport = mailSession.getTransport("smtp");
transport.connect(host, username, password);
InternetAddress fromAddress = new InternetAddress(from);
for (Student s : groep.getStudenten()) {
InternetAddress[] toAddresses = { new InternetAddress(s.getEmail()) };
Message simpleMessage = new MimeMessage(mailSession);
simpleMessage.setFrom(fromAddress);
simpleMessage.setRecipients(RecipientType.TO, toAddresses);
simpleMessage.setSubject(subject);
simpleMessage.setText(message);
simpleMessage.setSentDate(new Date()); // Otherwise you end up in junk.
simpleMessage.saveChanges(); // Transport#sendMessage() doesn't do it.
transport.sendMessage(simpleMessage, toAddresses);
}
} catch (MessagingException e) {
// Handle it! Display a FacesMessage or something.
} finally {
if (transport != null) try { transport.close(); } catch (MessagingException ignore) {}
}
(я не гарантируючто это будет работать таким образом, у меня нет опыта работы с SMTP-серверами Live.com, возможно, вам нужен дополнительный Authenticator
)
В качестве совершенно другой альтернативы вы также можете отправить одинсообщение groupname@yourdomain.com
со всеми этими получателями в качестве BCC.
См. также:
Обратите внимание, что эта проблема полностью не связана с JSF.У вас будет точно такая же проблема, когда вы делаете это в простом ванильном Java-классе с main()
методом.