zoukankan      html  css  js  c++  java
  • 使用JavaMail发送和接收电子邮件

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


     

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    HOJ 2930 Perfect Fill IIl 线性递推
    BZOJ 1269: [AHOI2006]文本编辑器editor Splay
    linux shell常用快捷键(转)
    【引用】Linux date命令
    linux shell if 参数(转)
    vsftpd 530 Permission denied(转)
    捕获非广播包和非发给自己主机的数据包的原理是什么 混杂模式(转)
    代理ARP(转)
    Linux和Unix系统 关系和区别详细介绍(转)
    路由表(转)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4663373.html
Copyright © 2011-2022 走看看