ssm框架邮件发送功能的实现

ssm框架邮件发送功能的实现

木来 木来

首先呢,你需要有一个邮箱,QQ邮箱、163邮箱、阿里云邮箱都可以,但是我建议还是163邮箱或者是阿里云邮箱,因为比较稳定。

而QQ邮箱,之前各种无故的问题而关闭SMTP服务,实在是受够了。

然后,你需要开启SMTP服务,基本都在设置里面了。

然后发一下我之前做的微客博客网站其中的邮箱Controller代码

package weike.controller;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.http.HttpServletRequest;

import org.junit.Test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;



import weike.bean.UserCustom;



/**
 * 
* <p>Title:SendEmailController </p>
* <p>Description: 发送邮箱的控制类</p>
* <p>Company:www.inx.fun</p>
* @author  时玉龙
* @date    2017年6月18日下午6:14:28
 */
@Controller
@RequestMapping("/email")
public class SendEmailController {

    
    

     // 设置服务器
   private static String KEY_SMTP = "mail.smtp.host";
   
   //163发件服务器
   private static String VALUE_SMTP = "smtp.163.com";
 //阿里云发件服务器
//     private static String VALUE_SMTP = "smtp.aliyun.com";

   
   
    // 服务器验证
   private static String KEY_PROPS = "mail.smtp.auth";
   private static boolean VALUE_PROPS = true;
  
   // 发件人用户名、密码
   
   //163邮箱发送邮件需要的帐号和密码    我把帐号和密码都删了。
   private String SEND_USER ="15712om";
   private String SEND_UNAME ="15712com";
   private String SEND_PWD = "sh1";
   
   
   
   //阿里云发送邮箱需要的帐号和密码   我把帐号和密码都删了。
//   private String SEND_USER ="scom";
//   private String SEND_UNAME ="s8n.com";
//   private String SEND_PWD = "s98";
   

   
   // 建立会话
   private MimeMessage message;
   private Session s;
   
