一. 为什么要学习JavaMail

为什么要学习JavaMail开发? 现在很多WEB应用在开发时都需要集成邮件发送功能,例如:

1. 给新注册的用户自动发送一封包含其注册信息的欢迎E-Mail。
2. 给过生日的注册会员自动发送一封表示祝贺的E-Mail。
3. 将网站的最新活动信息通过E-Mail发送给所有的注册会员。

二. 邮件服务器和协议

1. 邮件服务器:

要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等

他们都有自己的邮件服务器。这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

2. 协议:

① SMTP协议(发送邮件)

用户连上邮件服务器后,要想给它发送一封电子邮件,需要遵循一定的通迅规则,SMTP协议就是用于定义这种通讯规则的。
因而,通常我们也把处理用户smtp请求(邮件发送请求)的邮件服务器称之为SMTP服务器。(25)

② POP3协议(接受邮件)

同样,用户若想从邮件服务器管理的电子邮箱中接收一封电子邮件的话,他连上邮件服务器后,也需要遵循一定的通迅格式,

POP3协议用于定义这种通讯格式。因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件服务器称之为POP3服务器。(110)

③ MIME协议(创建邮件)

它描述了如何生成一封复杂邮件。通常我们把MIME协议描述的邮件称之为MIME邮件,MIME协议描述的数据称之为MIME消息。

三. JavaMail API

1. 邮件组织结构相关API:

MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

2. JavaMail API按其功能划分通常可分为如下三大类:
创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。 
发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。 
接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。

Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发
送和接收协议等。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息
支持。

四. 实战

1. 环境准备:

① 准备本地邮件服务器: http://download.csdn.net/detail/zdp072/7499575

下载好之后, 安装并新建两个账户: service/123 作为邮件发送方,    zhangsan/123 作为邮件接收方

② 在foxmail或outlook中配置接受邮箱

③ 准备Jar包, 代码结构图如下:

2. 上代码:

①. UserBean

  1. /**
  2. * 用户对象
  3. */
  4. public class User {
  5. private String username;
  6. private String password;
  7. private String email;
  8. public String getUsername() {
  9. return username;
  10. }
  11. public void setUsername(String username) {
  12. this.username = username;
  13. }
  14. public String getPassword() {
  15. return password;
  16. }
  17. public void setPassword(String password) {
  18. this.password = password;
  19. }
  20. public String getEmail() {
  21. return email;
  22. }
  23. public void setEmail(String email) {
  24. this.email = email;
  25. }
  26. }

