select之发送邮件后续

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();
	}	                  
         
} 	

}

连接上一篇监听器与发送邮件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值