#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.