【问题标题】:Java mail how to send automatically an email on conditionJava邮件如何根据条件自动发送电子邮件
【发布时间】:2011-06-27 13:54:58
【问题描述】:

以前从未使用过 Java 邮件。

在我的 JSF Web 应用程序中,我有一个实体 (followUp),其属性 private Date checkDate; 对应于一个 Animal 实体。 (一个Animal有很多后续记录)。否则:

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

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

我只知道sn-p:

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

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

任何帮助都可以。问候。

【问题讨论】:

    标签: jsf jakarta-ee jakarta-mail


    【解决方案1】:

    根据您的问题历史,我知道您使用的是 Glassfish 3(带有 EJB 3.1 的 Java EE 6),所以我建议使用 @Schedule 方法创建一个 @Singleton EJB,该方法在指定的后台执行间隔,例如每天午夜 (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.
        }
    
    }
    

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

        @Schedule(hour="*", minute="*/1", second="0", persistent=false)
    

    让它每分钟运行一次。

    另见:

    【讨论】:

    • 我想我在转而使用 EJB 技术时错过了很多东西。谢谢你的聪明提示!我现在要从事邮件工作,如果遇到困难,我会发布一个与之相关的新问题。现在,我将答案标记为已接受。问候:)
    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多