②. 核心类: MailUtils

  1. /**
  2. * 邮件工具类
  3. */
  4. public class MailUtils implements Runnable {
  5. private User user;
  6. public MailUtils(User user) {
  7. this.user = user;
  8. }
  9. public static void sendMail(User user) throws Exception {
  10. Properties props = new Properties();
  11. props.setProperty("mail.transport.protocol", "smtp");
  12. props.setProperty("mail.host", "localhost"); // 邮件发送主机
  13. // 1. 创建包含邮件服务器的网络连接信息的Session对象
  14. Session session = Session.getDefaultInstance(props);
  15. // 2. 创建代表邮件内容的Message对象
  16. Message message = createMessage(session, user);
  17. // 3. 创建Transport对象并连接服务器发送邮件
  18. Transport transport = session.getTransport();
  19. transport.connect("service", "123");
  20. transport.sendMessage(message, message.getAllRecipients());
  21. }
  22. private static Message createMessage(Session session, User user) throws Exception {
  23. // 邮件内容: 文本
  24. MimeBodyPart text = new MimeBodyPart();
  25. text.setContent("亲爱的用户,您好,欢迎注册了estore商城,这里会为你优质的服务," +
  26. "您的满意是我们最大的动力,您的用户名是" + user.getUsername() +
  27. ",密码是" + user.getPassword() +
  28. ",请妥善保管!<img src='cid:welcomePic'/>", // cid为对下面图片资源的引用
  29. "text/html;charset=utf-8");
  30. // 邮件内容: 图片
  31. MimeBodyPart wolcomePic = new MimeBodyPart();
  32. wolcomePic.setDataHandler(new DataHandler(new FileDataSource("/welcome.gif")));
  33. wolcomePic.setContentID("welcomePic");
  34. // 邮件附件: MP3
  35. MimeBodyPart mp3 = new MimeBodyPart();
  36. DataHandler dataHandler = new DataHandler(new FileDataSource("/欢迎注册.mp3"));
  37. mp3.setDataHandler(dataHandler);
  38. mp3.setFileName(MimeUtility.encodeText(dataHandler.getName())); // 设置附件名(解决乱码)
  39. MimeMultipart mimeMultipart1 = new MimeMultipart();
  40. mimeMultipart1.addBodyPart(text);
  41. mimeMultipart1.addBodyPart(wolcomePic);
  42. mimeMultipart1.setSubType("related"); // 设置关系(related用于内嵌图片,音乐)
  43. MimeBodyPart temp = new MimeBodyPart();
  44. temp.setContent(mimeMultipart1);
  45. MimeMultipart mimeMultipart2 = new MimeMultipart();
  46. mimeMultipart2.addBodyPart(temp);
  47. mimeMultipart2.addBodyPart(mp3);
  48. mimeMultipart2.setSubType("mixed"); // 设置关系(mixed用于携带附件)
  49. Message message = new MimeMessage(session); // 通过邮件会话构造邮件
  50. message.setFrom(new InternetAddress("service@estore.com"));// 设置发件人
  51. message.setRecipient(Message.RecipientType.TO, new InternetAddress("zhangsan@estore.com"));// 设置收件人
  52. message.setSubject("欢迎注册estore商城!");// 设置标题
  53. message.setContent(mimeMultipart2);
  54. message.saveChanges();
  55. return message;
  56. }
  57. @Override
  58. public void run() {
  59. try {
  60. sendMail(user);
  61. } catch (Exception e) {
  62. throw new RuntimeException("对不起,出错了", e);
  63. }
  64. }
  65. }

③. 接受web请求的servlet

  1. public class RegistServlet extends HttpServlet {
  2. private static final long serialVersionUID = 1L;
  3. public void doGet(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5. // 获得请求数据
  6. request.setCharacterEncoding("utf-8");
  7. String username = request.getParameter("username");
  8. String password = request.getParameter("password");
  9. String email = request.getParameter("email");
  10. User user = new User();
  11. user.setUsername(username);
  12. user.setPassword(password);
  13. user.setEmail(email);
  14. // 写入数据库
  15. // 以邮件通知用户
  16. try {
  17. // 将发送欢迎邮件程度调用 写成单独线程
  18. MailUtils mailUtils = new MailUtils(user);
  19. new Thread(mailUtils).start();
  20. } catch (Exception e) {
  21. throw new RuntimeException(e);
  22. }
  23. // 提示用户注册成功
  24. response.setContentType("text/html;charset=utf-8");
  25. response.getWriter().println("用户注册成功!已向您的邮箱发送一份注册成功邮件,请查收!");
  26. }
  27. public void doPost(HttpServletRequest request, HttpServletResponse response)
  28. throws ServletException, IOException {
  29. doGet(request, response);
  30. }
  31. }

④. 注册界面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <h1>注册页面</h1>
  11. <form action="${pageContext.request.contextPath }/regist" method="post">
  12. 用户名: <input type="text" name="username"  /><br/>
  13. 密码: <input type="password" name="password" /><br/>
  14. 电子邮箱: <input type="text" name="email" /><br/>
  15. <input type="submit" value="注册"/>
  16. </form>
  17. </body>
  18. </html>

⑤. 配置web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <servlet>
  8. <servlet-name>RegistServlet</servlet-name>
  9. <servlet-class>cn.zdp.servlet.RegistServlet</servlet-class>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>RegistServlet</servlet-name>
  13. <url-pattern>/regist</url-pattern>
  14. </servlet-mapping>
  15. <welcome-file-list>
  16. <welcome-file>index.jsp</welcome-file>
  17. </welcome-file-list>
  18. </web-app>

⑥. 在浏览器中输入http://localhost:9999/estore/regist.jsp

接受到邮件效果图:

⑦. 源码下载: http://download.csdn.net/detail/zdp072/7500917

3. 遇到的问题:

JavaMail的java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream错误
原因: MyEclipse的javaee.jar中的mail包与JavaMail包冲突
解决: 在MyEclipse目录下,找javaee.jar包,用WinRar打开,删除里面的mail目录和activation, 在项目中然后加入mail.jar和activition.jar

