java - 如何处理SendFailedException?

标签 java jakarta-mail spring-batch

我正在使用 Spring Batch 发送批量电子邮件。 我正在使用 ItemReader 获取包含需要向其发送电子邮件的详细信息的列表,并使用 ItemProcessor 准备它并使用 ItemWriter 发送它。 它工作正常,但问题是我必须确定哪个电子邮件 ID 邮件发送失败。

简而言之,我想做这样的事情:

        try { 
            mailSender.send(items.toArray(new MimeMessagePreparator[items.size()])); 
        } catch (final SendFailedException e) { 
            logProblem(e); 

            final Address[] invalidAddresses = e.getInvalidAddresses(); 
            setFailedAddresses(invalidAddresses); 
            final Address[] validSentAddresses = e.getValidSentAddresses(); 
            setConfirmedAddresses(validSentAddresses); 
            final Address[] validUnsentAddresses = e.getValidUnsentAddresses(); 
            resend(validUnsentAddresses); 
        }     

但是发送方法定义是这样的

JavaMailSender.send(MimeMessagePreparator[] arg0) 抛出 MailException

所以它显示无法访问的catch block

这是我的 ItemProcessor 实现:

@Override
    public MimeMessagePreparator process(final UserEmailDtlBO userEmailDtlBO) throws Exception {

       MimeMessagePreparator preparator = new MimeMessagePreparator() {
           public void prepare(MimeMessage mimeMessage) throws Exception {
             MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true);
             message.setTo(userEmailDtlBO.getEmail());
             message.setFrom(mailbundle.getString("mailFrom"));
             Map<String, Object> model = new HashMap<String, Object>();
             model.put("user", userEmailDtlBO);
            // message.addInline("logoImg", new ClassPathResource("/conf/logo_green.png"));
             String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/conf/demo_email.vm", "utf-8", model);
             message.setSubject("demo email template");
             message.setText(text, true);
             URL resource = this.getClass().getResource("/conf/logo_green.png");
             String fileStr = resource.getFile();
             File emailLogo = new File(fileStr);
             message.addInline("logoImg", emailLogo);
           }};
    return preparator;
    }

这是我的 ItemWriter 实现:

@Override
    public void write(List<? extends MimeMessagePreparator> items) throws MailException{
        mailSender.send(items.toArray(new MimeMessagePreparator[items.size()]));
    } 

请帮助我处理 SendFailedException 。

最佳答案

javax.mail.SendFailedException

是一个受检查的异常,所以

org.springframework.mail.javamail.JavaMailSender.send(MimeMessagePreparator... mimeMessagePreparators)

永远不会抛出检查异常,只会抛出 javadoc API 中定义的运行时异常。

您可以检查抛出的异常是否属于类型

org.springframework.mail.MailSendException

,然后调用

ex.getFailedMessages()

关于那些异常(exception)。至少 org.springframework.mail.javamail.JavaMailSenderImpl 在特定条件下填充失败的消息(详细信息请查看源代码)。 如果没有,请编写您自己的 impl 类来捕获 SendFailedException,提取所需的值并将其包装在您自己的 MySendFailedException 中。

为了在 Spring Batch 中进行处理,您可以定义一个

org.springframework.batch.core.ItemWriteListener

并处理异常

public void onWriteError(Exception ex, List<? extends O> item) {    }

关于java - 如何处理SendFailedException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35068559/

相关文章:

java - jpa 更新/删除查询不起作用

spring-batch - 无法将类型 'java.util.Collections$UnmodifiableMap' 的属性值转换为所需类型 'org.springframework.batch.item.ExecutionContext'

java - 从 Java 过渡到 Google App Engine

java - 无法从电子邮件中读取自定义 header

java - 降序排列 ArrayList

java - 如何使用 javamail 将我网站的联系表单链接到我的邮件

spring-boot - 如何让 JavaMailSender 不会因为错误的邮件密码而导致应用程序上下文加载失败?

java - Spring Batch - 在作业运行期间导入数据时

java - ConstraintLayout 指南百分比动画

java - 数组列表重复值