一. 为什么要学习JavaMail

为什么要学习JavaMail开发? 如今非常多WEB应用在开发时都须要集成邮件发送功能。比如:

1. 给新注冊的用户自己主动发送一封包括其注冊信息的欢迎E-Mail。

2. 给过生日的注冊会员自己主动发送一封表示祝贺的E-Mail。

3. 将站点的最新活动信息通过E-Mail发送给全部的注冊会员。

二. 邮件server和协议

1. 邮件server:

要在Internet上提供电子邮件功能,必须有专门的电子邮件server。

比如如今Internet非常多提供邮件服务的厂商:sina、sohu、163等等

他们都有自己的邮件server。

这些server类似于现实生活中的邮局。它主要负责接收用户投递过来的邮件。并把邮件投递到邮件接收者的电子邮箱中。

2. 协议:

① SMTP协议(发送邮件)

用户连上邮件server后,要想给它发送一封电子邮件。须要遵循一定的通迅规则,SMTP协议就是用于定义这样的通讯规则的。

因而。通常我们也把处理用户smtp请求(邮件发送请求)的邮件server称之为SMTPserver。(25)

② POP3协议(接受邮件)

相同。用户若想从邮件server管理的电子邮箱中接收一封电子邮件的话,他连上邮件server后,也须要遵循一定的通迅格式。

POP3协议用于定义这样的通讯格式。

因而,通常我们也把处理用户pop3请求(邮件接收请求)的邮件server称之为POP3server。(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类用于定义整个应用程序所需的环境信息,以及收集client与邮件server建立网络连接的会话信息。如邮件server的主机名、端口号、採用的邮件发送和接收协议等。Session对象依据这些信息构建用于邮件收发的Transport和Store对象,以及为client创建Message对象时提供信息支持。

四. 实战

1. 环境准备:

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

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

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

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

2. 上代码:

①. UserBean

/**
* 用户对象
*/
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;
}
}

②. 核心类: MailUtils

/**
* 邮件工具类
*/
public class MailUtils implements Runnable {
private User user; public MailUtils(User user) {
this.user = user;
} public static void sendMail(User user) throws Exception {
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "localhost"); // 邮件发送主机 // 1. 创建包括邮件server的网络连接信息的Session对象
Session session = Session.getDefaultInstance(props); // 2. 创建代表邮件内容的Message对象
Message message = createMessage(session, user); // 3. 创建Transport对象并连接server发送邮件
Transport transport = session.getTransport();
transport.connect("service", "123");
transport.sendMessage(message, message.getAllRecipients());
} private static Message createMessage(Session session, User user) throws Exception {
// 邮件内容: 文本
MimeBodyPart text = new MimeBodyPart();
text.setContent("亲爱的用户。您好,欢迎注冊了estore商城,这里会为你优质的服务。" +
"您的惬意是我们最大的动力。您的username是" + user.getUsername() +
"。password是" + user.getPassword() +
",请妥善保管! <img src='cid:welcomePic'/>", // cid为对以下图片资源的引用
"text/html;charset=utf-8"); // 邮件内容: 图片
MimeBodyPart wolcomePic = new MimeBodyPart();
wolcomePic.setDataHandler(new DataHandler(new FileDataSource("/welcome.gif")));
wolcomePic.setContentID("welcomePic"); // 邮件附件: MP3
MimeBodyPart mp3 = new MimeBodyPart();
DataHandler dataHandler = new DataHandler(new FileDataSource("/欢迎注冊.mp3"));
mp3.setDataHandler(dataHandler);
mp3.setFileName(MimeUtility.encodeText(dataHandler.getName())); // 设置附件名(解决乱码) MimeMultipart mimeMultipart1 = new MimeMultipart();
mimeMultipart1.addBodyPart(text);
mimeMultipart1.addBodyPart(wolcomePic);
mimeMultipart1.setSubType("related"); // 设置关系(related用于内嵌图片,音乐)
MimeBodyPart temp = new MimeBodyPart();
temp.setContent(mimeMultipart1); MimeMultipart mimeMultipart2 = new MimeMultipart();
mimeMultipart2.addBodyPart(temp);
mimeMultipart2.addBodyPart(mp3);
mimeMultipart2.setSubType("mixed"); // 设置关系(mixed用于携带附件) Message message = new MimeMessage(session); // 通过邮件会话构造邮件
message.setFrom(new InternetAddress("service@estore.com"));// 设置发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("zhangsan@estore.com"));// 设置收件人
message.setSubject("欢迎注冊estore商城! ");// 设置标题
message.setContent(mimeMultipart2);
message.saveChanges(); return message;
} @Override
public void run() {
try {
sendMail(user);
} catch (Exception e) {
throw new RuntimeException("对不起,出错了", e);
}
}
}

