I am trying to send a mail to multiple number of users using Spring Boot. Though without using Java list
, mailRequest.getTo().toString()
in send
is working for one user. But when I am trying to send it using Java List
to multiple recipients, it is showing error. I'm using SMTP
server and auth connection is given true
.
My json input from swagger UI was:
"fromEmail": "******@Webmail.abc",
"fullName": "Your Name",
"message": "Hello, this is a test email sending from Our App",
"subject": "Greetings",
"to": [
"XXXXXXX@gmail.com", "XXXXXXX@gmail.com"
]
Error Log :
org.springframework.mail.MailParseException: Could not parse mail; nested exception is javax.mail.internet.AddressException: Missing ']' in string ``[Ljava.lang.String;@6d38bf8'' at position 27
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:384) ~[spring-context-support-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:366) ~[spring-context-support-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at com.mail.app.service.impl.MailerServiceImpl.send(MailerServiceImpl.java:51) ~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.lambda$doSubmit$3(AsyncExecutionAspectSupport.java:276) ~[spring-aop-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: javax.mail.internet.AddressException: Missing ']'
Caused by: javax.mail.internet.AddressException: Missing ']'
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:984) ~[jakarta.mail-1.6.5.jar:1.6.5]
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:728) ~[jakarta.mail-1.6.5.jar:1.6.5]
at javax.mail.internet.InternetAddress.parse(InternetAddress.java:705) ~[jakarta.mail-1.6.5.jar:1.6.5]
at org.springframework.mail.javamail.MimeMessageHelper.parseAddress(MimeMessageHelper.java:711) ~[spring-context-support-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at org.springframework.mail.javamail.MimeMessageHelper.setTo(MimeMessageHelper.java:597) ~[spring-context-support-5.2.8.RELEASE.jar:5.2.8.RELEASE]
at com.mail.app.service.impl.MailerServiceImpl.lambda$send$1(MailerServiceImpl.java:45) ~[main/:na]
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:375) ~[spring-context-support-5.2.8.RELEASE.jar:5.2.8.RELEASE]
... 15 common frames omitted
MailController Class:
@RestController
@RequestMapping("/email")
public class MailController {
@Autowired
private MailService mailService;
public MailController(MailService mailService){
this.mailService = mailService;
}
@PostMapping("/send")
@ResponseStatus(HttpStatus.CREATED)
public void send(@RequestBody MailRequest mailRequest){
mailService.send(mailRequest);
}
}
MailRequest Class :(Which takes json value from swagger UI)
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class MailRequest {
private String fullName;
private List<String> to; // private String to; works
private String fromEmail;
private String subject;
private String message;
//Map<String, String> parameters;
}
MailBuilder Class:
public class MailBuilder {
private Mail mail = new Mail();
public Mail build() {
return mail;
}
public MailBuilder to(String newTo) {
if (mail.getTo() == null) mail.setTo(new ArrayList<>());
mail.getTo().add(newTo);
return this;
}
public MailBuilder from(String newfrom) {
if(mail.getFrom() == null) mail.setFrom(newfrom);
return this;
}
// other codes go here
}
MailService Class:
@Component
public class MailServiceImpl implements MailService {
@Autowired private MailerService mailerService;
@Autowired private MailerConfig mailerConfig;
@Autowired private TemplateEngine templateEngine;
private final String MAIL_TEMPLATE = "mail";
@Override
public void send(MailRequest mailRequest) {
Map<String, Object> body = new HashMap<>();
body.put("fromEmail", mailRequest.getFromEmail());
body.put("message", mailRequest.getMessage());
mailerService.send(new MailBuilder()
.to(mailRequest.getTo().toString())
.from(mailRequest.getFromEmail())
.subject(mailRequest.getSubject())
.body(templateEngine, MAIL_TEMPLATE, body)
.build());
}
}
Try to change to
method in MailBuilder
to accept List.
public MailBuilder to(List<String> emails) {
if (mail.getTo() == null) mail.setTo(new ArrayList<>());
mail.getTo().addAll(emails);
return this;
}
and just pass list of emails to builder .to(mailRequest.getTo())
instead of toString()
.
List.toString()
will not provide nice output that would be parsable. It probably needs to be comma separated list of emails.
Try doing something like this
mailerService.send(new MailBuilder()
.to(mailRequest.getTo().stream().collect(Collectors.joining(",")))
.from(mailRequest.getFromEmail())
.subject(mailRequest.getSubject())
.body(templateEngine, MAIL_TEMPLATE, body)
.build());
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.