使用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("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发送邮件和接受邮件的更多相关文章
- 使用JavaMail发送邮件-从FTP读取图片并添加到邮件正文发送
业务分析: 最近工作需要,需要从FTP读取图片内容,添加到邮件正文发送.发送邮件正文,添加附件采用Spring的MimeMessageHelper对象来完成,添加图片也将采用MimeMessageHe ...
- 通过spring实现javamail发送邮件功能
以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂度,也能更好的契合spring理念 首先 ...
- Java Web(十二) JavaMail发送邮件
发送邮件的原理 概叙 邮件服务器: 要在 Internet 上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在 Internet 很多 提供邮件服务的厂商:sina.sohu.163 等等他们都 ...
- springboot(七)JavaMail发送邮件
JavaMail简介: JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP.POP3.IMAP,开发人员使用JavaMail编写邮件 ...
- JavaMail发送邮件
发送邮件包含的内容有: from字段 --用于指明发件人 to字段 --用于指明收件人 subject字段 --用于说明邮件主题 cc字段 -- 抄送,将邮件发送给收件人的同时抄 ...
- JavaMail发送邮件第一版
首先,我们先来了解一个基本的知识点,用什么工具来发邮件? 简单的说一下,目前用的比较多的客户端:OutLook,Foxmail等 顺便了解一下POP3.SMTP协议的区别: POP3,全名为" ...
- web应用中使用JavaMail发送邮件
现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...
- JavaMail发送邮件的笔记及Demo
最近碰到一个需求,就是注册用户时候需要向用户发送激活邮箱,于是照着网上搜来的demo自己试着运行了一下,发件时我用的是网易163邮箱,收件时用QQ邮箱,运行后报了一个错误: 网络上搜索解决方式,多次尝 ...
- web应用中使用JavaMail发送邮件 。。转载
现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...
随机推荐
- 洛古 P1373 小a和uim之大逃离
P1373 小a和uim之大逃离 题目提供者lzn 标签 动态规划 洛谷原创 难度 提高+/省选- 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电 ...
- 暑假集训(5)第一弹——— Super Jumping! Jumping! Jumping!(hdu1087)
题意概括:在上次与娑殚的三次博弈中,你们都取得了胜利.便向娑殚提出要求,借助他的力量,传送到一个安全的地方. 你们的愿望达成了,不过,你和小A似乎失散了. 街上人来人往的特别热闹,每一个人的脸上都洋溢 ...
- ubuntu 阿里云安全配置
1. 添加新用户, 加入 root 组, 赋予 sudo 权限 2. 禁用 root 3.
- winform 与 html 交互 简单案例
本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...
- hadoop 文件 复制 移动 FileUtil.copy
FileSystem fs = FileSystem.get(conf); Path pattern = new Path(resultViewPath + "phone*"); ...
- firefox 自定义快捷键
firefox 更新到44或45,发现原来的更改快捷键的扩展没了!!!
- 用PHP生成随机数的函数
转自:http://www.jbxue.com/article/5034.html 介绍:在早期的php中生成一个随机字符串时,总是先创建一个字符池,然后用一个循环和mt_rand()或rand()生 ...
- 关于B/S系统在移动端应用的一些注意的地方(不断更新)
1.不要直接把PC端的页面直接搬到移动端来用.这里举个例子:有个活动页面,在PC端和手机端的Safari里展现都好,但是当用手机APP(如手机淘宝)扫码打开后,却没法顺畅的异步获取到jsonp的信息. ...
- 父子进程间通信模型实现(popen)
0.FILE *popen(const char *command, const char *type); popen 函数相当于做了以下几件事: 1.创建一个无名管道文件 2. fork() 3.在 ...
- jdbc mysql 取数,突然取不到数据,数据库中有数据
项目用的是jdbc+mysql,局网取数据的时候,数据一切正常,但是传到服务器上以后,曾经是好的 不知道为什么,近期一传就取不到数据,发现android写的也没有问题,至少大体上没有语法问题. 跟踪后 ...