1. 程式人生 > >Quartz+JavaMail傳送郵件

Quartz+JavaMail傳送郵件

Quartz+JavaMail

第一步:在pom.xml中引入quartz和JavaMail的依賴

<!-- 引入quartz對應的依賴 -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.2.3</version>
		</dependency>
		<!-- 引入JavaMail的依賴 -->
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4</version>
		</dependency>

第二步:提供一個作業類,用於為系統管理員傳送郵件

package com.company.bos.action;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.annotation.Resource;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.company.bos.WorkbillDao;
import com.company.bos.pojo.Workbill;
/**
 * 傳送郵件的作業
 * @author zhaoqx
 *
 */
public class MailJob {
	@Resource
	private WorkbillDao workbillDao;
	private String username;//發件人的郵箱賬號
	private String password;//密碼
	private String smtpServer;//伺服器
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void execute() {
		System.out.println("要發郵件了。。。" + new Date());
		try {
			//查詢工單型別為新單的所有工單
			List<Workbill> list = workbillDao.findAll();
			if(null != list && list.size() > 0){
				final Properties mailProps = new Properties();
				mailProps.put("mail.smtp.host", this.getSmtpServer());
				mailProps.put("mail.smtp.auth", "true");
				mailProps.put("mail.username", this.getUsername());
				mailProps.put("mail.password", this.getPassword());

				// 構建授權資訊,用於進行SMTP進行身份驗證
				Authenticator authenticator = new Authenticator() {
					protected PasswordAuthentication getPasswordAuthentication() {
						// 使用者名稱、密碼
						String userName = mailProps.getProperty("mail.username");
						String password = mailProps.getProperty("mail.password");
						return new PasswordAuthentication(userName, password);
					}
				};
				// 使用環境屬性和授權資訊,建立郵件會話
				Session mailSession = Session.getInstance(mailProps, authenticator);
				for(Workbill workbill : list){
					// 建立郵件訊息
					MimeMessage message = new MimeMessage(mailSession);
					// 設定發件人
					InternetAddress from = new InternetAddress(mailProps.getProperty("mail.username"));
					message.setFrom(from);
					// 設定收件人
					InternetAddress to = new InternetAddress("
[email protected]
"); message.setRecipient(RecipientType.TO, to); // 設定郵件標題 message.setSubject("系統郵件:新單通知"); // 設定郵件的內容體 message.setContent(workbill.toString(), "text/html;charset=UTF-8"); // 傳送郵件 Transport.send(message); } } } catch (Exception ex) { ex.printStackTrace(); } } public String getSmtpServer() { return smtpServer; } public void setSmtpServer(String smtpServer) { this.smtpServer = smtpServer; } }

第三步:在spring配置檔案中配置

	<!-- 註冊自定義作業類 -->
	<bean id="myJob" class="com.company.bos.action.MailJob">
		<property name="username" value="1760077****@163.com"/>
		<property name="password" value="wu2222"/>
		<property name="smtpServer" value="smtp.163.com"/>
	</bean>
	
	<!-- 配置JobDetail -->
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<!-- 注入目標物件 -->
		<property name="targetObject" ref="myJob"/>
		<!-- 注入目標方法 -->
		<property name="targetMethod" value="execute"/>
	</bean>
	
	<!-- 配置觸發器 -->
	<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<!-- 注入任務詳情物件 -->
		<property name="jobDetail" ref="jobDetail"/>
		<!-- 注入cron表示式,通過這個表示式指定觸發的時間點 -->
		<property name="cronExpression">
			<value>0/5 * * * * ?</value>
		</property>
	</bean>
		<!-- 配置排程工廠 -->
	<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<!-- 注入觸發器 -->
		<property name="triggers">
			<list>
				<ref bean="myTrigger"/>
			</list>
		</property>
	</bean>

問題

javax.mail.AuthenticationFailedException

想要通過郵箱伺服器傳送郵件一定要通過授權,獲得授權碼才可以通過該郵箱來發送郵件。