热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

如何使用JavaMail发送邮件

这篇文章主要教大家如何使用JavaMail发送邮件在web应用中,实现用户注册成功之后,将用户的注册信息以Email的形式发送到用户的注册邮箱当中,感兴趣的小伙伴们可以参考一下

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

一、搭建开发环境

1.1、创建Web项目

  

1.2、用户注册的Jsp页面

register.jsp

<%@ page language="java" pageEncoding="UTF-8"%>


 
  
 
 
 
  
    用户名:
密码:
邮箱:

1.3、消息提示页面
message.jsp

<%@ page language="java" pageEncoding="UTF-8"%>


 
  
 
 
 
    ${message}
 

二、编写处理用户注册处理程序
2.1、开发封装用户注册信息的domain
User.java

package me.gacl.domain;

public class User {
  private String username;
  private String password;
  private String email;
  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 getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
}

2.2、编写邮件发送功能

  发送邮件是一件非常耗时的事情,因此这里设计一个线程类来发送邮件

package me.gacl.web.controller;

import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import me.gacl.domain.User;

/**
* @ClassName: Sendmail
* @Description: Sendmail类继承Thread,因此Sendmail就是一个线程类,这个线程类用于给指定的用户发送Email
* @author: 孤傲苍狼
* @date: 2015-1-12 下午10:43:48
*
*/ 
public class Sendmail extends Thread {
    //用于给用户发送邮件的邮箱
  private String from = "gacl@sohu.com";
    //邮箱的用户名
  private String username = "gacl";
    //邮箱的密码
  private String password = "邮箱密码";
    //发送邮件的服务器地址
  private String host = "smtp.sohu.com";
  
  private User user;
  public Sendmail(User user){
    this.user = user;
  }
  
  /* 重写run方法的实现,在run方法中发送邮件给指定的用户
   * @see java.lang.Thread#run()
   */
  @Override
  public void run() {
    try{
      Properties prop = new Properties();
      prop.setProperty("mail.host", host);
      prop.setProperty("mail.transport.protocol", "smtp");
      prop.setProperty("mail.smtp.auth", "true");
      Session session = Session.getInstance(prop);
      session.setDebug(true);
      Transport ts = session.getTransport();
      ts.connect(host, username, password);
      Message message = createEmail(session,user);
      ts.sendMessage(message, message.getAllRecipients());
      ts.close();
    }catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
  
  /**
  * @Method: createEmail
  * @Description: 创建要发送的邮件
  * @Anthor:孤傲苍狼
  *
  * @param session
  * @param user
  * @return
  * @throws Exception
  */ 
  public Message createEmail(Session session,User user) throws Exception{
    
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));
    message.setSubject("用户注册邮件");
    
    String info = "恭喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword() + ",请妥善保管,如有问题请联系网站客服!!";
    message.setContent(info, "text/html;charset=UTF-8");
    message.saveChanges();
    return message;
  }
}

2.3、编写处理用户注册的Servlet

package me.gacl.web.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import me.gacl.domain.User;
import me.gacl.service.UserService;

public class RegisterServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    try{
      String username = request.getParameter("username");
      String password = request.getParameter("password");
      String email = request.getParameter("email");
      User user = new User();
      user.setEmail(email);
      user.setPassword(password);
      user.setUsername(username);
      
      System.out.println("把用户信息注册到数据库中");
      //用户注册成功之后就使用用户注册时的邮箱给用户发送一封Email
      //发送邮件是一件非常耗时的事情,因此这里开辟了另一个线程来专门发送邮件
      Sendmail send = new Sendmail(user);
      //启动线程,线程启动之后就会执行run方法来发送邮件
      send.start();
      
      //注册用户
      //new UserService().registerUser(user);
      request.setAttribute("message", "恭喜您,注册成功,我们已经发了一封带了注册信息的电子邮件,请查收,如果没有收到,可能是网络原因,过一会儿就收到了!!");
      request.getRequestDispatcher("/message.jsp").forward(request, response);
    }catch (Exception e) {
      e.printStackTrace();
      request.setAttribute("message", "注册失败!!");
      request.getRequestDispatcher("/message.jsp").forward(request, response);
    }
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}

