首先攒射,我們需要準(zhǔn)備一些工作猜惋,在本地安裝郵件服務(wù)器跟客戶端
這里我安裝的是foxmail的客戶端侧漓、易游的郵件服務(wù)器
使用的發(fā)送與接收協(xié)議與市場(chǎng)上的郵箱相同缺前,分別是:
接受郵件的協(xié)議:POP3 IMAP
發(fā)送郵件的協(xié)議:SMTP
image.png
接著我們?cè)谝子蔚泥]件服務(wù)器上建立兩個(gè)新的用戶:
image.png
再在foxmail上添加這兩個(gè)用戶:
image.png
現(xiàn)在我們就可以在本地模擬手動(dòng)發(fā)送郵件了蛀醉,但是我們是要用程序代碼完成發(fā)送操作:
因?yàn)閷?shí)現(xiàn)郵件發(fā)送操作的相關(guān)接口在外部的jar包里,我們先工程里導(dǎo)入相關(guān)jar包:
image.png
再編寫(xiě)相關(guān)類文件代碼:
package com.zys.mail;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class MailUtils {
//email:郵件發(fā)給誰(shuí) subject:主題 emailMsg:郵件的內(nèi)容
public static void sendMail(String email, String subject, String emailMsg)
throws AddressException, MessagingException {
// 1.創(chuàng)建一個(gè)程序與郵件服務(wù)器會(huì)話對(duì)象 Session
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "SMTP");//發(fā)郵件的協(xié)議
props.setProperty("mail.host", "localhost");//發(fā)郵件的服務(wù)器地址
props.setProperty("mail.smtp.auth", "true");// 指定驗(yàn)證為true
// 創(chuàng)建驗(yàn)證器
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("victory@zys.com", "12345");//發(fā)郵件的賬號(hào)驗(yàn)證
}
};
Session session = Session.getInstance(props, auth);
// 2.創(chuàng)建一個(gè)Message衅码,它相當(dāng)于是郵件內(nèi)容
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("victory@zys.com")); // 設(shè)置發(fā)送者
message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 設(shè)置發(fā)送方式與接收者
message.setSubject(subject);//郵件的主題
message.setContent(emailMsg, "text/html;charset=utf-8");
// 3.創(chuàng)建 Transport用于將郵件發(fā)送
Transport.send(message);
}
}
最后在主函數(shù)中編寫(xiě)運(yùn)行代碼拯刁,就可以實(shí)現(xiàn)郵件發(fā)送了:
package com.zys.mail;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
public class SendMailTest {
public static void main(String[] args) throws AddressException, MessagingException {
MailUtils.sendMail("iverson@zys.com", "測(cè)試代碼發(fā)送郵件", "好的,現(xiàn)在我們成功實(shí)現(xiàn)通過(guò)代碼發(fā)送郵件逝段!");
}
}
案例:服務(wù)器自動(dòng)發(fā)送生日祝福
通過(guò)配置監(jiān)聽(tīng)器ServletContextListener,在服務(wù)器啟動(dòng)時(shí)就初始化
實(shí)現(xiàn)代碼如下:
package com.zys.birthday;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import com.zys.domain.User;
import com.zys.mail.MailUtils;
public class BirthdayListaner implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO 自動(dòng)生成的方法存根
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// 當(dāng)web應(yīng)用啟動(dòng) 開(kāi)啟任務(wù)調(diào)動(dòng)---功能在用戶的生日當(dāng)天發(fā)送郵件
//開(kāi)啟一個(gè)定時(shí)器
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// 為當(dāng)天生日的用戶發(fā)郵件
//1垛玻、獲得今天過(guò)生日的人
//獲得今天的日期
SimpleDateFormat format = new SimpleDateFormat("MM-dd");
String currentDate = format.format(new Date());
//根據(jù)當(dāng)前時(shí)間從數(shù)據(jù)庫(kù)中擦尋今天過(guò)生日的人
QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from user where birthday like ?";
List<User> userList = null;
try {
userList = runner.query(sql, new BeanListHandler<User>(User.class), "%"+currentDate+"%");
} catch (SQLException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
}//01-26
//2割捅、發(fā)郵件
if(userList!=null&&userList.size()>0){
for(User user : userList){
String emailMsg = "親愛(ài)的:"+user.getName()+",今天是您的生日,祝您生日快樂(lè)哦帚桩!";
try {
MailUtils.sendMail(user.getEmail(), "生日祝福", emailMsg);
System.out.println(user.getName()+"郵件發(fā)送完畢亿驾!");
} catch (AddressException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
} catch (MessagingException e) {
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
}
}
}
}
}, new Date(), 1000*60);
//實(shí)際開(kāi)發(fā)中起始時(shí)間是一個(gè)固定的時(shí)間
//實(shí)際開(kāi)發(fā)中間隔時(shí)間是1天,每天給過(guò)生日的用戶發(fā)送
}
}