   //构造函数
   public  SendEmailController() {
       Properties props = System.getProperties();
       
       /*如果是用ssl的话,需要放开下面的两行代码*/
       props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
       props.put("mail.smtp.ssl.enable","true");
       /*如果是用ssl的话,需要放开上面的两行代码*/
       
       
       props.setProperty(KEY_SMTP, VALUE_SMTP);
       props.put(KEY_PROPS, "true");
       /*如果是用ssl的话,需要放开下面的两行代码*/
       props.put("mail.smtp.port", "465");
       props.put("mail.smtp.auth", "true");
       /*如果是用ssl的话,需要放开上面的两行代码*/
       
       
       s =  Session.getDefaultInstance(props, new Authenticator(){
             protected PasswordAuthentication getPasswordAuthentication() {
                 return new PasswordAuthentication(SEND_UNAME, SEND_PWD);
             }});
       s.setDebug(true);
       message = new MimeMessage(s);
   }
   
   
   /**
    * 发送邮件
    * 
    * @param headName
    *            邮件头文件名
    * @param sendHtml
    *            邮件内容
    * @param receiveUser
    *            收件人地址
    * @throws Exception 
    */
   public void doSendHtmlEmail(String headName, String sendHtml,
           String receiveUser) throws Exception {
           // 发件人
           InternetAddress from = new InternetAddress(SEND_USER,"微客总监");
           message.setFrom(from);
           // 收件人
           InternetAddress to = new InternetAddress(receiveUser);
           message.setRecipient(Message.RecipientType.TO, to);
           // 邮件标题
           message.setSubject(headName);
           String content = sendHtml.toString();
           // 邮件内容,也可以使纯文本"text/plain"
           //message.setContent(content, "text/plain;charset=UTF-8");
           message.setContent(content, "text/html;charset=UTF-8");
           message.saveChanges();
           Transport transport = s.getTransport("smtp");
           // smtp验证,就是你用来发邮件的邮箱用户名密码
           transport.connect(VALUE_SMTP, SEND_UNAME, SEND_PWD);
           // 发送
           transport.sendMessage(message, message.getAllRecipients());
           transport.close();
           System.out.println("send success!");
   }
   //邮件发送的测试方法
   @Test
   public void ceshi(){
       SendEmailController se = new SendEmailController();
       
       
//       try {
//            se.doSendHtmlEmail("微客找回密码验证码", "验证码为xxx112", "896500398@qq.com");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
       
    try {
             se.doSendHtmlEmail("微客注册验证码", "<P>您此次的邮箱验证码是224208</p><p>如果您并未发过此请求,则可能是因为其他用户误输入了您的电子邮件地址而使您收到这封邮件,那么您可以放心的忽略此邮件,无需进一步采取任何操作。</p><br/><p>中国微客用户中心</p><hr><p></p><p>除非您是收件人或负责向收件人转呈的人,本电子邮件及其附件严禁散发和复制。如果您误收此电子邮件,请删除此电子邮件及其附件并告知我们。电子邮件不是绝对安全的,因此微客不承担本电子邮件所含信息的法律责任,其中的观点和意见仅代表发出者本人,除非特别声明,否则不必然代表微客。</p>", "896500398@qq.com");
         } catch (Exception e) {
             e.printStackTrace();
         }  
   }
   
   
   //忘记密码发送邮件
   @RequestMapping(value="/sendForgetPasswordAuthCodeEmail")
   public @ResponseBody int sendForgetPasswordAuthCodeEmail(@RequestBody  UserCustom userCustom,HttpServletRequest request)throws Exception{
       int num=0;
       //需要发送的验证码
       String EmailauthCode=String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
       //发送邮件
       SendEmailController se = new SendEmailController();
       try {
            se.doSendHtmlEmail("微客找回密码验证码", "<P>您此次的邮箱验证码是"+EmailauthCode+"</p><p>如果您并未发过此请求,则可能是因为其他用户误输入了您的电子邮件地址而使您收到这封邮件,那么您可以放心的忽略此邮件,无需进一步采取任何操作。</p><br/><p>中国微客用户中心</p><hr><p></p><p>除非您是收件人或负责向收件人转呈的人,本电子邮件及其附件严禁散发和复制。如果您误收此电子邮件,请删除此电子邮件及其附件并告知我们。电子邮件不是绝对安全的,因此微客不承担本电子邮件所含信息的法律责任,其中的观点和意见仅代表发出者本人,除非特别声明,否则不必然代表微客。</p>", ""+userCustom.getUsername_()+"");
        } catch (Exception e) {
            e.printStackTrace();
        } 
       //将验证码存放到session中
       request.getSession().setAttribute("emailcode", EmailauthCode);
       num=1;
       return num;
   }
   
   
   //检验找回密码的邮箱验证码是否正确
   @RequestMapping(value="/checkeForgetPasswordVcode")
   public @ResponseBody int checkeForgetPasswordVcode(HttpServletRequest request) throws Exception{       
      //获取session中的邮箱验证码
      int num=Integer.parseInt(request.getSession().getAttribute("emailcode").toString());
      //返回邮箱验证码
       return num;
   }
   
   
   
   
   
