Java 在特定时间发送电子邮件

Java 在特定时间发送电子邮件,java,jakarta-mail,servletcontextlistener,Java,Jakarta Mail,Servletcontextlistener,我使用下面的代码发送电子邮件。只需创建一个对象并调用该对象的方法 package com.kap.globalreport; public class Mainmethod930 { public static void main(String[] args) { EmailReport930 emailReport930 = new EmailReport930(); emailReport930.sendEmail("emailContent","S

我使用下面的代码发送电子邮件。只需创建一个对象并调用该对象的方法

package com.kap.globalreport;
public class Mainmethod930 { 
    public static void main(String[] args) {
        EmailReport930 emailReport930 = new EmailReport930();
        emailReport930.sendEmail("emailContent","Subject");
    }
}
上面我创建了对象并调用下面的sendmail方法

package com.kap.globalreport;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

public class EmailReport930 implements Runnable {

final private String SMTP_SERVER = "166.62.121.14";
final private String SMTP_PORT = "587";
final private String ROWEL_EMAIL = "dumidu@kapruka.com";
final private String FROM_EMAIL = "cargillspaymenterros@kapruka.com";
final private String FROM_EMAIL_PASSWORD = "cpay@55";
private String emailContent;
private String subject;

public String getEmailContent() {
    return emailContent;
}

public void setEmailContent(String emailContent) {
    this.emailContent = emailContent;
}

public String getSubject() {
    return subject;
}

public void setSubject(String subject) {
    this.subject = subject;
}

private void setEmail(String emailContent, String subject) {
    if (emailContent != null && subject != null) {
        sendEmail(emailContent, subject);
    }
}

public void sendEmail(String emailContent, String subject) {
    try {

        Properties props = new Properties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", SMTP_SERVER);
        props.put("mail.smtp.port", SMTP_PORT);
        props.put("mail.smtp.auth", "true");
        Session mailSession = Session.getInstance(props, new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(FROM_EMAIL, FROM_EMAIL_PASSWORD);
            }
        });
        mailSession.setDebug(true);
        MimeMessage message = new MimeMessage(mailSession);
        message.setFrom(new InternetAddress(FROM_EMAIL));
        message.addHeader("site", "kapruka.com");
        message.addHeader("service", "Cargills Payment Service");
        message.setSentDate(new Date());
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(ROWEL_EMAIL));
        message.setSubject(subject);

        MimeMultipart mimeMultipart = new MimeMultipart();
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setContent(emailContent, "text/html; charset=utf-8");
        messageBodyPart.setContent("<h1>SMTP_PORT</h1>", "text/html");
        mimeMultipart.addBodyPart(messageBodyPart);
        message.setContent(mimeMultipart);

        Transport.send(message);
        System.out.println("Email Sent successfully....");

    } catch (MessagingException mex) {
        mex.printStackTrace();
    }
}

@Override
public void run() {
    setEmail(emailContent, subject);
}
}
package com.kap.globalreport;
导入javax.mail.*;
导入javax.mail.internet.InternetAddress;
导入javax.mail.internet.MimeBodyPart;
导入javax.mail.internet.mimessage;
导入javax.mail.internet.MimeMultipart;
导入java.util.Date;
导入java.util.Properties;
公共类EmailReport930实现可运行{
最终私有字符串SMTP_SERVER=“166.62.121.14”;
最终专用字符串SMTP_PORT=“587”;
最后一个私人字符串ROWEL_EMAIL=”dumidu@kapruka.com";
来自_电子邮件的最终私人字符串=”cargillspaymenterros@kapruka.com";
电子邮件中的最终私人字符串\u密码=”cpay@55";
私有字符串内容;
私有字符串主题;
公共字符串getEmailContent(){
返回电子邮件内容;
}
public void setEmailContent(字符串emailContent){
this.emailContent=emailContent;
}
公共字符串getSubject(){
返回主题;
}
public void setSubject(字符串主题){
this.subject=主语;
}
私有void setEmail(字符串emailContent,字符串subject){
if(emailContent!=null&&subject!=null){
发送电子邮件(电子邮件内容、主题);
}
}
public void sendmail(字符串emailContent,字符串subject){
试一试{
Properties props=新属性();
props.put(“mail.transport.protocol”、“smtp”);
props.put(“mail.smtp.host”,smtp_服务器);
props.put(“mail.smtp.port”,smtp\u端口);
props.put(“mail.smtp.auth”,“true”);
Session mailSession=Session.getInstance(props,new Authenticator(){
@凌驾
公共密码身份验证getPasswordAuthentication(){
返回新密码身份验证(从\u电子邮件,从\u电子邮件\u密码);
}
});
mailSession.setDebug(true);
mimessage message=新mimessage(mailSession);
message.setFrom(新的Internet地址(来自电子邮件));
message.addHeader(“site”,“kapruka.com”);
message.addHeader(“服务”、“嘉吉支付服务”);
message.setSentDate(新日期());
message.addRecipient(message.RecipientType.TO,新的Internet地址(ROWEL_电子邮件));
message.setSubject(主题);
MimeMultipart MimeMultipart=新的MimeMultipart();
BodyPart messageBodyPart=新的MimeBodyPart();
setContent(emailContent,“text/html;charset=utf-8”);
setContent(“SMTP_端口”,“text/html”);
mimeMultipart.addBodyPart(messageBodyPart);
message.setContent(mimeMultipart);
传输。发送(消息);
System.out.println(“电子邮件发送成功…”);
}捕获(消息例外mex){
mex.printStackTrace();
}
}
@凌驾
公开募捐{
设置电子邮件(电子邮件内容、主题);
}
}

