Java邮件如何在条件下自动发送电子邮件

Han*_*sky 4 jsf jakarta-mail jakarta-ee

以前从未使用过 Java 邮件。

在我的 JSF Web 应用程序中,我有一个具有与实体对应(followUp)的属性private Date checkDate;Animal实体。(一个动物有很多后续记录)。除此以外:

用户必须每 3 个月创建一个新记录 {followUp}并将其标记为已检查并提供其操作的日期,即“checkDate”。但由于用户太懒了,他只为少数动物这样做。因此,他实际上希望通过电子邮件提醒超过 3 个月未检查的动物。示例:我followUp在 2011 年 1 月 1 日为动物“A”创建了一条记录,然后大约在 2011 年 1 月 4 日,用户收到一封电子邮件,提醒他去检查动物 B 的后续行动。

Web 应用程序正在本地企业网络上运行。

我只知道那个片段:

import javax.mail.*;
import javax.mail.internet.*;

import java.util.Properties;

class SimpleMail {
    public static void main(String[] args) throws Exception{
      Properties props = new Properties();
      props.setProperty("mail.transport.protocol", "smtp");
      props.setProperty("mail.host", "mymail.server.org");
      props.setProperty("mail.user", "emailuser");
      props.setProperty("mail.password", "");

      Session mailSession = Session.getDefaultInstance(props, null);
      Transport transport = mailSession.getTransport();

      MimeMessage message = new MimeMessage(mailSession);
      message.setSubject("Testing javamail plain");
      message.setContent("This is a test", "text/plain");
      message.addRecipient(Message.RecipientType.TO,
           new InternetAddress("elvis@presley.org"));

      transport.connect();
      transport.sendMessage(message,
          message.getRecipients(Message.RecipientType.TO));
      transport.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

为此,我应该创建一个 Servlet 过滤器、一个监听器、一个应用程序范围的支持 bean 吗?一个在followUp记录上循环并返回最后一条记录的 checkDate 并将其与今天日期进行比较的查询?

任何帮助都可以。问候。

Bal*_*usC 5

根据您的问题历史,我知道您使用的是 Glassfish 3(带有 EJB 3.1 的 Java EE 6),所以我建议创建一个@SingletonEJB,其@Schedule方法以指定的时间间隔在后台执行,例如每天午夜 (00 :00:00)。

@Singleton
public class MailReminder {

    @Schedule(hour="0", minute="0", second="0", persistent=false)
    public void run() {
        // Do your check and mail job here.
    }

}
Run Code Online (Sandbox Code Playgroud)

就是这样。无需进一步配置。出于测试目的,您可以使用

    @Schedule(hour="*", minute="*/1", second="0", persistent=false)
Run Code Online (Sandbox Code Playgroud)

让它每分钟运行一次。

也可以看看: