微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring Boot-使用Java List向多个收件人发送电子邮件不起作用

如何解决Spring Boot-使用Java List向多个收件人发送电子邮件不起作用

我正在尝试使用Spring Boot向多个用户发送邮件。尽管未使用Java list,但是mailRequest.getTo().toString()中的send仅适用于一个用户。但是,当我尝试使用Java List将其发送给多个收件人时,显示错误。我使用的是SMTP服务器,并且授权连接为true

我从swagger用户界面输入的json是:

"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"
   ]

错误日志

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 类:

@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类 :(哪一个是从swagger UI中获取json值)

@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 类:

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 类:

@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());
        
    }

}

解决方法

尝试更改to中的MailBuilder方法以接受列表。

public MailBuilder to(List<String> emails) {
    if (mail.getTo() == null) mail.setTo(new ArrayList<>());
    mail.getTo().addAll(emails);
    return this;
}

,然后仅将电子邮件列表传递给构建者.to(mailRequest.getTo())而不是toString()

,

List.toString()将不会提供可解析的出色输出。可能需要用逗号分隔的电子邮件列表。

尝试做这样的事情

        mailerService.send(new MailBuilder()
                .to(mailRequest.getTo().stream().collect(Collectors.joining(",")))
                .from(mailRequest.getFromEmail())
                .subject(mailRequest.getSubject())
                .body(templateEngine,MAIL_TEMPLATE,body)
                .build());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。