我想在特定时间运行这个发送电子邮件的方法。我还想使用hibernate框架从数据库中获取数据。应发送包含上述数据的电子邮件

通常有四种不同的方式定期运行任务:

  • 弹簧
  • 在您的情况下,因为您没有使用任何框架,所以可以使用本机java和
    timer
    ScheduledExecutorService
    作为:

    public class PeriodicTask {
        public static void main(String... args) {
            // System.out.println(LocalTime.ofSecondOfDay(getDelayTo(15, 4)));
            // System.out.println(LocalTime.ofSecondOfDay(getDelayTo(16, 4)));
            testTimer();
            testScheduledExecutorService();
        }
    
        private static long getDelayTo(int hour, int minute) {
            LocalDateTime currentTime = LocalDateTime.now();
            long gapToSpecified = ChronoUnit.SECONDS.between(currentTime, LocalDate.now().atTime(hour, minute));
            if (gapToSpecified < 0) { // the time already passed => do it tomorrow;
                return ChronoUnit.SECONDS.between(currentTime, LocalDate.now().plusDays(1).atTime(hour, minute));
            }
            return gapToSpecified; // not passed, do it later today at the specified time;
        }
    
        public static void testTimer() {
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    System.out.println(LocalDateTime.now());
                    System.out.println("Hello world");
                }
            }, getDelayTo(13, 0), TimeUnit.DAYS.toSeconds(1));
        }
    
        public static void testScheduledExecutorService() {
            Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(() -> {
                        System.out.println("Hello World!");
                    }, getDelayTo(13, 0), TimeUnit.DAYS.toSeconds(1), TimeUnit.SECONDS);
        }
    }
    
    公共类周期任务{
    公共静态void main(字符串…参数){
    //System.out.println(secondofday的LocalTime.of(getDelayTo(15,4));
    //System.out.println(secondofday的LocalTime.of(getDelayTo(16,4));
    testTimer();
    testScheduledExecutorService();
    }
    专用静态长getDelayTo(整数小时,整数分钟){
    LocalDateTime currentTime=LocalDateTime.now();
    long gapToSpecified=ChronoUnit.SECONDS.between(currentTime,LocalDate.now().atTime(小时,分钟));
    如果(gaptospected<0){//时间已经过去=>明天再做;
    返回ChronoUnit.SECONDS.between(currentTime,LocalDate.now().plusDays(1).atTime(小时,分钟));
    }
    return gapToSpecified;//未通过,今天晚些时候在指定时间执行;
    }
    公共静态void testTimer(){
    新建计时器()。计划(新建计时器任务()){
    @凌驾
    公开募捐{
    System.out.println(LocalDateTime.now());
    System.out.println(“你好世界”);
    }
    },getDelayTo(13,0),TimeUnit.DAYS.toSeconds(1));
    }
    公共静态void testScheduledExecutorService(){
    Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(()->{
    System.out.println(“你好,世界!”);
    },getDelayTo(13,0),TimeUnit.DAYS.toSeconds(1),TimeUnit.SECONDS);
    }
    }
    
    使用
    java.util.Timer
    并安排您的工作

    Timer.schedule(TimerTask任务、首次日期、长周期)

    ~~


    使用Spring之类的框架?如果是的话,
    @Scheduled(…)
    怎么样?这里有一个开始:你所说的特定时间是什么意思?你想每天下午1:00发送电子邮件吗?@Hearen Spring framework在这里不使用。@RoshanaPitigala是的,我想每天下午1:00发送电子邮件使用quartz来实现这一点?
    Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR_OF_DAY, 13);
    c.set(Calendar.MINUTE, 00);
    c.set(Calendar.SECOND, 00);
    
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            //Call your method here
            //setEmail(emailContent, subject);
        }
    }, c.getTime(), 86400000);
    
    //24hrs == 86400000ms