使用JavaMail发送邮件和接受邮件

一. 为什么要学习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

/**
 * 用户对象
 */
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. 创建包含邮件服务器的网络连接信息的Session对象
		Session session = Session.getDefaultInstance(props);

		// 2. 创建代表邮件内容的Message对象
		Message message = createMessage(session, user);

		// 3. 创建Transport对象并连接服务器发送邮件
		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商城,这里会为你优质的服务," +
				        "您的满意是我们最大的动力,您的用户名是" + user.getUsername() +
				        ",密码是" + 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("[email protected]"));// 设置发件人
		message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));// 设置收件人
		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发送邮件和接受邮件,布布扣,bubuko.com

时间: 2024-12-25 17:29:13

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

Java Web(十二) JavaMail发送邮件

发送邮件的原理 概叙 邮件服务器: 要在 Internet 上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在 Internet 很多 提供邮件服务的厂商:sina.sohu.163 等等他们都有自己的邮件服务器. 这些服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投 递到邮件接收者的电子邮箱中. 邮件服务器,按照提供的服务类型,可以分为发送邮件的服务器和接收邮件的服务器. 电子邮箱: 电子邮箱(E-mail 地址)的获得需要在邮件服务器上进行申请,确切地说,电子

springboot(七)JavaMail发送邮件

JavaMail简介: JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP.POP3.IMAP,开发人员使用JavaMail编写邮件程序时,不再需要考虑底层的通讯细节如:Socket而是关注在逻辑层面.JavaMail可以发送各种复杂MIME格式的邮件内容,注意JavaMail仅支持JDK4及以上版本.虽然JavaMail是JDK的API但它并没有直接加入JDK中,所以我们需要另外添加依赖 本文目标: 将Java提供的JavaM

javamail发送邮件的简单实例(转)

javamail发送邮件的简单实例 今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码是我的全部代码,朋友们如果想用,直接复制即可. 第一个类:MailSenderInfo.java package com.util.mail;    /**    * 发送邮件需要使用的基本信息  *author by wangfun http://www.5a520.cn 小说520   */  

JavaMail发送邮件

发送邮件包含的内容有: from字段  --用于指明发件人 to字段      --用于指明收件人 subject字段  --用于说明邮件主题 cc字段     -- 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁 bcc字段   -- 密送,将邮件发送给收件人的同时将邮件秘密发送给另一个收件人,收件人无法看到邮件密送给了谁 邮件体指的就是邮件的具体内容. 使用JavaMail创建邮件和发送邮件 JavaMail创建的邮件是基于MIME协议的.因此可以使用Java

javamail发送邮件(转)

今天学习了一下JavaMail,javamail发送邮件确实是一个比较麻烦的问题.为了以后使用方便,自己写了段代码,打成jar包,以方便以后使用.呵呵 以下三段代码是我的全部代码,朋友们如果想用,直接复制即可.jar包因为我不知道怎么传到javaeye上,所以朋友们回去自己打吧. 我的代码有三个类: 第一个类:MailSenderInfo.java Java代码   package com.util.mail; /** * 发送邮件需要使用的基本信息 */ import java.util.Pr

JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp 1 <%@ page language="java" p

SSM框架+Javamail发送邮件

本博客介绍基于SSM框架(Spring4.0+SpringMVC+Mybatis)组合的Javamail应用,邮箱的话基于腾讯的QQ邮箱,其实也是Foxmail邮箱 先要了解一下SMTP协议和SSL加密 SMTP:称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效.可靠的邮件传输.SMTP是一种请求响应的协议,也就是客户机向远程服务器发送请求,服务器响应,监听端口是25,所以其工作模式有两种:发送SMTP,接收SMTP SSL加密:用来保障浏

web应用中使用JavaMail发送邮件

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Jsp页面 register.jsp 1 <%@ page language="java" p

(转载)JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

博客源地址:http://www.cnblogs.com/xdp-gacl/p/4220190.html 现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了. 一.搭建开发环境 1.1.创建Web项目 1.2.用户注册的Js