JavaMail实现带附件的收发邮件

Posted 山水花草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaMail实现带附件的收发邮件相关的知识,希望对你有一定的参考价值。

一、前言

参考博客: 

http://blog.csdn.net/xietansheng/article/details/51722660

http://www.cnblogs.com/HigginCui/p/5764509.html

关于JavaMail实现带附件的收发邮件网上的例子很多,自己兴趣来了,自己也动手尝试了一番。

其中问题大部分在代码注释中,这里也就不过多描述了,直接上代码作为记录,方便以后查阅。

二、工程目录

三、工程代码

  1、Mail.java

package com.xie.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 表示邮件类,你需要设置:账户名和密码、收件人、抄送(可选)、暗送(可选)、主题、内容,以及附件(可选)
 * 
 * 在创建了Mail对象之后
 * 可以调用它的setSubject()、setContent(),设置主题和正文
 * 也可以调用setFrom()和 addToAddress(),设置发件人,和添加收件人。
 * 也可以调用addAttch()添加附件
 * 创建AttachBean:new AttachBean(new File("..."), "fileName");
 */

public class Mail {
    
    private String from; //发件人
    private StringBuilder toAddress = new StringBuilder(); //收件人
    private StringBuilder ccAddress = new StringBuilder(); //抄送
    private StringBuilder bccAddress = new StringBuilder(); //暗送
    
    private String subject;//主题
    private String content;//正文
    
    // 附件列表
    private List<AttachBean> attachList = new ArrayList<AttachBean>();
    
    public Mail() {}
    
    public Mail(String from, String to) {
        this(from, to, null, null);
    }
    
    public Mail(String from, String to, String subject, String content) {
        this.from = from;
        this.toAddress.append(to);
        this.subject = subject;
        this.content = content;
    }
    
    /**
     * 返回发件人
     * @return
     */
    public void setFrom(String from) {
        this.from = from;
    }
    
    /**
     * 返回发件人
     * @return
     */
    public String getFrom() {
        return from;
    }
    
    /**
     * 返回主题
     */
    public String getSubject() {
        return subject;
    }

    /**
     * 设置主题
     */
    public void setSubject(String subject) {
        this.subject = subject;
    }

    /**
     * 获取主题内容
     */
    public String getContent() {
        return content;
    }

    /**
     * 设置主题内容
     * @param content
     */
    public void setContent(String content) {
        this.content = content;
    }

    /**
     * 获取收件人
     * @return
     */
    public String getToAddress() {
        return toAddress.toString();
    }

    /**
     * 获取抄送
     * @return
     */
    public String getCcAddress() {
        return ccAddress.toString();
    }

    /**
     * 获取暗送
     * @return
     */
    public String getBccAddress() {
        return bccAddress.toString();
    }

    /**
     * 添加收件人,可以是多个收件人
     * @param to
     */
    public void addToAddress(String to) {
        if(this.toAddress.length() > 0) {
            this.toAddress.append(",");
        }
        this.toAddress.append(to);
    }

    /**
     * 添加抄送人,可以是多个抄送人
     * @param cc
     */
    public void addCcAddress(String cc) {
        if(this.ccAddress.length() > 0) {
            this.ccAddress.append(",");
        }
        this.ccAddress.append(cc);
    }

    /**
     * 添加暗送人,可以是多个暗送人
     * @param bcc
     */
    public void addBccAddress(String bcc) {
        if(this.bccAddress.length() > 0) {
            this.bccAddress.append(",");
        }
        this.bccAddress.append(bcc);
    }
    
    /**
     * 添加附件,可以添加多个附件
     * @param attachBean
     */
    public void addAttach(AttachBean attachBean) {
        this.attachList.add(attachBean);
    }
    
    /**
     * 获取所有附件
     * @return
     */
    public List<AttachBean> getAttachs() {
        return this.attachList;
    }
}
View Code

  2、AttachBean.java

package com.xie.util;

import java.io.File;

/**
 * 发送附件用
 */

public class AttachBean {
    
    private String cid;
    private File file;
    private String fileName;

    public AttachBean() {

    }

    public AttachBean(File file, String fileName) {
        super();
        this.file = file;
        this.fileName = fileName;
    }
    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid;
    }
    
    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    
}
View Code

  3、MailUtils.java

package com.xie.util;

import java.io.IOException;
import java.util.List;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 * 邮件工具类
 */
public class MailUtils {
    
    public static Session createSession(String host, final String username, final String password, String smtpPort) {
        Properties prop = new Properties();
        prop.setProperty("mail.host", host);        // 指定主机
        prop.setProperty("mail.smtp.auth", "true"); // 指定验证为true
        
        // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
        //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
        //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
        if(!"".equals(smtpPort) && smtpPort!=null){
            prop.setProperty("mail.smtp.port", smtpPort);
            prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            prop.setProperty("mail.smtp.socketFactory.fallback", "false");
            prop.setProperty("mail.smtp.socketFactory.port", smtpPort);
        }

        // 创建验证器
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        };
        
