首先,我们需要准备一些工作,在本地安装邮件服务器跟客户端
这里我安装的是foxmail的客户端、易游的邮件服务器
使用的发送与接收协议与市场上的邮箱相同,分别是:
接受邮件的协议:POP3 IMAP
发送邮件的协议:SMTP
image.png
接着我们在易游的邮件服务器上建立两个新的用户:
image.png
再在foxmail上添加这两个用户:
image.png
现在我们就可以在本地模拟手动发送邮件了,但是我们是要用程序代码完成发送操作:
因为实现邮件发送操作的相关接口在外部的jar包里,我们先工程里导入相关jar包:
image.png
再编写相关类文件代码:
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:邮件发给谁 subject:主题 emailMsg:邮件的内容
public static void sendMail(String email, String subject, String emailMsg)
throws AddressException, MessagingException {
// 1.创建一个程序与邮件服务器会话对象 Session
Properties 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("victory@zys.com", "12345");//发邮件的账号验证
}
};
Session session = Session.getInstance(props, auth);
// 2.创建一个Message,它相当于是邮件内容
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("victory@zys.com")); // 设置发送者
message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者
message.setSubject(subject);//邮件的主题
message.setContent(emailMsg, "text/html;charset=utf-8");
// 3.创建 Transport用于将邮件发送
Transport.send(message);
}
}
最后在主函数中编写运行代码,就可以实现邮件发送了:
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", "测试代码发送邮件", "好的,现在我们成功实现通过代码发送邮件!");
}
}
案例:服务器自动发送生日祝福
通过配置监听器ServletContextListener,在服务器启动时就初始化
实现代码如下:
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 自动生成的方法存根
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// 当web应用启动 开启任务调动---功能在用户的生日当天发送邮件
//开启一个定时器
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// 为当天生日的用户发邮件
//1、获得今天过生日的人
//获得今天的日期
SimpleDateFormat format = new SimpleDateFormat("MM-dd");
String currentDate = format.format(new Date());
//根据当前时间从数据库中擦寻今天过生日的人
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 自动生成的 catch 块
e.printStackTrace();
}//01-26
//2、发邮件
if(userList!=null&&userList.size()>0){
for(User user : userList){
String emailMsg = "亲爱的:"+user.getName()+",今天是您的生日,祝您生日快乐哦!";
try {
MailUtils.sendMail(user.getEmail(), "生日祝福", emailMsg);
System.out.println(user.getName()+"邮件发送完毕!");
} catch (AddressException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (MessagingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
}
}, new Date(), 1000*60);
//实际开发中起始时间是一个固定的时间
//实际开发中间隔时间是1天,每天给过生日的用户发送
}
}
网友评论