使用JavaMail发送邮件和接受邮件
来源:互联网 发布:美丽岛事件 知乎 编辑:程序博客网 时间:2024/04/29 18:32
一. 为什么要学习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");// 邮件附件: MP3MimeBodyPart 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;}@Overridepublic 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发送邮件和接受邮件
- Java网络编程之JavaMail发送邮件和接受邮件
- Java网络编程之JavaMail发送邮件和接受邮件
- Java网络编程之JavaMail发送邮件和接受邮件
- Java网络编程之JavaMail发送邮件和接受邮件
- Java网络编程之JavaMail发送邮件和接受邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail创建邮件和发送邮件
- 使用JavaMail发送邮件
- 使用JavaMail发送邮件
- Java学习总结8——泛型2(泛型类型擦除)
- DRP——Servlet(一)
- Spring mvc 配置事务的注意点
- 林仕鼎: 系统架构领域的一些学习材料
- 圣何塞Hadoop Summit 2014看点
- 使用JavaMail发送邮件和接受邮件
- C# 16进制与字符串、字节数组之间的转换
- Linux下查找目录下的所有文件夹以及子文件中包含某个字符串的命令
- Introduction to Probability (5) Continus random variable
- c#程序调用c++编写dll需要注意问题
- SVN服务器搭建和使用
- java编写的151个注意事项(1)
- C#时常需要调用C++DLL
- 解决谷歌google不能访问造成wordpress打开缓慢的问题