使用JavaMail发送邮件和接受邮件的更多相关文章

  1. 使用JavaMail发送邮件-从FTP读取图片并添加到邮件正文发送

    业务分析: 最近工作需要,需要从FTP读取图片内容,添加到邮件正文发送.发送邮件正文,添加附件采用Spring的MimeMessageHelper对象来完成,添加图片也将采用MimeMessageHe ...

  2. 通过spring实现javamail发送邮件功能

    以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂度,也能更好的契合spring理念 首先 ...

  3. Java Web(十二) JavaMail发送邮件

    发送邮件的原理 概叙 邮件服务器: 要在 Internet 上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在 Internet 很多 提供邮件服务的厂商:sina.sohu.163 等等他们都 ...

  4. springboot(七)JavaMail发送邮件

    JavaMail简介: JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP.POP3.IMAP,开发人员使用JavaMail编写邮件 ...

  5. JavaMail发送邮件

    发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄 ...

  6. JavaMail发送邮件第一版

    首先,我们先来了解一个基本的知识点,用什么工具来发邮件? 简单的说一下,目前用的比较多的客户端:OutLook,Foxmail等 顺便了解一下POP3.SMTP协议的区别: POP3,全名为" ...

  7. web应用中使用JavaMail发送邮件

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

  8. JavaMail发送邮件的笔记及Demo

    最近碰到一个需求,就是注册用户时候需要向用户发送激活邮箱,于是照着网上搜来的demo自己试着运行了一下,发件时我用的是网易163邮箱,收件时用QQ邮箱,运行后报了一个错误: 网络上搜索解决方式,多次尝 ...

  9. web应用中使用JavaMail发送邮件 。。转载

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

随机推荐

  1. (转)Hprose与WCF在云计算平台Azure上的对决

    Windows Azure Platform是一个运行在微软数据中心的云计算平台.它包括一个云计算操作系统和一个为开发者提供的服务集合.开发人员创建的应用既可以直接在该平台 中运行,也可以使用该云计算 ...

  2. [java学习笔记]java语言基础概述之转义字符&break&continue

    1.转义字符 \t:制表符 \n:回车 \b:退格 \r:回车 \":双引号 \\:反斜线(常用于文件路径的书写中)   windows系统中回车符其实是由两个符号组成的,\r\n linu ...

  3. Android核心组件 Service

    Service: 服务 Service 是Activity系统的核心组件之一. 因此需要继承和注册 Service 是内有界面的, 适合在后台长期的执行任务. (如放歌, 检测版本跟新, 下载, 上传 ...

  4. (转)[Erlang 0080] RabbitMQ :VHost,Exchanges, Queues,Bindings and Channels

    和RabbitMQ这个项目的缘分好奇怪,很长一段时间内是只关注源代码,真的是Erlang开源项目中的典范;现在要在项目中应用RabbitMQ,从新的视角切入,全新的感觉.仿佛旧情人换了新衣,虽是熟稔却 ...

  5. Jquery get parameter value

    http://www.sitepoint.com/url-parameters-jquery/ $.urlParam('id') ==> $.urlParam = function(name){ ...

  6. 在PHP中如何使用消息列队

    /** * 消息列队服务 * @author zhou.tingze * @example * -----------------------------------Create----------- ...

  7. CentOS 6.4 中安装部署 Nutch 1.7

    1.配置SSH 自行查阅相关资料 2.安装JDK,配置Java环境 自行查阅相关资料 3.安装SVN [root@master ~]# yum install -y subversion 通过SVN签 ...

  8. php array_walk 和 array_reduce函数

    1.array_walk:将数组中的元素(键+值)依次取出传给处理的函数,函数处理完就完了,没有返回值. $arr1=array( 'name'=>'zhangsan', 'age'=>3 ...

  9. The content of element type "sqlMapConfig" is incomplete,

    The content of element type "sqlMapConfig" is incomplete, it must match "(properties? ...

  10. Linux安装oracle 10g常见问题之——OUI-25031

    OUI-25031:Some of the configuration assistants failed/cancelled. 这是安装过程中常见的错误之一. 引起此错误的原因:/etc/hosts ...