③. 接受web请求的servlet

public class RegistServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获得请求数据
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email"); User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
// 写入数据库 // 以邮件通知用户
try {
// 将发送欢迎邮件程度调用 写成单独线程
MailUtils mailUtils = new MailUtils(user);
new Thread(mailUtils).start();
} catch (Exception e) {
throw new RuntimeException(e);
}
// 提示用户注冊成功
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("用户注冊成功!已向您的邮箱发送一份注冊成功邮件,请查收! ");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}

④. 注冊界面

<%@ 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="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>注冊页面</h1>
<form action="${pageContext.request.contextPath }/regist" method="post">
用户名: <input type="text" name="username" /><br/>
密码: <input type="password" name="password" /><br/>
电子邮箱: <input type="text" name="email" /><br/>
<input type="submit" value="注冊"/>
</form>
</body>
</html>

⑤. 配置web.xml

<?

xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet>
<servlet-name>RegistServlet</servlet-name>
<servlet-class>cn.zdp.servlet.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegistServlet</servlet-name>
<url-pattern>/regist</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</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发送和接收邮件API(详解)

    一.JavaMail概述: JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供的JavaMa ...

  2. JavaMail发送和接收邮件

    一.JavaMail概述:        JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...

  3. 邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

    好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进 ...

  4. Android Java使用JavaMail API发送和接收邮件的代码示例

    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...

  5. javaMail 邮件发送和接收示例,支持正文图片、html、附件(转)

    转自:https://blog.csdn.net/star_fly4/article/details/52037587 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文 ...

  6. Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  7. (转载)JavaWeb学习总结(五十一)——邮件的发送与接收原理

    博客源地址:http://www.cnblogs.com/xdp-gacl/p/4209586.html 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电 ...

  8. JavaWeb学习总结(五十一)——邮件的发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  9. javamail 发送、读取邮件

    概述 1.邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮 ...

随机推荐

  1. phabricator在mac上的搭建(转)

    环境:OS X Yosemite 10.10.5 前提:phabricator主要是由php写的,而且是以website方式运行的,所以mac上要先安装好 php + nginx(或apache) + ...

  2. 内网穿透神器ngrok(转)

    相信做Web开发的同学们,经常会遇到需要将本地部署的Web应用能够让公网环境直接访问到的情况,例如微信应用调试.支付宝接口调试等.这个时候,一个叫ngrok的神器可能会帮到你,它提供了一个能够在公网安 ...

  3. Linux网络基础配置

    这是看itercast视频的笔记 Linux网络基础配置 以太网连接 在Linux中,以太网接口被命令为:eth0, eth1等, 0,1代表网卡编号 通过lspci命令可以查看网上硬件信息(如果是u ...

  4. jsonp和事件发布监听

    模拟jsonp var id = 0; function JSONP(url,param,cb){ var callbackName = "json_" + id++; var a ...

  5. 初步掌握Yarn的架构及原理(转)

    1.YARN 是什么? 从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看,MapReduce的 JobTracker/TaskTracker 机制需要大规模的调整来修复它在可扩展性, ...

  6. 无法引入import com.sun.management.OperatingSystemMXBean

    现象:在JDK的安装包的jre\lib\rt.jar包里确实有这个类com.sun.management.OperatingSystemMXBean,但是就是不能import  com.sun.man ...

  7. 关于java 日文输出信息到 Jenkins Console Output 乱码问题

    java 将从读取到的外部调用程序的带有日文字符的输出信息 输出到Jenkins 上的Console Output 上乱码. 现象分析: Jenkins 上可以将日文正常显示出来,但是读取外部程序的输 ...

  8. [poj 2991]Crane[线段树表示向量之和,而非数量]

    题意: 起重机的机械臂, 由n段组成, 对某一些连接点进行旋转, 询问每次操作后的末端坐标. 思路: 由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每 ...

  9. Android比较字符串是空的(isEmpty)

    通常情况下,我们需要去推断一个字符串变量是否为空,今天,我特意做了一个小测试 StringUtils.java: package com.yx.equipment_collection.utils; ...

  10. UNIX高级环境编程1

    UNIX高级环境编程1 故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详. 首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表 ...