select之发送邮件后续
三、发送邮件
5.发送带有验证码的邮件实现用户注册验证
注册步骤:
1).index.jsp:
<a href="<%=request.getContextPath()%>/jsps/manage/user/user_add.jsp">
新用户注册
</a>
2).创建一个user_add.jsp页面
3).创建UserServlet.java实现添加和发送邮件
4).新创建注册之后的成功页面:success.jsp
5).新创建验证页面:validation.jsp
代码展示
index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>发送邮件</title>
</head>
<body>
<a href="<%=request.getContextPath()%>/jsps/manage/user/user_add.jsp">
新用户注册
</a>
</body>
</html>
user_add.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新用户的注册</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/manage/user.do?method=register"
method="post" onsubmit="return checkForm()" >
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="张三"/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="text" name="password" value="11"/></td>
</tr>
<tr>
<td>邮 箱:</td>
<td><input type="text" id="ema" name="email" value="xxx(qq号即可)@qq.com"/></td>
</tr>
<tr>
<td colspan="2"><input style="float: right" type="submit" value="提交"/></td>
</tr>
</table>
</form>
</body>
</html>
UserServlet.java实现添加与发送邮件
/**
* @desc 新用户注册
* @param request
* @param response
* @throws IOException
* @throws ServletException
* @throws MessagingException
* @throws SQLException
* @throws ClassNotFoundException
*/
private void register(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, MessagingException,
ClassNotFoundException, SQLException {
//1.接收添加页面的注册信息
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String ucode = CodeUtils.createdCode();//调用注册码工具类产生注册码
//2.存值
//将该新用户的信息添加到数据库中
userService.save(username,password,email,ucode);
//发邮件:带有注册码和激活链接的邮件
EmailUtils.createMimeMessage(request,email, ucode);
//3.将注册成功的信息填入到request作用域中
request.setAttribute("message", "恭喜您,注册成功!
我们已经发了一封带了注册信息的电子邮件,请查收,如果没有收到,
可能是网络原因,过一会就收到了!!");
//4.转向到成功页面
request.getRequestDispatcher
("/jsps/manage/user/success.jsp").forward(request, response);
}
/**
* @desc 激活验证码
* @param request
* @param response
* @throws SQLException
* @throws ClassNotFoundException
* @throws IOException
* @throws ServletException
*/
private void validation(HttpServletRequest request, HttpServletResponse response)
throws ClassNotFoundException, SQLException, ServletException, IOException {
//1.接值
String ucode = request.getParameter("ucode");
//2.调用M层进行处理‘
Map<String, Object> map = userService.queryCode(ucode);
if (map==null) {
String errorMessage="验证码错误";
request.setAttribute("error", errorMessage);
request.getRequestDispatcher("/jsps/manage/user/error.jsp")
.forward(request, response);
}else {
userService.updateUstate(ucode);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
EmailUtils.java
/**
* @desc 发送带有验证码的邮件
* @param request
* @param email
* @param ucode
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static void createMimeMessage(HttpServletRequest request, String email,
String ucode) throws UnsupportedEncodingException, MessagingException {
//1.获取项目的路径
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+
":"+request.getServerPort()+path+"/";
//2.获取session
Session session = EmailUtils.getSession();
// 3. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 4. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认
//为是滥发广告以至返回失败,请修改昵称)
message.setFrom(new InternetAddress(sendEmailAccount, "发件人昵称", "UTF-8"));
// 5. To: 收件人(可以增加多个收件人、抄送、密送)
// CC:抄送人,BCC:密送
message.setRecipient(MimeMessage.RecipientType.TO,
new InternetAddress(email, "收件人昵称", "UTF-8"));
message.setRecipient(RecipientType.CC,
new InternetAddress(sendEmailAccount, "抄送给自己的", "utf-8"));
// 6. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服
//务器误认为是滥发广告以至返回失败,请修改标题)
message.setSubject("学习系统用户激活码", "UTF-8");
// 7. Content: 邮件正文
String context = "<div>激活验证码:<a href='"
+basePath+"jsps/manage/user/validation.jsp'>"
+basePath+"jsps/manage/user/validation.jsp</a>
,且验证码为:"+ucode+"</div>";
message.setContent(context, "text/html;charset=UTF-8");
//8.保存和发送邮件
saveAndSendEmail(session, message);
}
/**
* @desc 将前两步的代码封装为一个方法,目的是为了获取到session对象,进而实现发送邮件
* @return
*/
public static Session getSession() {
//1.创建参数配置,用于连接邮件服务器的参数配置
Properties props = new Properties();
props.setProperty("mail.transport.protocol","smtp");// 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host","smtp.163.com"); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
//2.根据配置创建会话对象,用于和邮件服务器交互
Session session = Session.getInstance(props);
session.setDebug(true);//设置为debug模式,可以查看详细的发送log
return session;
}
/**
* @desc 将发送邮件的第8-13步封装为一个函数
* @param session
* @param message
* @throws MessagingException
* @throws NoSuchProviderException
*/
public static void saveAndSendEmail(Session session, MimeMessage message)
throws MessagingException, NoSuchProviderException {
//8.设定发送的时间
message.setSentDate(new Date());
//9.保存设置
message.saveChanges();
//10.根据session获取邮件发送对象transport
Transport transport = session.getTransport();
//11.连接上SMTP邮件发送的服务器基站
transport.connect(sendEmailAccount,sendEmailPwd);
//12.发送邮件
transport.sendMessage(message, message.getAllRecipients());
//13.关闭连接
transport.close();
}
success.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="refresh" content='3;
url=<%=request.getContextPath()%>/index.jsp' content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type='text/javascript'>
var i=3;
function getTime(){
document.getElementById('num').innerHTML="<font color='red'>"+i+"</font>";
i-=1;
var x=setTimeout('getTime()',1000)//1000毫秒=1秒
if(i<=0){
clearTimeout(x);
}
}
window.onload=getTime;//开始执行倒计时
</script>
</head>
<body onload="getTime()">
<br>
<center>
<h2>
${message}<br>
注意!!页面将在<span id='num' style='display=inline;'>3</span>
秒后跳转至主页
</h2>
</center>
</body>
</html>
validation.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>激活验证码</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/manage/user.do?method=validation"
method="post">
<table>
<tr>
<td>验证码:</td>
<td><input type="text" name="ucode" value=""/></td>
<td><input type="submit" value="验证" /></td>
</tr>
</table>
</form>
</body>
</html>
6.发送带有图片的的邮件
代码展示
UserServlet.java
/**
* @desc 发送带图片的邮件
* @param request
* @param response
* @throws MessagingException
* @throws IOException
* @throws ServletException
*/
private void sendImage(HttpServletRequest request, HttpServletResponse response)
throws MessagingException, ServletException, IOException {
//1.接值
String receiver = request.getParameter("receiver");
String emailText = request.getParameter("emailText");
String imageUrl = request.getParameter("imageUrl");
String emailSubject = request.getParameter("emailSubject");
System.out.println("receiver:"+receiver);
System.out.println("emailText:"+emailText);
System.out.println("imageUrl:"+imageUrl);
System.out.println("emailSubject:"+emailSubject);
//2.发送带图片的邮件
EmailUtils.createMimeMessage(receiver, emailSubject, emailText,imageUrl);
//3.转向
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
EmailUtils.java
/**
* @desc 发送带有图片的邮件
* @param receiver
* @param emailSubject
* @param emailText
* @param imageUrl
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static void createMimeMessage(String receiver, String emailSubject,
String emailText, String imageUrl)
throws UnsupportedEncodingException, MessagingException {
Session session = EmailUtils.getSession();
// 3. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 4. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误
//认为是滥发广告以至返回失败,请修改昵称)
message.setFrom(new InternetAddress(sendEmailAccount, "发件人昵称", "UTF-8"));
// 5. To: 收件人(可以增加多个收件人、抄送、密送)
// CC:抄送人,BCC:密送
message.setRecipient(MimeMessage.RecipientType.TO,
new InternetAddress(receiver, "收件人昵称", "UTF-8"));
message.setRecipient(RecipientType.CC,
new InternetAddress(sendEmailAccount, "抄送给自己的", "utf-8"));
// 6. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器
//误认为是滥发广告以至返回失败,请修改标题)
message.setSubject(emailSubject, "UTF-8");
// 7. Content: 邮件正文(可以使用html标签)(
//内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
MimeBodyPart txt = new MimeBodyPart();
//要显示图片就用content不要用text
//datahandler指向的资源 要加上cid:前缀 不然不显示
txt.setContent(""+emailText+":
这是一张图片\n<img src='cid:c.png' />",
"text/html;charset=UTF-8");
MimeBodyPart img = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(imageUrl));
img.setDataHandler(dh);
img.setContentID("c.png");
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(txt);
multipart.addBodyPart(img);
multipart.setSubType("related");
message.setContent(multipart);
//8.保存和发送
saveAndSendEmail(session, message);
}
sendEmailWithImage.jsp(简单页面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>发送带有图片的email</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/manage/user.do?method=sendImage"
method="post">
<table>
<tr>
<td>收件人:</td>
<td>
<input type="text" name="receiver" value="xxx(qq号即可)@qq.com" />
</td>
</tr>
<tr>
<td>邮件主题:</td>
<td>
<input type="text" name="emailSubject" value="这是一封带有图片的邮件" />
</td>
</tr>
<tr>
<td>内容:</td>
<td>
<textarea name="emailText" rows="20" cols="70"></textarea>
</td>
</tr>
<tr>
<td>图片</td>
<td>
<input type="file" value="上传图片" name="imageUrl"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="发送" style="float:right"/>
</td>
</tr>
</table>
</form>
</body>
</html>
7.发送带有附件的邮件
代码展示
UserServlet.java
/**
* @desc 发送带附件的邮件
* @param request
* @param response
* @throws IOException
* @throws ServletException
* @throws MessagingException
*/
private void sendFile(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException, MessagingException {
//1.接值
String receiver=request.getParameter("receiver");
String emailText=request.getParameter("emailText");
String fileUrl=request.getParameter("fileUrl");
String emailSubject=request.getParameter("emailSubject");
System.out.println(" receiver:"+receiver);
System.out.println(" emailText:"+emailText);
System.out.println(" fileUrl:"+fileUrl);
System.out.println(" emailSubject:"+emailSubject);
//2.发送带有附件的邮件
EmailUtils.createMimeMessage2(receiver, emailSubject, emailText, fileUrl);
//3.转向
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
EmailUtils.java
/**
* @desc 发送带附件的邮件
* @param receiver
* @param emailSubject
* @param emailText
* @param fileUrl
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static void createMimeMessage2(String receiver, String emailSubject,
String emailText, String fileUrl) throws MessagingException,
UnsupportedEncodingException {
Session session = EmailUtils.getSession();
// 3. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 4. From: 发件人(昵称有广告嫌疑,避免被邮件服务
//器误认为是滥发广告以至返回失败,请修改昵称)
message.setFrom(new InternetAddress(sendEmailAccount, "发件人昵称", "UTF-8"));
// 5. To: 收件人(可以增加多个收件人、抄送、密送)
message.setRecipient(MimeMessage.RecipientType.TO,
new InternetAddress(receiver, "收件人昵称", "UTF-8"));
message.setRecipient(RecipientType.CC,
new InternetAddress(sendEmailAccount, "抄送给自己的", "utf-8"));
// 6. Subject: 邮件主题(标题有广告嫌疑,避免被邮
//件服务器误认为是滥发广告以至返回失败,请修改标题)
message.setSubject(emailSubject, "UTF-8");
//7.处理附件(文本+附件)
//7.1先将文本的内容加入到mimebodypart中
MimeBodyPart txt = new MimeBodyPart();
txt.setContent(emailText, "text/html;charset=UTF-8");
//7.2设定附件
MimeBodyPart attachment = new MimeBodyPart();
// 1)读取本地文件
DataHandler dh2 = new DataHandler(new FileDataSource(fileUrl));
// 2)将附件数据添加到"节点"
attachment.setDataHandler(dh2);
// 3)设置附件的文件名(需要编码)
attachment.setFileName(MimeUtility.encodeText(dh2.getName()));
// 7.3设置正文为:(文本/文本+图片)和 附件 的关
//系(合成一个大的混合"节点" / Multipart )
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(txt);
mm.addBodyPart(attachment);// 如果有多个附件,可以创建多个多次添加
mm.setSubType("mixed");// 混合关系
message.setContent(mm);
//8.保存并发送
saveAndSendEmail(session, message);
}
sendEmailWithFile.java
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>发送带有附件的email</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/manage/user.do?method=sendFile" method="post">
<table>
<tr>
<td>收件人:</td>
<td>
<input type="text" name="receiver" value="xxx(qq号即可)@qq.com" />
</td>
</tr>
<tr>
<td>邮件主题:</td>
<td>
<input type="text" name="emailSubject" value="这是一封带有附件的邮件" />
</td>
</tr>
<tr>
<td>内容:</td>
<td>
<textarea name="emailText" rows="20" cols="70"></textarea>
</td>
</tr>
<tr>
<td>给邮件添加附件</td>
<td>
<input type="file" value="上传附件" name="fileUrl"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="发送" style="float:right"/>
</td>
</tr>
</table>
</form>
</body>
</html>
8.发送带有定时提醒的生日邮件
定时器(补充)
1).定时器:顾名思义,所谓的定时器就是定时的一个“东西”
2).java中的定时器实现的手段有很多,例如JDK中自带的Timer&TimerTask,
QuartZ框架,Spring框架中的Shedule模块都是可以的.
代码展示
MyTimerTask.java
package com.rj.bd.time;
import java.util.Timer;
import java.util.TimerTask;
/**
* @desc 定时器任务类
* @author HYZ
* @time 2020年12月15日
*/
public class MyTimerTask extends TimerTask{
public Timer timer;
public int count=1;
public MyTimerTask(Timer timer){
this.timer = timer;
}
@Override
public void run() {
System.out.println("-------------执行一次------------");
count++;
if (count==3){
System.out.println("程序结束");
timer.cancel();
}
}
}
Test.java
package com.rj.bd.time;
import java.util.Timer;
/**
* @desc
* @author HYZ
* @time 2020年12月16日
*/
public class Test {
public static void main(String[] args) {
/**
* Timer类是用来执行任务的类:
* 参数: TimerTask :定时任务类,就是具体干什么
* long arg1 :1秒之后开始执行
* long arg1 :以后每次都是间隔2秒执行一回
*/
Timer timer=new Timer();
timer.schedule(new MyTimerTask(timer), 1000, 1000);
}
}
邮件发送
步骤:
1)获取生日
1.1)定时的获取:周期性的获取到快要过生日的人员的生日信息,
因为我们设定的标准是1-5天 提前发生日祝福的邮件
1.2)项目启动的时候触发定时获取,怎样触发通过监听器实现触发
2) 发送邮件
监听器MyContextListener.java
package com.rj.bd.listener;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.rj.bd.task.EmailTask;
/**
* @desc 上下文内容监听器,目的是为了配合实现定时发送生日祝福的邮件
* @author HYZ
* @time 2020年12月15日
*/
public class MyContextListener implements ServletContextListener{
//1.声明一个Timer定时器
private Timer timer = null;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
timer=new Timer();
System.out.println("定时器开启了.........");
// timer.schedule(new EmailTask( ), 1000, 24*60*60*1000);
timer.schedule(new EmailTask( ), 1000, 2000);
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
timer.cancel();
System.out.println("定时器销毁了........");
}
}
EmailTask.java
package com.rj.bd.task;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TimerTask;
import com.rj.bd.manage.IUserService;
import com.rj.bd.manage.UserServiceImpl;
import com.rj.bd.utils.DateUtils;
import com.rj.bd.utils.EmailUtils;
public class EmailTask extends TimerTask{
public IUserService userService=new UserServiceImpl();
@Override
public void run() {
try {
System.out.println("定时发送邮件。。。。。。。。");
//1.获取即将过生日的人员的生日信息
List<Map<String, Object>> list_birthday = userService.queryBirthday();
for (int i = 0; i <list_birthday.size(); i++) {
Map<String, Object> map = list_birthday.get(i);
String birthday = (String) map.get("birthday");
Date now=new Date();
SimpleDateFormat dFormat=new SimpleDateFormat("yyyy-MM-dd");
int days=DateUtils.differentDaysByMillisecond(dFormat.format(now),birthday);
System.out.println("i-----:"+(i)+"===days----:"+days);
if (days>=0 && days<=5){
String email=(String) map.get("email");
System.out.println("---birthday--->"+birthday);
System.out.println("---email--->"+email);
System.out.println("开发发送生日祝福的邮件。。。。。");
String emailSubject="生日快乐";
String emailText="xxx企业全体员工给您送上生日祝福:祝愿您生日快乐";
String imageUrl="E://JavaLanguageProgramming//"+
"EmailDemo//WebContent//images//2.jpg";
EmailUtils.createMimeMessage(email, emailSubject,
emailText, imageUrl);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}