我一直在谷歌和stackoverflow上搜索服务器是否可以发送自动电子邮件,例如每个星期一,使用servlet而无需任何用户交互。 目前,用户必须登录并且代码被执行。 我想要的是服务器在特定时间执行代码,用户不必登录,甚至没有看到。 我不想在用户上转发,我想在服务器上转发。
答案 0 :(得分:3)
您需要在服务器中拥有非交互式线程。理想情况下,此线程应由ServletContextListener
启动,以确保即使在第一次客户端连接之前它也将处于活动状态。
你可以从头开始构建一些东西,也可以使用专门的工具,例如优秀的Quartz scheduler,它将为你做锅炉板代码。
拥有调度程序后,您只需要能够通过SMTP将邮件发送到邮件服务器。在这里,您可以手动实现协议 (SMTP并不那么难),但是如果您不想重新发明一个已经存在圆形的椭圆形轮子,请使用来自的javamail API Java EE SDK或其他第三方库,例如the one provided by Apache
答案 1 :(得分:2)
只要您的服务器应用程序正在运行,您就可以使用Quartz来安排电子邮件发送过程。
答案 2 :(得分:2)
您应该能够通过设置另一个作为服务执行的应用程序来完成您的工作。在下面,此应用程序可以使用Quartz之类的东西来管理预定的事件。
您可以通过使用某些数据库使其与Web应用程序保持同步。这种方法应该允许电子邮件传输的自动化。
答案 3 :(得分:1)
您可以使用Quartz来调度作业以在指定的日期和时间运行。 Quartz 2中有两种类型的触发器
SimpleTrigger - 这个允许设置开始时间,结束时间,重复间隔。
CronTrigger - 它允许Unix cron表达式指定运行作业的日期和时间。
您可以从official website或maven存储库获取Quartz库。
内部解决方案
如果您不想为此目的使用任何第三方jar,还有一种方法。从J2SE 1.3开始,Java包含可用于此目的的java.util.Timer和java.util.TimerTask类< / p>
答案 4 :(得分:1)
您需要运行后台线程并等待下次发送电子邮件。 Java 5添加了一些类来使这样的后台线程和任务变得非常容易。
其他一些答案提到了Quartz库。我没有使用它,它可能有很好的功能。但对你的目的来说肯定没有必要。 Java中构建的类就足够了。
ServletContextListener
创建ServletContextListener
的子类。保证在处理任何servlet请求之前调用此类。因此,这是初始化Web应用程序使用的对象的位置。当您的Web应用程序关闭时,也会调用此类。
ScheduledExecutorService
在您的servlet上下文侦听器中,当您的Web应用程序启动时,实例化ScheduledExecutorService
。此类使用线程池在后台运行任务。您可以在首次运行之前指定初始延迟(可选),并指定重复任务的频率。
在您的servlet上下文侦听器中,请确保在Web应用程序关闭时关闭ScheduledExecutorService。如果不这样做,池中的后台线程将继续存在。在主机操作系统上启动以运行servlet容器的java
进程将继续而不是退出。
请务必在任务周围添加try-catch。到达ScheduledExecutorService的任何异常都会导致服务静默停止。见this funny post(谨慎,顽皮的语言)。
搜索StackOverflow以获取更多详细信息和示例。这个问题基本上是重复的,所以我保留了这个答案的简要说明。