Java实现发送邮件带多个附件,可以直接用

需求:

使用JavaMail发送邮件,要求实现带多个附件功能。


下面代码可以直接使用,也可以按需优化,实现的功能如下:

  1. 自定义输出debug信息。
  2. 自定义开启SSL认证。
    *QQ邮箱会自动检测开启,也可以通过setSSLAuth(boolean SSLAuth)方法关闭。
  3. 发送内容为Html的邮件,支持携带附件,可以同时发送给多个收件人,抄送人,密送人。

代码示例

MailSender类使用Smtp协议,这意味着你需要获得发件服务器的Smtp协议服务器的host地址,可以邮件服务器官网获取。
例如,
网易邮箱:smtp.163,com
QQ邮箱:smtp.qq.com
同时,使用非官方的客户端登录邮箱,需要打开邮箱账户的smtp服务,并且获得发件服务提供商产生的授权码,这里不再过多赘述。

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.security.GeneralSecurityException;
import java.util.Properties;

/**
 * 邮件发送器
 *
 * @version 2.0
 */
public class MailSender {

    /**
     * 邮件发送地址
     */
    private String FROM;
    /**
     * 邮件发送人名
     */
    private String FROM_NAME;
    /**
     * 授权码
     */
    private String PASSWORD;
    /**
     * 邮件发送人
     */
    private String[] TO;
    /**
     * 邮件抄送人
     */
    private String[] CC;
    /**
     * 邮件密送人
     */
    private String[] BCC;
    /**
     * 邮件smtp协议host地址
     */
    private String HOST;

    /**
     * 是否开启SSL认证,QQ邮箱自动检测开启
     */
    private boolean isSSLAuth;

    /**
     * 是否输出debug,默认开启
     */
    private boolean isDebug = true;

    public void setDebug(boolean isDebug){
        this.isDebug = isDebug;
    }

    public void setSSLAuth(boolean SSLAuth) {
        isSSLAuth = SSLAuth;
    }

    private MailSender() {
    }

    /**
     * 值得注意的是,在new MailSender()对象时并不支持无参构造,也不强制设置抄送人和密送人。
     * <n>
     *
     * @param FROM      发件人地址
     * @param FROM_NAME 发件人名
     * @param TO        收件人地址
     * @param HOST      smtp协议host地址
     */
    public MailSender(String FROM, String FROM_NAME, String PASSWORD, String[] TO, String HOST) {
        this.FROM = FROM;
        this.FROM_NAME = FROM_NAME;
        this.PASSWORD = PASSWORD;
        this.TO = TO;
        this.HOST = HOST;
        checkQQMail();
    }

    /**
     * 值得注意的是,在new MailSender()对象时并不支持无参构造,也不强制设置抄送人和密送人。
     * <n>
     * 更推荐使用public MailSender(String FROM, String FROM_NAME, String PASSWORD, String[] TO, String HOST)方法构造对象,以设置发件人名
     *
     * @param FROM     发件人地址
     * @param PASSWORD 授权码
     * @param TO       收件人地址
     * @param HOST     smtp协议host地址
     */
    public MailSender(String FROM, String PASSWORD, String[] TO, String HOST) {
        this.FROM = FROM;
        this.PASSWORD = PASSWORD;
        this.TO = TO;
        this.HOST = HOST;
        checkQQMail();
    }

    /**
     * 设置抄送人
     *
     * @param CC 抄送人
     */
    public void setCC(String[] CC) {
        this.CC = CC;
    }

    /**
     * 设置密送人
     *
     * @param BCC 密送人
     */
    public void setBCC(String[] BCC) {
        this.BCC = BCC;
    }

    public void sendHtmlMail(String subject, String content) throws GeneralSecurityException, MessagingException, UnsupportedEncodingException {
        //1.保存配置信息
        Properties properties = new Properties();
        properties.put("mail.transport.protocol", "smtp");
        properties.put("mail.smtp.host", HOST);

        if (isSSLAuth) {
            //*需要SSL认证的邮箱
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
        }
        //2.建立连接
        Session session = Session.getInstance(properties);

        //输出Debug信息
        session.setDebug(this.isDebug);

        //3.创建邮件对象
        MimeMessage message = new MimeMessage(session);

        //设置发件人
        if ("".equals(FROM_NAME)) message.setFrom(FROM);
        else message.setFrom(new InternetAddress(FROM, FROM_NAME, "UTF-8"));

        //设置收件人
        StringBuilder sbTo = new StringBuilder();
        for (int i = 0;i< TO.length;i++){
            if (i== TO.length-1){
                sbTo.append(TO[i]);
            }else{
                sbTo.append(TO[i]).append(",");
            }
        }
        String to = new String(sbTo);
        InternetAddress[] internetAddressTo = InternetAddress.parse(to);
        message.setRecipients(MimeMessage.RecipientType.TO,internetAddressTo);

        //设置抄送人
        if (CC!=null){
            StringBuilder sbCC = new StringBuilder();
            for (int i = 0;i< CC.length;i++){
                if (i== CC.length-1){
                    sbTo.append(CC[i]);
                }else{
                    sbTo.append(CC[i]).append(",");
                }
            }
            String cc = new String(sbCC);
            InternetAddress[] internetAddressCC = InternetAddress.parse(cc);
            message.setRecipients(MimeMessage.RecipientType.CC,internetAddressCC);
        }

        if (BCC!=null){
            //设置密送人
            StringBuilder sbBCC = new StringBuilder();
            for (int i = 0;i< BCC.length;i++){
                if (i== BCC.length-1){
                    sbTo.append(BCC[i]);
                }else{
                    sbTo.append(BCC[i]).append(",");
                }
            }
            String bcc = new String(sbBCC);
            InternetAddress[] internetAddressBcc = InternetAddress.parse(bcc);
            message.setRecipients(MimeMessage.RecipientType.BCC,internetAddressBcc);
        }

        message.setSubject(subject, "UTF-8");
        message.setContent(content, "text/html;charset=UTF-8");
        message.saveChanges();

        //用流传送
        Transport transport = session.getTransport();
        transport.connect(FROM, PASSWORD);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }


    public void sendHtmlMailWithFiles(String subject, String content, File[] files) throws GeneralSecurityException, MessagingException, UnsupportedEncodingException {
        //1.保存配置信息
        Properties properties = new Properties();
        properties.put("mail.transport.protocol", "smtp");
        properties.put("mail.smtp.host", HOST);

        if (isSSLAuth) {
            //*需要SSL认证的邮箱
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
        }
        //2.建立连接
        Session session = Session.getInstance(properties);
        //输出Debug信息
        session.setDebug(this.isDebug);

        //3.创建邮件对象
        MimeMessage message = new MimeMessage(session);

        //设置发件人
        if ("".equals(FROM_NAME)) message.setFrom(FROM);
        else message.setFrom(new InternetAddress(FROM, FROM_NAME, "UTF-8"));

        //设置收件人
        StringBuilder sbTo = new StringBuilder();
        for (int i = 0;i< TO.length;i++){
            if (i== TO.length-1){
                sbTo.append(TO[i]);
            }else{
                sbTo.append(TO[i]).append(",");
            }
        }
        String to = new String(sbTo);
        InternetAddress[] internetAddressTo = InternetAddress.parse(to);
        message.setRecipients(MimeMessage.RecipientType.TO,internetAddressTo);

        //设置抄送人
        if (CC!=null){
            StringBuilder sbCC = new StringBuilder();
            for (int i = 0;i< CC.length;i++){
                if (i== CC.length-1){
                    sbTo.append(CC[i]);
                }else{
                    sbTo.append(CC[i]).append(",");
                }
            }
            String cc = new String(sbCC);
            InternetAddress[] internetAddressCC = InternetAddress.parse(cc);
            message.setRecipients(MimeMessage.RecipientType.CC,internetAddressCC);
        }

        if (BCC!=null){
            //设置密送人
            StringBuilder sbBCC = new StringBuilder();
            for (int i = 0;i< BCC.length;i++){
                if (i== BCC.length-1){
                    sbTo.append(BCC[i]);
                }else{
                    sbTo.append(BCC[i]).append(",");
                }
            }
            String bcc = new String(sbBCC);
            InternetAddress[] internetAddressBcc = InternetAddress.parse(bcc);
            message.setRecipients(MimeMessage.RecipientType.BCC,internetAddressBcc);
        }
        message.setSubject(subject, "UTF-8");
        Multipart multipart = new MimeMultipart();
        //邮件正文
        BodyPart contentPart = new MimeBodyPart();
        contentPart.setContent(content, "text/html;charset=utf-8");
        multipart.addBodyPart(contentPart);
        if (files.length != 0) {
            for (File attachment : files) {
                BodyPart attachmentPart = new MimeBodyPart();
                DataSource source = new FileDataSource(attachment);
                attachmentPart.setDataHandler(new DataHandler(source));
                //避免中文乱码的处理
                attachmentPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
                multipart.addBodyPart(attachmentPart);
            }
        }
        message.setContent(multipart);
        message.saveChanges();
        //用流传送
        Transport transport = session.getTransport();
        transport.connect(FROM, PASSWORD);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }


    /**
     * 检查是否是QQ邮箱
     */
    private void checkQQMail() {
        if (FROM.contains("qq.com")) {
            isSSLAuth = true;
        }
    }

}


关于password参数:不是指邮箱密码,是指smtp服务授权码。

需要添加的依赖:

JavaMail包下载链接:https://github.com/javaee/javamail/releases
可以使用library的形式将JavaMail添加到libs目录下,也可以直接在maven项目的pom.xml文件中添加依赖,如下:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.0</version>
</dependency>

Android项目中使用,添加如下依赖:

   implementation 'com.sun.mail:android-mail:1.6.7'
   implementation 'com.sun.mail:android-activation:1.6.7'

到此,Java实现发送邮件带多个附件功能基本实现。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值