程序运行效果如下:

  现在很多网站都有这样的功能,用户注册完成之后,网站根据我们注册时填写的邮箱给我们一封Email,然后点击Email中的超链接去激活我们的用户。这种功能就是这样实现的。

  在总结使用JavaMail发送邮件时发现,将邮件发送到sina或者sohu的邮箱时,不一定能够马上收取得到邮件,总是有延迟,有时甚至会延迟很长的时间,甚至会被当成垃圾邮件来处理掉,或者干脆就拒绝接收,有时候为了看到邮件发送成功的效果,要等半天,实属无奈啊。


推荐阅读
  • 本文探讨了在SharePoint环境中使用BDC(Business Data Catalog)时遇到的问题及其解决策略,包括XML文件导入SSP后的不可见性问题以及与远程SQL Server 2005连接的难题。 ... [详细]
  • 解决远程桌面连接时的身份验证错误问题
    本文介绍了如何解决在尝试远程访问服务器时遇到的身份验证错误,特别是当系统提示‘要求的函数不受支持’时的具体解决步骤。通过调整Windows注册表设置,您可以轻松解决这一常见问题。 ... [详细]
  • Git版本控制基础解析
    本文探讨了Git作为版本控制工具的基本概念及其重要性,不仅限于代码管理,还包括文件的历史记录与版本切换功能。通过对比Git与SVN,进一步阐述了分布式版本控制系统的独特优势。 ... [详细]
  • 行为设计模式:命令模式详解
    命令模式是一种行为设计模式,它通过将请求封装为对象,使得可以使用不同的请求来参数化客户端,支持请求的排队、日志记录以及提供命令的撤销和恢复功能。 ... [详细]
  • 尤洋:夸父AI系统——大规模并行训练的深度学习解决方案
    自从AlexNet等模型在计算机视觉领域取得突破以来,深度学习技术迅速发展。近年来,随着BERT等大型模型的广泛应用,AI模型的规模持续扩大,对硬件提出了更高的要求。本文介绍了新加坡国立大学尤洋教授团队开发的夸父AI系统,旨在解决大规模模型训练中的并行计算挑战。 ... [详细]
  • 本章探讨了数据类型及其操作的基本概念,深入讲解了数据抽象和抽象数据类型的重要性,以及它们如何支持面向对象的编程方式。通过实例展示了字符串复制的不同方法,并讨论了类定义对系统资源的影响。 ... [详细]
  • CSS模块化命名 ... [详细]
  • 在日常运维中,频繁地对多台Linux服务器进行用户管理是一项耗时的任务。为了提高效率,可以通过编写Expect脚本来实现远程自动化操作,从而简化这一过程。 ... [详细]
  • 本文介绍了基于Java的在线办公工作流系统的毕业设计方案,涵盖了MyBatis框架的应用、源代码分析、调试与部署流程、数据库设计以及相关论文撰写指导。 ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 探索OpenWrt中的LuCI框架
    本文深入探讨了OpenWrt系统中轻量级HTTP服务器uhttpd的工作原理及其配置,重点介绍了LuCI界面的实现机制。 ... [详细]
  • Hadoop集群搭建:实现SSH无密码登录
    本文介绍了如何在CentOS 7 64位操作系统环境下配置Hadoop集群中的SSH无密码登录,包括环境准备、用户创建、密钥生成及配置等步骤。 ... [详细]
  • 本文探讨了在不同场景下如何高效且安全地存储Token,包括使用定时器刷新、数据库存储等方法,并针对个人开发者与第三方服务平台的不同需求提供了具体建议。 ... [详细]
  • LoadRunner中的IP欺骗配置与实践
    为了确保服务器能够有效地区分不同的用户请求,避免多人使用同一IP地址造成的访问限制,可以通过配置IP欺骗来解决这一问题。本文将详细介绍IP欺骗的工作原理及其在LoadRunner中的具体配置步骤。 ... [详细]
author-avatar
遗忘的vbnv
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有