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

    转载:http://blog.csdn.net/zdp072/article/details/30977213

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /** 
    2.  * 用户对象 
    3.  */  
    4. public class User {  
    5.     private String username;  
    6.     private String password;  
    7.     private String email;  
    8.   
    9.     public String getUsername() {  
    10.         return username;  
    11.     }  
    12.   
    13.     public void setUsername(String username) {  
    14.         this.username = username;  
    15.     }  
    16.   
    17.     public String getPassword() {  
    18.         return password;  
    19.     }  
    20.   
    21.     public void setPassword(String password) {  
    22.         this.password = password;  
    23.     }  
    24.   
    25.     public String getEmail() {  
    26.         return email;  
    27.     }  
    28.   
    29.     public void setEmail(String email) {  
    30.         this.email = email;  
    31.     }  
    32. }  
    ②. 核心类: MailUtils
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /** 
    2.  * 邮件工具类 
    3.  */  
    4. public class MailUtils implements Runnable {  
    5.     private User user;  
    6.   
    7.     public MailUtils(User user) {  
    8.         this.user = user;  
    9.     }  
    10.   
    11.     public static void sendMail(User user) throws Exception {  
    12.         Properties props = new Properties();  
    13.         props.setProperty("mail.transport.protocol", "smtp");  
    14.         props.setProperty("mail.host", "localhost"); // 邮件发送主机  
    15.           
    16.         // 1. 创建包含邮件服务器的网络连接信息的Session对象  
    17.         Session session = Session.getDefaultInstance(props);  
    18.   
    19.         // 2. 创建代表邮件内容的Message对象  
    20.         Message message = createMessage(session, user);  
    21.           
    22.         // 3. 创建Transport对象并连接服务器发送邮件  
    23.         Transport transport = session.getTransport();  
    24.         transport.connect("service", "123");  
    25.         transport.sendMessage(message, message.getAllRecipients());  
    26.     }  
    27.       
    28.     private static Message createMessage(Session session, User user) throws Exception {  
    29.         // 邮件内容: 文本  
    30.         MimeBodyPart text = new MimeBodyPart();  
    31.         text.setContent("亲爱的用户,您好,欢迎注册了estore商城,这里会为你优质的服务," +  
    32.                         "您的满意是我们最大的动力,您的用户名是" + user.getUsername() +   
    33.                         ",密码是" + user.getPassword() +   
    34.                         ",请妥善保管!<img src='cid:welcomePic'/>", // cid为对下面图片资源的引用  
    35.                         "text/html;charset=utf-8");  
    36.           
    37.         // 邮件内容: 图片  
    38.         MimeBodyPart wolcomePic = new MimeBodyPart();   
    39.         wolcomePic.setDataHandler(new DataHandler(new FileDataSource("/welcome.gif")));  
    40.         wolcomePic.setContentID("welcomePic");  
    41.           
    42.         // 邮件附件: MP3  
    43.         MimeBodyPart mp3 = new MimeBodyPart();  
    44.         DataHandler dataHandler = new DataHandler(new FileDataSource("/欢迎注册.mp3"));  
    45.         mp3.setDataHandler(dataHandler);  
    46.         mp3.setFileName(MimeUtility.encodeText(dataHandler.getName())); // 设置附件名(解决乱码)  
    47.   
    48.         MimeMultipart mimeMultipart1 = new MimeMultipart();  
    49.         mimeMultipart1.addBodyPart(text);  
    50.         mimeMultipart1.addBodyPart(wolcomePic);  
    51.         mimeMultipart1.setSubType("related"); // 设置关系(related用于内嵌图片,音乐)  
    52.         MimeBodyPart temp = new MimeBodyPart();  
    53.         temp.setContent(mimeMultipart1);  
    54.   
    55.         MimeMultipart mimeMultipart2 = new MimeMultipart();  
    56.         mimeMultipart2.addBodyPart(temp);  
    57.         mimeMultipart2.addBodyPart(mp3);  
    58.         mimeMultipart2.setSubType("mixed"); // 设置关系(mixed用于携带附件)  
    59.           
    60.         Message message = new MimeMessage(session); // 通过邮件会话构造邮件  
    61.         message.setFrom(new InternetAddress("service@estore.com"));// 设置发件人  
    62.         message.setRecipient(Message.RecipientType.TO, new InternetAddress("zhangsan@estore.com"));// 设置收件人  
    63.         message.setSubject("欢迎注册estore商城!");// 设置标题  
    64.         message.setContent(mimeMultipart2);  
    65.         message.saveChanges();  
    66.   
    67.         return message;  
    68.     }  
    69.   
    70.     @Override  
    71.     public void run() {  
    72.         try {  
    73.             sendMail(user);  
    74.         } catch (Exception e) {  
    75.             throw new RuntimeException("对不起,出错了", e);  
    76.         }  
    77.     }  
    78. }  
    ③. 接受web请求的servlet
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. public class RegistServlet extends HttpServlet {  
    2.   
    3.     private static final long serialVersionUID = 1L;  
    4.   
    5.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
    6.             throws ServletException, IOException {  
    7.         // 获得请求数据  
    8.         request.setCharacterEncoding("utf-8");  
    9.         String username = request.getParameter("username");  
    10.         String password = request.getParameter("password");  
    11.         String email = request.getParameter("email");  
    12.   
    13.         User user = new User();  
    14.         user.setUsername(username);  
    15.         user.setPassword(password);  
    16.         user.setEmail(email);  
    17.         // 写入数据库  
    18.   
    19.         // 以邮件通知用户  
    20.         try {  
    21.             // 将发送欢迎邮件程度调用 写成单独线程  
    22.             MailUtils mailUtils = new MailUtils(user);  
    23.             new Thread(mailUtils).start();  
    24.         } catch (Exception e) {  
    25.             throw new RuntimeException(e);  
    26.         }  
    27.         // 提示用户注册成功  
    28.         response.setContentType("text/html;charset=utf-8");  
    29.         response.getWriter().println("用户注册成功!已向您的邮箱发送一份注册成功邮件,请查收!");  
    30.     }  
    31.   
    32.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    33.             throws ServletException, IOException {  
    34.         doGet(request, response);  
    35.     }  
    36. }  
    ④. 注册界面
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
    2.     pageEncoding="UTF-8"%>  
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    4. <html>  
    5. <head>  
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    7. <title>Insert title here</title>  
    8. </head>  
    9. <body>  
    10. <h1>注册页面</h1>  
    11. <form action="${pageContext.request.contextPath }/regist" method="post">  
    12.     用户名: <input type="text" name="username"  /><br/>  
    13.     密码: <input type="password" name="password" /><br/>  
    14.     电子邮箱: <input type="text" name="email" /><br/>  
    15.     <input type="submit" value="注册"/>  
    16. </form>  
    17. </body>  
    18. </html>  
    ⑤. 配置web.xml
    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7.   
    8.   <servlet>  
    9.     <servlet-name>RegistServlet</servlet-name>  
    10.     <servlet-class>cn.zdp.servlet.RegistServlet</servlet-class>  
    11.   </servlet>  
    12.     <servlet-mapping>  
    13.     <servlet-name>RegistServlet</servlet-name>  
    14.     <url-pattern>/regist</url-pattern>  
    15.   </servlet-mapping>  
    16.   <welcome-file-list>  
    17.     <welcome-file>index.jsp</welcome-file>  
    18.   </welcome-file-list>  
    19. </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

  • 相关阅读:
    kvm虚拟化
    kvm虚拟机管理
    认识佛教
    【书籍推荐】《自我观察:第四道入门手册》爱自己
    [推荐] 自我观察的四个基本原则
    只要你真会念,念到不起心、不动念、不分别、不执着,六根接触六尘境界就是修行
    胡小林老师最新答问(全两集)2017年3月9日发布
    蔡礼旭老师:如何经营幸福生活(武汉万人论坛)
    新视频】蔡礼旭老师:学圣贤教诲 改人生命运(2013年北京论坛)附下载
    【论坛先河,载入史册】陈大惠、钟茂森、胡小林、蔡礼旭、彭鑫老师同台答问(全三集)
  • 原文地址:https://www.cnblogs.com/wenlj/p/4630270.html
Copyright © 2011-2022 走看看