一、电子邮件
1、邮件服务器:
要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。
这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器我接收邮件的服务器。
2、电子邮箱:
电子邮箱(E-mail地址)的获得需要在邮件服务器上进行申请 ,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个帐户。用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个帐号分配一定的空间,用户从而可以使用这个帐号以及空间,发送电子邮件和保存别人发送过来的电子邮件。
二、邮件协议
1、SMTP协议-发邮件协议
全称为Simple Mail Transfer Protocol(简单邮件传输协议),它定义了邮件客户端软件与SMTP服务器之间、以及两台SMTP服务器之间的通讯规则。端口号:25.
2、POP3协议-收邮件协议 pop imap
全称为Post Office Protocol(邮局协议),它定义了邮件客户端软件与POP3服务器的通讯规则。端口号:110.
三、邮件发送流程
四、使用 JavaMail 发送邮件
1、创建工程,导入 jar 包
2、创建测试类
package cn.itcast.testemail;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
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;
public class TestEmail {
public static void main(String[] args) throws Exception {
// 0.1 服务器的设置
Properties props = new Properties();
// props.setProperty("mail.host", "smtp.163.com");
// props.setProperty("mail.smtp.auth", "true");
// 0.2 账号和密码
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 126账号和密码(模拟账号,需要自己注册)
// return new PasswordAuthentication("itcast", "123456");
// 如果是张三给李四发送邮件,以下的参数代表的是张三的邮箱的账户和密码
return new PasswordAuthentication("admin@wingzhe.com", "admin");
}
};
// 1 与126服务器建立连接:Session
Session session = Session.getDefaultInstance(props, authenticator);
// 2 编写邮件:Message
Message message = new MimeMessage(session);
// 2.1 发件人(模拟账号)
// message.setFrom(new InternetAddress("itcast@126.com"));
message.setFrom(new InternetAddress("admin@wingzhe.com"));
// 2.2 收件人 , to:收件人 , cc :抄送,bcc:暗送(密送)。(模拟账号)
message.setRecipient(RecipientType.TO, new InternetAddress("itcast@wingzhe.com"));
// 2.3 主题
message.setSubject("这是我们得第一份邮件");
// 2.4 内容
message.setContent("哈哈,您到我的商城注册了。", "text/html;charset=UTF-8");
// 3 将消息进行发送:Transport
Transport.send(message);
System.out.println("OK");
}
}
五、定时任务
package cn.itcast.testTimer;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimter {
public static void main(String[] args) {
// 创建一个timer对象
Timer timer = new Timer();
// 创建MyTask对象
MyTask mt = new MyTask();
timer.schedule(mt, 3000);
}
}
class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("OKOKOK");
}
}
package cn.itcast.testTimer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimter02 {
public static void main(String[] args) {
// 创建一个timer对象
Timer timer = new Timer();
System.out.println(new Date().toLocaleString());
// 3秒之后做一个任务
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("OKOKOK");
System.out.println(new Date().toLocaleString());
}
}, 3000);
}
}
package cn.itcast.testTimer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TestTimter03 {
public static void main(String[] args) {
// 创建一个timer对象
Timer timer = new Timer();
System.out.println(new Date().toLocaleString());
// 5秒之后每隔三秒做一次任务
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("timer:" + new Date().toLocaleString());
}
}, 5000, 3000);
}
}
六、定时发送生日祝福邮件的案例
1、案例分析
2、编写 Listener 代码
package cn.itcast.day37anli.listener;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import cn.itcast.day37anli.domain.User;
import cn.itcast.day37anli.service.UserService;
import cn.itcast.day37anli.utils.EmailUtils;
public class SendEmailListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
// 从明天早上7点开始,每隔24小时做一次任务,任务:将每天过生日的用户的邮箱账户从仓库中获取到,为这些账户依次发送生日祝福邮件
// 创建工具类,定时任务
Timer tm = new Timer();
// 从5秒之后,每隔10秒执行一次任务
tm.schedule(new TimerTask() {
@Override
public void run() {
// 调用业务层功能:将每天过生日的用户的邮箱账户从仓库中获取到
UserService UserService = new UserService();
try {
List<User> list = UserService.findUsers();
for (User user : list) {
// 为每个用户发送邮件
EmailUtils.sendEmail(user.getEmail());
}
System.out.println("OK");
} catch (Exception e) {
e.printStackTrace();
}
}
}, 5000, 60 * 60 * 24 * 1000);
}
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}
3、EamilUtil代码
package cn.itcast.day37anli.utils;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
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;
public class EmailUtils {
public static void sendEmail(String usermail) throws Exception {
// 0.1 服务器的设置
Properties props = new Properties();
// props.setProperty("mail.host", "smtp.126.com");
// props.setProperty("mail.smtp.auth", "true");
// 0.2 账号和密码
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 126账号和密码(模拟账号,需要自己注册)
// return new PasswordAuthentication("itcast", "123456");
return new PasswordAuthentication("admin@store.com", "admin");
}
};
// 1 与126服务器建立连接:Session
Session session = Session.getDefaultInstance(props, authenticator);
// 2 编写邮件:Message
Message message = new MimeMessage(session);
// 2.1 发件人(模拟账号)
// message.setFrom(new InternetAddress("itcast@126.com"));
message.setFrom(new InternetAddress("admin@store.com"));
// 2.2 收件人 , to:收件人 , cc :抄送,bcc:暗送(密送)。(模拟账号)
message.setRecipient(RecipientType.TO, new InternetAddress(usermail));
// 2.3 主题
message.setSubject("生日快乐");
// 2.4 内容
message.setContent("哈哈,恭喜你,又老了一岁!", "text/html;charset=UTF-8");
// 3 将消息进行发送:Transport
Transport.send(message);
}
}