zoukankan      html  css  js  c++  java
  • javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】(javamail API电子邮件实例)

    引言:

      JavaMail jar包下载地址:http://java.sun.com/products/javamail/downloads/index.html

      此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇  --> javamail模拟邮箱功能发送电子邮件-基础实战篇 

      上一篇章简单讲解了javamail发送邮件的基本基础和用到的几个类,并且所有初始化和发送方法都封装在一个类里面(为了代码方便演示),本章节将对各个模块进行拆分和优化,并且引入附件发送的方法

      要想邮件发送附件,就要引入两个新类  Multipart BodyPart 两类

    Multipart(报文部件容器) 实则为一个报文容器,而邮件消息  Msage 是由各个子报文 BdyPart(报文单元部件) 类组成

      由此可见所有邮件消息都可由这两类来实现,接下来的演示发送HTML(兼并了普通Text格式)内容方法是所谓的简单的模式,因为他只有正文部分,无需多个部件来组合,而附件采纳了这两类,我们可以把包涵附件的邮件拆分为两个部件来理解,即:正文(邮件内容)部件附件(邮件附加文件)两个部件。

    示例结构:

      本篇示例代码分了3类(其实可以说是2类,因为测试test类只有一个main方法来调用邮件发送方法)

    • EmailEntity  类  邮件基础父类,两个私有属性(发件地址,发件密码),继承了Authenticator自动校验类(方便自动校验) 
    • EmailServiceEnity  类   邮件服务支持类,继承邮件基础父类,并声明其他必要的私有属性,封装邮件发送方法
    • TestEmailFunction  类   邮件测试发送类,简单的main方法里面初始化一个服务支持类,并调用两个发送方法

    实例代码演示:

      **************复制此三个类可直接跑测试**************注释部分我尽可能详细讲解每个方法的作用**************

    EmailEntity  类

    package com.cplatform.movie.back.javamail;
    
    import javax.mail.Authenticator;
    import javax.mail.PasswordAuthentication;
    
    /**
     * 邮件基础实体类
     * @author liuyt
     * @date  2014-10-24 下午2:12:10
     */
    public class EmailEntity extends Authenticator {
        /**
         * 用户名(登录邮箱)
         */
        protected static String username;
        /**
         * 密码
         */
        protected static String password;
    
        /**
         * 初始化邮箱地址和密码
         * @param username 邮箱
         * @param password 密码
         */
        public EmailEntity(String username, String password) {
            EmailEntity.username = "这里填写发件箱地址";
            EmailEntity.password = "这里填写发件箱密码";
        }
    
        /**
         * 重写自我检验方法
         */
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
        
        String getPassword() {
            return password;
        }
        
        String getUsername() {
            return username;
        }
    
        public void setPassword(String password) {
            EmailEntity.password = password;
        }
    
        public void setUsername(String username) {
            EmailEntity.username = username;
        }
    }

    EmailServiceEnity 

    package com.cplatform.movie.back.javamail;
    
    import java.io.File;
    import java.io.UnsupportedEncodingException;
    import java.util.Properties;
    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.mail.BodyPart;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Multipart;
    import javax.mail.NoSuchProviderException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import com.cplatform.movie.back.javamail.SimpleEmailFunction.MyAuthenricator;
    import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
    
    /**
     * 邮件服务支持类
     * @author liuyt
     * @date  2014-10-24 下午2:11:38
     */
    public class EmailServiceEnity extends EmailEntity{
        // java.util.propertis 类
        private transient Properties props;
        // 一个邮件会话
        private transient Session session;
        // 邮件消息
        private transient MimeMessage message;
        // 邮件内容格式
        private final String CONTENT_TYPE_HTML = "text/html;charset=utf-8";
        // 端口号 
        private final static int MAIL_PORT = 25;
        // 邮箱服务器列表
        private String stmpHostPort;
        // 邮件传输对象
        private Transport transport;
        // 邮件发送内容
        private String content;
        
        /**
         * 实参构造
         * @param  mailToaddress  收件人地址,多个以逗号隔开
         * @param  content               邮件内容
         * @throws MessagingException 
         * @throws UnsupportedEncodingException 
         */
        public EmailServiceEnity(String mailToaddress, String content) throws UnsupportedEncodingException, MessagingException {
            super(username, password);
            this.content = content;
            this.session = this.initSession();
            this.message = this.initMessage(this.getSession(), mailToaddress);
            this.transport = this.initTransport(this.getSession());
        }
        
        /**
         * 根据发件人地址获取邮件服务器主机地址
         * @param username    发件人邮件地址
         * @return
         */
        public String getStmpHostP(String username) {
            return "smtp." + username.split("@")[1];
        }
        
        /**
         * 初始化perps文件
         * @return
         */
        public Properties initPrope() {
            // 初始化props文件
            props = new Properties();
            props.setProperty("mail.transport.protocol", "smtp");//发送邮件协议
            props.put("mail.smtp.auth", "true");        //需要验证
            props.put("mail.smtp.host", this.getStmpHostP(username));    //服务器地址  
            return props;
        }
        
        /**
         * 初始化session会话
         * @return
         */
        public Session initSession() {
            session = Session.getInstance(this.initPrope(),new MyAuthenricator(username, password));
            session.setDebug(true);
            return session;
        }
        
        /**
         * 初始化Message消息
         * @param session
         * @return
         * @throws MessagingException
         * @throws UnsupportedEncodingException
         */
        public MimeMessage initMessage(Session session, String mailToaddress) throws MessagingException, UnsupportedEncodingException {
            message = new MimeMessage(session);
            
            // 设置发件人地址
            message.setFrom(new InternetAddress(username, "要显示的发件人名称"));
            
            // 设置邮件主题
            message.setSubject("主题:默认主题");
            
            // 设置邮件发送内容和内容的content-type
            message.setContent(content.toString(),this.CONTENT_TYPE_HTML);
            
            // 设置邮件接收人地址
            String [] address = mailToaddress.split(",");
            for(int i=0; i<address.length; i++) {
                // addRecipient(该方法为添加收件人列表,参数一为类型:TO-收件人,CC-抄送,参数二为一个邮件地址)
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(address[i].trim()));
                // 下面方法为传递一个收件地址字符串 (二者方法任选其一即可)
                 message.addRecipients(Message.RecipientType.CC, address[i].trim());
            }
            return message;
        }
        
        /**
         * 初始化Transport
         * @param session
         * @return
         * @throws NoSuchProviderException
         */
        public Transport initTransport(Session session) throws NoSuchProviderException {
            transport = session.getTransport(); 
            return transport;
        }
        
        /**
         * 发送HTML内容邮件 (包括TEXT格式)
         * @throws MessagingException 
         */
        public void sendHtmlOrText() throws MessagingException {
            this.send();
        }
        
        /**
         * 附件发送 
         * @param file        java.io.File
         * @param fileName    附件名
         * @throws MessagingException
         * @throws UnsupportedEncodingException
         */
        public void sendFile(File file, String fileName) throws MessagingException, UnsupportedEncodingException {
            // 获得Message实例
            Message message = this.getMessage();
            
            // 创建multipart容器用来容纳bodyPart(部件)
            Multipart multipart = new MimeMultipart();
            
            /**
             * 创建一个BodyPart内容报文
             * 每个消息都有多个部分组成,每个部分是一个BodyPart报文部分,多个BodyPart部分又同时组成一个Multipart的容器
             */
            BodyPart messageBodyPart = new MimeBodyPart();
            
            // 设置该报文的内容
            messageBodyPart.setContent(this.content,this.CONTENT_TYPE_HTML);
            
            // 添加bodyPart报文部分到multiPart容器
            multipart.addBodyPart(messageBodyPart);
    
            // 创建一个附件报文
            messageBodyPart = new MimeBodyPart();
            
            // 文件源
            FileDataSource fds = new FileDataSource(file);
            
            // 设置邮件的内含附件 (设置数据源为复件)
            messageBodyPart.setDataHandler(new DataHandler(fds));
            
            // 设置附件的文件名,需进行编码,否则文件名会乱码
            messageBodyPart.setFileName(MimeUtility.encodeText(fileName));
            
            // 添加到容器
            multipart.addBodyPart(messageBodyPart);
    
            // 添加报文容器到消息实例
            message.setContent(multipart);
            
            // 发送消息
            this.send();
        }
        
        /**
         * 发送
         * 推荐使用方法一,因为方法二如果收件人为多个的话,会为每个人都打开一个Transport通道再关闭
         * 而方法一在发送过程中一直保持连接通常,所有操作完成后才关闭
         * @throws MessagingException
         */
        public void send() throws MessagingException {
            // 方法一
            this.getTransport().connect();
            this.getTransport().sendMessage(message, message.getAllRecipients());
            this.getTransport().close();
            
            // 方法二
            // Transport.send(this.getMessage());
        }
        
        /***************** 提供必要的get set方法支持  ************飘逸的分割线****************/
        public Session getSession() {
            return session;
        }
    
        public void setSession(Session session) {
            this.session = session;
        }
    
        public MimeMessage getMessage() {
            return message;
        }
    
        public void setMessage(MimeMessage message) {
            this.message = message;
        }
    
        public Properties getProps() {
            return props;
        }
    
        public  String getContentTypeHtml() {
            return CONTENT_TYPE_HTML;
        }
    
        public static int getMailPort() {
            return MAIL_PORT;
        }
    
        public String getStmpHostPort() {
            return stmpHostPort;
        }
    
        public void setStmpHostPort(String stmpHostPort) {
            this.stmpHostPort = stmpHostPort;
        }
    
        public Transport getTransport() {
            return transport;
        }
    
        public void setTransport(Transport transport) {
            this.transport = transport;
        }
    
        public void setProps(Properties props) {
            this.props = props;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
        
    }

    TestEmailFunction  类

    package com.cplatform.movie.back.javamail;
    import java.io.File;
    import java.io.UnsupportedEncodingException;
    import javax.mail.MessagingException;
    
    public class TestEmailFunction {
        public static void main(String[] args) {
            
            EmailServiceEnity e;
            // 多个收件人中间以逗号间隔
            String mailToaddress = "418874847@qq.com,12450374@qq.com";
            
            // 正文(内容)部分
            String content = "点击进入» <a href='http://www.cnblogs.com/liuyitian'>刘一天的博客</a>";
            
            try {
                e = new EmailServiceEnity(mailToaddress, content);
                e.sendHtmlOrText(); // 测试HTML文本
                /**
                 * 切勿使用同一个EmailServiceEnity实例来发送不同内容,如有需要就再初始化一个新实例(否则附件发送失败且乱码)
                 * 因为每个实例在发送完邮件后就会关闭Transport
                 */
                e = new EmailServiceEnity(mailToaddress, content);
                // 传入一个绝对位置的文件路径
                File file = new File("d:/data/adimg/20141022/09/ad_20141022094708943.jpg");
                e.sendFile(file,"测试复件.jpg"); // 测试复件发送
                
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            } catch (MessagingException e1) {
                e1.printStackTrace();
            }
        }
    }

    本章小结:

    • 对代码进行模块化,分为实体类和业务类
    • 利用继承,来共享父类的属性
    • 简单责任原则,业务类里面能拆分的功能都进行拆分,各负其责,方便调试
    • 复用性,本章体现在邮件的发送功能,真正实现发送功能的是send方法
    • 其他细节:(附件编码问题,正文格式声明,设置收件人方法【多种】)
    • 未涉及:邮件协议

    javamail API 系列篇:   

    1. javamail模拟邮箱功能发送电子邮件-基础实战篇
    2. javamail模拟邮箱功能发送电子邮件-中级实战篇【新增附件发送方法】
    3. javamail模拟邮箱功能获取邮件内容-中级实战篇【内容|附件下载方法】
    4. javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】
    5. javamail模拟邮箱功能--邮件删除-中级实战篇【邮件标记方法】

                              写作不易,难免有疏漏和错误,还请慷慨指正,觉得有帮助还请推荐哦

      ps:欢迎转载,转载请注明出处:http://www.cnblogs.com/liuyitian/p/4049402.html


                                                每天多学一点点     代码少敲一点点

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/liuyitian/p/4049402.html
Copyright © 2011-2022 走看看