一.邮箱服务器的基本概念
邮件的客户端:可以只安装在电脑上(C/S)的也可以是网页形式(B/S)的
邮件服务器:起到邮件的接受与推送的作用
邮件发送的协议:
协议:就是数据传输的约束
接受邮件的协议:POP3 、 IMAP
发送邮件的协议:SMTP
网易邮箱服务器地址:
pop.126.com
smtp.126.com
imap.126.com
邮件发送与接收的详细过程
二,demo—做一个生日祝福定时发送
package beyond.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:邮件要发给谁(收件人)//subject:代表主题//emailMsg:邮件的内容public static void sendMail(String email, String subject,String emailMsg)throws AddressException, MessagingException {// 1.创建一个程序与邮件服务器会话对象 SessionProperties props = new Properties();props.setProperty("mail.transport.protocol", "SMTP");//发邮件的协议props.setProperty("mail.host", "localhost");//发送邮件的服务器地址props.setProperty("mail.smtp.auth", "true");// 指定验证为true// 创建验证器Authenticator auth = new Authenticator() {public PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("yan", "beyond");//发邮件的账号验证}};Session session = Session.getInstance(props, auth);// 2.创建一个Message,它相当于是邮件内容Message message = new MimeMessage(session);message.setFrom(new InternetAddress("yan@yy.com")); // 设置发送者message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者message.setSubject(subject);//设置邮件的主题// message.setText("这是一封激活邮件,请<a href='#'>点击</a>");message.setContent(emailMsg, "text/html;charset=utf-8");// 3.创建 Transport用于将邮件发送Transport.send(message);}
}
package beyond.birthday;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class DataSourceUtils {private static DataSource dataSource = new ComboPooledDataSource();private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();// 直接可以获取一个连接池public static DataSource getDataSource() {return dataSource;}public static Connection getConnection() throws SQLException{return dataSource.getConnection();}// 获取连接对象public static Connection getCurrentConnection() throws SQLException {Connection con = tl.get();if (con == null) {con = dataSource.getConnection();tl.set(con);}return con;}// 开启事务public static void startTransaction() throws SQLException {Connection con = getCurrentConnection();if (con != null) {con.setAutoCommit(false);}}// 事务回滚public static void rollback() throws SQLException {Connection con = getCurrentConnection();if (con != null) {con.rollback();}}// 提交并且 关闭资源及从ThreadLocall中释放public static void commitAndRelease() throws SQLException {Connection con = getCurrentConnection();if (con != null) {con.commit(); // 事务提交con.close();// 关闭资源tl.remove();// 从线程绑定中移除}}// 关闭资源方法public static void closeConnection() throws SQLException {Connection con = getCurrentConnection();if (con != null) {con.close();}}public static void closeStatement(Statement st) throws SQLException {if (st != null) {st.close();}}public static void closeResultSet(ResultSet rs) throws SQLException {if (rs != null) {rs.close();}}}
web.xml
<listener><listener-class>beyond.birthday.BirthdayListener</listener-class> </listener>
package beyond.birthday;public class Customer {private int id;private String username;private String password;private String realname;public int getId() {return id;}public void setId(int id) {this.id = id;}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 String getRealname() {return realname;}public void setRealname(String realname) {this.realname = realname;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}private String birthday;private String email;}
package beyond.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.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;import beyond.birthday.Customer;
import beyond.mail.MailUtils;public class BirthdayListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {//当web应用启动开启调动---功能在用户的生日当前发送邮件Timer timer = new Timer();//开启定时器,导util下的包timer.scheduleAtFixedRate(new TimerTask() {@Overridepublic void run() {//为当前生日用户发邮件//1,获得当前过生日的用户SimpleDateFormat format = new SimpleDateFormat("MM-dd");//获得当天的日期String currentDate = format.format(new Date());//currentDate----10-14QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());//根据当前的时间,从数据库查询今天过生日的用户String sql = "select * from customer where birthday like ?";//写SQL语句List<Customer> customerList = null;try {customerList = runner.query(sql, new BeanListHandler<Customer>(Customer.class),"%"+currentDate);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}//2,发邮件给当前过生日的用户if(customerList!=null&&customerList.size()>0){for(Customer c :customerList){String emailMsg = "亲爱的:" + c.getRealname() + ",生日快乐!";try {MailUtils.sendMail(c.getEmail(), "生日祝福", emailMsg);System.out.println(c.getRealname()+"邮件发送完毕");} catch (MessagingException e) {e.printStackTrace();}}}}}, new Date(),1000*30 );//1000ms*30=半分钟//实际开发中,起始时间肯定是一个固定的时间//period:间隔时间 时间开发中,间隔时间是1天(为一天会有好多人过生日,把今天过生日的人给发送生日祝福)}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stub}}