   //设置新邮箱发送邮件
   @RequestMapping(value="/sendsetUsernameCodeEmail")
   public @ResponseBody int sendsetUsernameCodeEmail(@RequestBody  UserCustom userCustom,HttpServletRequest request)throws Exception{
       int num=0;

       
       //需要发送的验证码
       String EmailauthCode=String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
       //发送邮件
       SendEmailController se = new SendEmailController();
       try {
            se.doSendHtmlEmail("微客新邮箱验证码", "<P>您此次的邮箱验证码是"+EmailauthCode+"</p><p>如果您并未发过此请求,则可能是因为其他用户误输入了您的电子邮件地址而使您收到这封邮件,那么您可以放心的忽略此邮件,无需进一步采取任何操作。</p><br/><p>中国微客用户中心</p><hr><p></p><p>除非您是收件人或负责向收件人转呈的人,本电子邮件及其附件严禁散发和复制。如果您误收此电子邮件,请删除此电子邮件及其附件并告知我们。电子邮件不是绝对安全的,因此微客不承担本电子邮件所含信息的法律责任,其中的观点和意见仅代表发出者本人,除非特别声明,否则不必然代表微客。</p>", ""+userCustom.getUsername_()+"");
        } catch (Exception e) {
            e.printStackTrace();
        } 
       //将验证码存放到session中
       request.getSession().setAttribute("emailcode", EmailauthCode);
       num=1;
       return num;
   }
   
   
 //检验新邮箱验证码的邮箱验证码是否正确
   @RequestMapping(value="/checkenewEmailVcode")
   public @ResponseBody int checkenewEmailVcode(HttpServletRequest request) throws Exception{       
      //获取session中的邮箱验证码
      int num=Integer.parseInt(request.getSession().getAttribute("emailcode").toString());
      //返回邮箱验证码
       return num;
   }
   
   
   
}

163邮箱有个好处,就是可以设置自己的第三方密码,程序里填写自己的第三方密码即可。

为了我的隐私原因,我把账号和密码都删掉了,因为我不允许别人能登录我的邮箱发送邮件,那样的话,我的号很容易被封掉。

我用邮箱主要是发送验证码。

单独拿出这一段来说一哈。

 //忘记密码发送邮件
   @RequestMapping(value="/sendForgetPasswordAuthCodeEmail")
   public @ResponseBody int sendForgetPasswordAuthCodeEmail(@RequestBody  UserCustom userCustom,HttpServletRequest request)throws Exception{
       int num=0;
       //需要发送的验证码
       String EmailauthCode=String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
       //发送邮件
       SendEmailController se = new SendEmailController();
       try {
            se.doSendHtmlEmail("微客找回密码验证码", "<P>您此次的邮箱验证码是"+EmailauthCode+"</p><p>如果您并未发过此请求,则可能是因为其他用户误输入了您的电子邮件地址而使您收到这封邮件,那么您可以放心的忽略此邮件,无需进一步采取任何操作。</p><br/><p>中国微客用户中心</p><hr><p></p><p>除非您是收件人或负责向收件人转呈的人,本电子邮件及其附件严禁散发和复制。如果您误收此电子邮件,请删除此电子邮件及其附件并告知我们。电子邮件不是绝对安全的,因此微客不承担本电子邮件所含信息的法律责任,其中的观点和意见仅代表发出者本人,除非特别声明,否则不必然代表微客。</p>", ""+userCustom.getUsername_()+"");
        } catch (Exception e) {
            e.printStackTrace();
        } 
       //将验证码存放到session中
       request.getSession().setAttribute("emailcode", EmailauthCode);
       num=1;
       return num;
   }
   

就是将输入过来的邮箱获取到,将其发送验证码,然后随机生成的验证码放入到session中。

如果对方提交表单,就可以使用ajax或者在后台调用这个方法:

 //检验找回密码的邮箱验证码是否正确
   @RequestMapping(value="/checkeForgetPasswordVcode")
   public @ResponseBody int checkeForgetPasswordVcode(HttpServletRequest request) throws Exception{       
      //获取session中的邮箱验证码
      int num=Integer.parseInt(request.getSession().getAttribute("emailcode").toString());
      //返回邮箱验证码
       return num;
   }

来获取session中存取的验证码,进行校验是否一致。

在这里,我写代码太不严谨了,应该需要再次获取输入的邮箱值,进行匹配,如果不一致,那肯定是要抛异常的,不然的话,就修改了别人的邮箱。

假如你输入的666@qq.com  获取了验证码。

然后你将666@qq.com修改成了888@qq.com,填写了验证码。

那你就成了888@qq.com

如果用这个做找回密码功能,这是最为致命的。

1 条评论