In this post we’ll see a Spring email scheduling example using Quartz scheduler integration with Spring framework.
Spring Mail API is used to configure Java mail for sending email.
- Refer Sending Email Using Spring Framework Example to get more details about Spring email integration.
Spring Quartz integration facilitates the use of Quartz for job scheduling.
- Refer Spring Integration With Quartz Scheduler to get more details about Spring integration support for Quartz.
Technologies Used
- Spring 5.0.8.Release
- Java 10
- Java Mail API
- Quartz Scheduler
Maven Dependencies
You need to add following dependencies for sending mail using Quartz scheduler in Spring framework.
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>5.0.8.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring module Required for Quartz integration --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies>
Spring email scheduling example using Quartz scheduler
In this Spring email scheduling example reminder mail is sent to a set of Users everyday at the scheduled time. For scheduling the mail to be triggered at the specific time Quartz scheduler is used.
Bean class (User.java)
public class User { private String firstName; private String lastName; private String email; public User() { } public User(String firstName, String lastName, String email) { this.firstName = firstName; this.lastName = lastName; this.email = email; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
Spring email scheduling example – Quartz Job class
Quartz scheduler job that would be called at the configured time. This class uses the EmailService class for sending the email. Here a dummy list of Users is created and EmailService method is called for each user in the list once the job is triggered.
@Service public class MailReminderJob extends QuartzJobBean { private EmailService emailService; public void setEmailService(EmailService emailService) { this.emailService = emailService; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("In executeInternal"); List<User> userList = getListOfUsers(); for(User user : userList) { emailService.sendMail(user); } } // Dummy method for adding List of Users private List<User> getListOfUsers() { List<User> users = new ArrayList<User>(); users.add(new User("Jack", "Reacher", "jr@gmail.com")); users.add(new User("Remington", "Steele", "rs@gmail.com")); return users; } }
Spring email scheduling example – Mail Service class
Class used for sending the mails. This class get the mail properties like From and Subject from a properties file email.properties which is stored in the application’s classpath. MimeMessageHelper is used here so that attachment can also be sent with the email.
EmailService.java
@Service("emailService") @Configuration @PropertySource("classpath:email.properties") public class EmailService { @Autowired private Environment env; @Autowired private JavaMailSender mailSender; public void sendMail(User user) { System.out.println("In Send mail"); try{ MimeMessage message = mailSender.createMimeMessage(); // use the true flag to indicate you need a multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(env.getProperty("email.From")); // each user's email ID helper.setTo(user.getEmail()); helper.setSubject(env.getProperty("email.Subject")); helper.setText("Dear " + user.getFirstName() + " " +user.getLastName() + "\r\n" + "This is a reminder mail to go through the attached PDF."); helper.addInline("Inline image", new ClassPathResource("netjs.png")); helper.addAttachment("MyImage.png", new ClassPathResource("netjs.png")); helper.addAttachment("MyPdf.pdf", new FileSystemResource("F:\\Doc\\index.pdf")); this.mailSender.send(message); } catch (MessagingException ex) { // just printing System.out.println(ex.getMessage()); } } }
email.properties
email.To=TO@gmail.com email.From=FROM@gmail.com email.Subject=Reminder Mail
Spring email scheduling example – Scheduling Configuration
The job is configured here to run at 8 AM everyday.
CronTrigger is used here for triggering the job using the implementation CronTriggerFactoryBean provided by the Spring framework for Quartz scheduling.
Trigger is scheduled using a SchedulerFactoryBean that exposes triggers to be set as properties.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="org.netjs.service" /> <!-- Mail related configuration --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="smtp.gmail.com"/> <property name="port" value="587"/> <property name="username" value="GMAIL_USER_NAME"/> <property name="password" value="PASSWORD"/> <property name="javaMailProperties"> <props> <prop key="mail.transport.protocol">smtp</prop> <prop key="mail.smtp.auth">true</prop> <prop key="mail.smtp.starttls.enable">true</prop> <prop key="mail.debug">true</prop> </props> </property> </bean> <!-- Quartz scheduler related configuration --> <bean name="emailReminderJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="org.netjs.service.MailReminderJob"/> <property name="jobDataAsMap"> <map> <entry key="emailService" value-ref="emailService"></entry> </map> </property> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="emailReminderJob"/> <!-- run every morning at 8 AM --> <property name="cronExpression" value="0 0 8 * * ?"/> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean> </beans>
To run this example you can use the following class.
public class App { public static void main( String[] args ){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml"); } }
That's all for this topic Spring Email Scheduling Example Using Quartz Scheduler. If you have any doubt or any suggestions to make please drop a comment. Thanks!
>>>Return to Spring Tutorial Page
Related Topics
You may also like-
How to use JavaClasss instead of ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml");
ReplyDeleteYou can use this post Spring JavaConfig Example Program as reference. It is easy actually here Class is org.springframework.scheduling.quartz.JobDetailFactoryBean that means create instance of this class using new then use setters to set properties.
Delete