        // 获取session对象
        return Session.getInstance(prop, auth);
    }
    
    /**
     * 发送指定的邮件
     * 
     * @param mail
     */
    public static void send(Session session, final Mail mail) throws MessagingException,
            IOException {

        MimeMessage msg = new MimeMessage(session);// 创建邮件对象
        msg.setFrom(new InternetAddress(mail.getFrom()));// 设置发件人
        msg.addRecipients(RecipientType.TO, mail.getToAddress());// 设置收件人

        // 设置抄送
        String cc = mail.getCcAddress();
        if (!cc.isEmpty()) {
            msg.addRecipients(RecipientType.CC, cc);
        }

        // 设置暗送
        String bcc = mail.getBccAddress();
        if (!bcc.isEmpty()) {
            msg.addRecipients(RecipientType.BCC, bcc);
        }

        msg.setSubject(mail.getSubject());// 设置主题

        MimeMultipart parts = new MimeMultipart();// 创建部件集对象

        MimeBodyPart part = new MimeBodyPart();// 创建一个部件
        part.setContent(mail.getContent(), "text/html;charset=utf-8");// 设置邮件文本内容
        parts.addBodyPart(part);// 把部件添加到部件集中
        
        ///////////////////////////////////////////

        // 添加附件
        List<AttachBean> attachBeanList = mail.getAttachs();// 获取所有附件
        if (attachBeanList != null) {
            for (AttachBean attach : attachBeanList) {
                MimeBodyPart attachPart = new MimeBodyPart();// 创建一个部件
                attachPart.attachFile(attach.getFile());// 设置附件文件
                attachPart.setFileName(MimeUtility.encodeText(attach
                        .getFileName()));// 设置附件文件名
                String cid = attach.getCid();
                if(cid != null) {
                    attachPart.setContentID(cid);
                }
                parts.addBodyPart(attachPart);
            }
        }

        msg.setContent(parts);// 给邮件设置内容
        Transport.send(msg);// 发邮件
    }
}
View Code

  4、MailUtilsTest.java测试类

package com.xie.main;

import java.io.File;
import java.io.IOException;

import javax.mail.MessagingException;
import javax.mail.Session;

import org.junit.Test;

import com.xie.util.AttachBean;
import com.xie.util.Mail;
import com.xie.util.MailUtils;


/**
 * @filename MailUtilsTest.java
 * @author xiehongwei
 * @date 2017-7-19 下午4:54:32
 *
 */
public class MailUtilsTest {

    @Test
    public void sendMail() throws MessagingException, IOException{
        /**
         * 1.登录邮件服务器
         *     MailUtils.createSession(服务器地址,登录名,密码,端口);
         *     服务器地址:    发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
         *                     (网易163邮箱的 SMTP 服务器地址为: smtp.163.com)
         *     登录名:        qq号或者其他邮箱账号,不需要@后面的部分
         *     密码:        一般为授权码(PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码,并非我们邮箱登录密码,
         *                                 开启SMTP服务的时候会给我们一个授权码的)
         *     端口:        SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
         *                                        需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助, 
         *                                       QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
         *     
         * 2.创建邮件对象
         *     from:    发件人(邮箱: xxx@qq.com、xxx@163.com)
         *     to:        收件人(邮箱: xxx@qq.com、xxx@163.com)
         *     subject: 主题(随意)
         *     content: 正文(随意)
         *     
         * 3.发邮件
         *     需要第1步得到的session 以及 第2步的邮件对象
         */
     
//        Session session=MailUtils.createSession("smtp.qq.com", "aaa", "pwd", "465");
//        Mail mail=new Mail("aaa@qq.com","bbb@qq.com","测试邮件标题啊","来自qq发送的邮件内容啊");
        Session session=MailUtils.createSession("smtp.163.com", "xxx", "pwd", "");
        Mail mail=new Mail("xxx@163.com","aaa@qq.com,bbb@qq.com","测试邮件标题啊","来自163发送的邮件内容啊");
        
        // 添加附件
        AttachBean attachBean1 = new AttachBean(new File("src/com/xie/file/测试word.doc"), "测试word.doc");
        AttachBean attachBean2 = new AttachBean(new File("src/com/xie/file/atx830.png"), "atx830.png");
        mail.addAttach(attachBean1);
        mail.addAttach(attachBean2);
        
        //发送
        MailUtils.send(session, mail);
        
    }
    
}
View Code

 

以上是关于JavaMail实现带附件的收发邮件的主要内容,如果未能解决你的问题,请参考以下文章

[Java] JavaMail 发送 html 格式带附件的邮件

MailJavaMail发送带附件的邮件

[Java] JavaMail 发送带图片的 html 格式的邮件

使用JavaMail收发邮件

使用Spring发送带附件的电子邮件(站内和站外传送)

紧急求助,关于java 取domino的附件