Как отправить одно и то же письмо каждому отдельному получателю группы? - PullRequest
1 голос
/ 17 августа 2011

Я пытаюсь отправить письмо со своей страницы jsf.это мой метод:

public String voegGroepToe()
{
    String resultaat = "overzichtGroepEnProject";
    if(project.getGroepen().size()<project.getMaxAantalGroepen())        
        project.voegGroepToe(groep);

    for(Student s : groep.getStudenten())
    {

    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.live.com");
    props.put("mail.smtp.port", "587");

    Session mailSession = Session.getDefaultInstance(props);
    Message simpleMessage = new MimeMessage(mailSession);

    InternetAddress fromAddress = null;
    InternetAddress toAddress = null;
    try {
        fromAddress = new InternetAddress(from);
        toAddress = new InternetAddress(s.getEmail());
    } catch (AddressException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        simpleMessage.setFrom(fromAddress);
        simpleMessage.setRecipient(RecipientType.TO, toAddress);
        simpleMessage.setSubject(subject);
        simpleMessage.setText(message);

        Transport.send(simpleMessage);          
    } catch (MessagingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

    return resultaat;
}

resultaat - это страница jsf, на которую приложение должно перейти после того, как оно отправило электронные письма.groep означает группу со студентами.почта должна быть отправлена ​​каждому студенту группы.the from = "myownemailadress@hotmail.com"

Но это не работает и не выдает сообщение об ошибке, похоже, что оно застряло на Transport.send ... Что я делаю не так?

1 Ответ

3 голосов
/ 17 августа 2011

Вы бы предпочли подключиться только один раз до цикла, а затем отправить каждое сообщение, используя 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() методом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...