【问题标题】:java.lang.IllegalStateException: The MimeMessage is already builtjava.lang.IllegalStateException: MimeMessage 已经构建
【发布时间】:2017-09-27 04:42:14
【问题描述】:

我试图在我的 spring 应用程序中设置一个邮件发件人:

@Configuration
public class MailConfig {

    private static final String HOSTNAME = "mail.********.com";
    private static final int SMTP_PORT = 25;
    private static final String USERNAME = "*********";
    private static final String PASSWORD = "*********";
    private static final String FROM_ADDRESS = "***********";

    @Bean
    public HtmlEmail mailSender() {
        HtmlEmail email = new HtmlEmail();
        email.setHostName(HOSTNAME);
        email.setSmtpPort(SMTP_PORT);
        email.setAuthenticator(new DefaultAuthenticator(USERNAME, PASSWORD));
        email.setSSLOnConnect(true);
        try {
            email.setFrom(FROM_ADDRESS, "Support");
        } catch (EmailException e) {
            throw new BeanCreationException("mailSender", "Failed to create a mailSender", e);
        }
        return email;
    }

}

这是我用来发送邮件的服务:

@Service
public class MailService {

    public static Logger log = Logger.getLogger(Logger.class.getName());

    private final HtmlEmail mailSender;

    @Autowired
    public MailService(HtmlEmail mailSender) {
        this.mailSender = mailSender;
        this.notificationService = notificationService;
        this.commonDAO = commonDAO;
    }

    @Async
    public void sendMail(int accountId, String subject, String message) {
        log.debug("entered MailService.sendMail");
        String emailId = commonDAO.getEmailId(accountId);
        try {
            mailSender.setSubject(subject);
            mailSender.setHtmlMsg(getMailContent(message, accountId));
            mailSender.addTo(emailId);
            mailSender.addBcc("************");
            mailSender.send();
            sleep(1000L);
        } catch (Exception e) {
            log.error("Error:", e);
        }
    }
}

第一次启动tomcat后,当我调用mailService.sendMail()时,邮件发送正确。第二次以后,我收到错误

java.lang.IllegalStateException: The MimeMessage is already built.
    at org.apache.commons.mail.Email.buildMimeMessage(Email.java:1261)
    at org.apache.commons.mail.MultiPartEmail.buildMimeMessage(MultiPartEmail.java:258)
    at org.apache.commons.mail.HtmlEmail.buildMimeMessage(HtmlEmail.java:528)
    at org.apache.commons.mail.Email.send(Email.java:1427)
    at com.cinch.v2.service.MailService.sendMail(MailService.java:41)
    at com.cinch.v2.service.MailService$$FastClassBySpringCGLIB$$d7350403.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)

我在这里做错了什么?如何正确设置?

【问题讨论】:

标签: java email illegalstateexception


【解决方案1】:

而不是调用调用的 send()

  • buildMimeMessage()
  • sendMimeMessage()

所以多次调用 sendMimeMessage() 是可以接受的,但我们应该调用或调用 buildMimeMessage() 只有一次。

您可以显式调用 buildMimeMessage() 一次,然后调用 sendMimeMessage() 一次或多次。

【讨论】:

  • 请在 Yohannes 的另一个答案中查看我的评论
【解决方案2】:

查看HtmlEmail。它具有buildMimeMessage()sendMimeMessage() 两种方法。根据this,您可以调用buildMimeMessage() 一次来显式构建您的消息Mime,之后您可以随时再次显式调用'sendMimeMessage()' 来发送消息。

试试这样的:

public static buildEmail( String subject, int accountId){
String emailId = commonDAO.getEmailId(accountId);
            mailSender.setSubject(subject);
            mailSender.addTo(emailId);
            mailSender.addBcc("************");
            mailSender.buildMimeMessage();

}

public static sendEmail(String message, int accountId){
  mailSender.setHtmlMsg(getMailContent(message, accountId));
  mailSender.sendMimeMessage();
}

拨打buildEmail一次,然后您可以多次拨打sendEmail

【讨论】:

  • 仍然很困惑在我的代码中我必须调用 buildMimeMessage() 和 sendMimeMessage()。我尝试在 MailService.sendMail 中调用 buildMimeMessage() 作为 MailConfig.mailSender 和 sendMimeMessage() 的最后一行,而不是 mailSender.send()。我得到异常 org.apache.commons.mail.EmailException: 至少需要一个收件人地址。但是如果我将 buildMimeMessage() 移动到 MailService.sendMail(),它将被多次调用
  • 我做了一些更改...如果有帮助
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2021-12-24
  • 2016-04-16
  • 2012-09-07
  • 2011-11-11
  • 2023-03-08
  • 2013-07-21
相关资源
最近更新 更多