Как я могу отправлять почту нескольким получателям

#java #servlets #jakarta-mail

#java #сервлеты #джакарта-почта

Вопрос:

У меня есть HTML-форма, в которой пользователь может ввести более одного почтового идентификатора, но я не знаю, как я могу отправлять почту более чем одному человеку

Я успешно отправляю почту одному пользователю, но здесь я застрял в отправке более одного электронного письма.

Что я сделал:

Это мой EmailUntility класс:

 public class EmailUtility {
public static void sendEmail(String host, String port, final String userName, final String password,
        String toAddress, String subject, String message) throws AddressException, MessagingException {


    Properties properties = new Properties();
    properties.put("mail.smtp.host", host);
    properties.put("mail.smtp.port", port);
    properties.put("mail.smtp.auth", "true");
    properties.put("mail.smtp.starttls.enable", "true");
    Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(userName, password);
        }
    });
    session.setDebug(false);
    Message msg = new MimeMessage(session);

    msg.setFrom(new InternetAddress(userName));
    InternetAddress[] toAddresses = { new InternetAddress(toAddress) };
    msg.setRecipients(Message.RecipientType.TO, toAddresses);
    msg.setSubject(subject);
    msg.setSentDate(new Date());
    msg.setText(message);

    Transport.send(msg);

}
  

}

И это мой сервлет doPost

         String recipient = request.getParameter("email-ids");
    String subject = request.getParameter("subject");
    String content = request.getParameter("content");
    System.out.println(recipient);

    try {
        EmailUtility.sendEmail(host, port, user, pass, recipient, subject,
                content);

    } catch (Exception ex) {
        ex.printStackTrace();
  

Когда я печатаю recipient на консоли, я получаю идентификаторы почты из пользовательского интерфейса, поскольку abc@gmail.com,efg@gmail.com,123@gmail.com все три имеют , разделитель

Этот работает нормально, когда есть только один получатель, но когда их несколько, я не знаю, как это сделать

Я использую java.mail api для отправки писем.

Комментарии:

1. У вас уже есть InternetAddress[] toAddresses = { new InternetAddress(toAddress) }; возможность добавить другой адрес, это не должно быть проблемой. Действительно ли у вас проблема в том, что вы получаете строку типа abc@gmail.com,efg@gmail.com,123@gmail.com и вам нужно разделить ее на несколько адресов? Если да, хотите ли вы разрешить это вообще? Если да, то как вы пытались разделить этот ввод до сих пор?

2. @Thomas я хочу разрешить ему отправлять несколько адресов, я уже получаю строку с , разделителем

Ответ №1:

Здесь toAddress приведена строка, состоящая из идентификаторов электронной почты, разделенных ,

 if (toAddress!= null) {
    List<String> emails = new ArrayList<>();
    if (toAddress.contains(",")) {
        emails.addAll(Arrays.asList(toAddress.split(",")));
    } else {
        emails.add(toAddress);
    }
    Address[] to = new Address[emails.size()];
    int counter = 0;
    for(String email : emails) {
        to[counter] = new InternetAddress(email.trim());
        counter  ;
    }
    message.setRecipients(Message.RecipientType.TO, to);
}
  

Комментарии:

1. сэр message.setRecipients(Message.RecipientType.TO, to); здесь отображается ошибка The method setRecipients(Message.RecipientType, Address[]) is undefined for the type String

2. void javax.mail.Message.setRecipients(RecipientType type, Address[] addresses) принимает адрес, а «кому` имеет тип адреса

3. сэр, я получаю ошибки, не могли бы вы отредактировать свой код с моим, чтобы я мог понять, что я делаю не так, пожалуйста

4. Я могу это сделать, но проблема будет в том, что я не смогу отладить или протестировать код. Код, который я написал, отчасти протестирован

Ответ №2:

Из вашего описания я предполагаю, что параметр email-ids может иметь несколько значений. Следовательно, String recipient = request.getParameter("email-ids"); неверно.

Я приведу Javadoc на ServletRequest.getParamter(String) (выделено мной):

Вы должны использовать этот метод только тогда, когда вы уверены, что параметр имеет только одно значение. Если параметр может иметь более одного значения, используйте getParameterValues .

Так и должно быть String[] recipients = request.getParameterValues("email-ids"); вместо этого. (Вы могли бы также попытаться разделить полученную вами единственную строку с помощью своего кода, но если вы уже получили несколько значений, то объединение и повторное разделение их просто кажется неправильным и рискованным.)

С этими отдельными строками не должно возникнуть проблем с созданием нескольких элементов для массива InternetAddress[] toAddresses , который вы уже используете.

Комментарии:

1. привет, я использовал, getParameterValues но мой класс java выдает ошибку, этот выдает ошибку EmailUtility.sendEmail(host, port, user, pass, recipients, subject, content); , а ошибка The method sendEmail(String, String, String, String, String, String, String) in the type EmailUtility is not applicable for the arguments (String, String, String, String, String[], String, String)

2. @viveksingh да, это потому, что вы не можете отправить массив, когда ожидается один String . Я предполагал, что вы понимаете, что вам также нужно изменить сигнатуру вашего метода.

3. Итак, какой должна быть подпись моего сообщения, я опубликовал свой EmailUtility класс

4. Хм, вы, кажется, новичок в Java, не так ли? В этом случае вам следует сначала ознакомиться с основами, прежде чем погружаться с головой в сложные темы, такие как сервлеты или электронные письма. Просто замените String toAddress на String[] toAddresses

5. да, я новичок в этом, это не работает, я изменил строку на массив, например String [] toAddress

Ответ №3:

Используйте метод InternetAddress.parse.