带附件/密送/抄送的 javaMail 邮件发送 -- java_demo(两种实现方式)

话很少说,上代码--第一种,本身实现的,参考资料html

javaMail 的邮件发送包括了抄送(CC),密送(BCC)采用springBootjava

经常使用的邮件服务器名称、地址及SSL/非SSL协议端口号web

Java Mail发送邮件(带多个附件)spring

引入的依赖为apache

<!-- email -->
		<dependency>
			<groupId>com.sun.mail</groupId>
			<artifactId>javax.mail</artifactId>
			<version>1.5.4</version>
		</dependency>
@Test
    public void testEmail() throws Exception {

        /** 本身实现的 */
        MailUtil mailUtil = new MailUtil();

        List<File> attaches = new ArrayList<File>();
        File attach1 = new File("C:\\Users\\LYIHENG\\Desktop\\工做资料\\邮箱签名.docx");
        File attach2 = new File("C:\\Users\\LYIHENG\\Desktop\\工做资料\\演示文稿1.pptx");
        attaches.add(attach1);
        attaches.add(attach2);
        mailUtil.sendSSLEmailWithCC(CollUtil.newArrayList("13740548@qq.com"),CollUtil.newArrayList("8040824@qq.com"),"测试",
                "<h1>邮件来自Hutool测试</h1>",CollUtil.newArrayList("timae@163.com"),attaches);

    }
package com.fh.hr.web.provider.util;


import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;

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.IOException;
import java.util.*;

@Slf4j
@Data
@Component
//@ConfigurationProperties(prefix="mail.smtp")
//@PropertySource(value = "classpath:**/mail.properties", ignoreResourceNotFound = true)
public class MailUtil {
//    @Value("${mail.smtp.host}")
    private String host ="smtp.qiye.163.com";
//    @Value("${mail.smtp.port}")
    private String port="25";
//    @Value("${mail.smtp.SSLport}")
    private String SSLport="25";
//    @Value("${mail.smtp.starttlsEnable}")
    private String starttlsEnable="true";
//    @Value("${mail.smtp.auth}")
    private String auth="true";
//    @Value("${mail.smtp.connectiontimeout}")
    private String connectiontimeout="50000";
//    @Value("${mail.smtp.account}")
    /**本处的邮箱帐号和下面的 nickname 是同一个 */
    private String account="XXXXXXXX@XXXX.com";
//    @Value("${mail.smtp.password}")
 /**上一行邮箱的密码 */
    private String password="XXXXXXXX";
//    @Value("${mail.smtp.timeout}")
    private String timeout="5000000";

    private  Vector<String> file; // 多个附件
  private String filename; // 附件的文件名

    private String nickname ="XXXXXXXX@XXXX.com";//发送者,显示的发件人名字
    protected static Log LOGGER = LogFactory.getLog(MailUtil.class);


    /**
     *  带cc/bcc(抄送/密送)的邮件发送
     * @param listEmails 邮箱地址
     * @param cc 抄送
     * @param title 主题
     * @param content 正文
     * @param bcc 密送
     * @return
     * @throws Exception
     */
    public boolean sendSSLEmailWithCC(List<String> listEmails, List<String> cc, String title, String content ,List<String> bcc,List<File> attachments) throws Exception {
        LOGGER.info("开始发送邮件,email==>"+listEmails+",title==>"+title);
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);
        // 指定协议
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.port", SSLport);
        props.put("mail.smtp.starttls.enable", starttlsEnable);

        props.put("mail.smtp.auth", auth);
        props.put("mail.smtp.connectiontimeout", connectiontimeout);
        props.put("mail.smtp.timeout", timeout);
        props.put("mail.smtp.debug", true);
        Transport transport = null;
        Session session = Session.getDefaultInstance(props, null);
        transport = session.getTransport("smtp");
        transport.connect(host, account, password);
        MimeMessage msg = new MimeMessage(session);
        msg.setSentDate(new Date());


        InternetAddress fromAddress = new InternetAddress(account,nickname);
        msg.setFrom(fromAddress);
        InternetAddress[] toAddress = new InternetAddress[listEmails.size()];
        for(int k = 0;k<listEmails.size();k++){
            String emailAddress = listEmails.get(k);
            new InternetAddress(emailAddress);
            toAddress[k]=new InternetAddress(emailAddress);
        }
        log.debug("当前须要发送邮件的地址信息============>{}"+Arrays.deepToString(toAddress));
        msg.addRecipients(Message.RecipientType.TO, toAddress);

        //增长CC功能
        if(cc != null) {
            InternetAddress[] ccAddress = new InternetAddress[cc.size()];
            for(int k = 0;k<cc.size();k++){
                String emailAddress = cc.get(k);
                new InternetAddress(emailAddress);
                ccAddress[k]=new InternetAddress(emailAddress);
            }
            msg.addRecipients(Message.RecipientType.CC, ccAddress);
        }
        //增长BCC功能
        if(bcc != null) {
            InternetAddress[] bccAddress = new InternetAddress[bcc.size()];
            for(int k = 0;k<bcc.size();k++){
                String emailAddress = bcc.get(k);
                new InternetAddress(emailAddress);
                bccAddress[k]=new InternetAddress(emailAddress);
            }
            msg.addRecipients(Message.RecipientType.BCC, bccAddress);
        }
        //设置邮件主题
        msg.setSubject(MimeUtility.encodeText(title,MimeUtility.mimeCharset("UTF-8"), null));
        // 设置邮件格式
        msg.setContent(content, "text/html;charset=UTF-8");
        // 设置邮件发送日期
        msg.setSentDate(new Date());
     if (!CollectionUtils.isEmpty(attachments)) {
         msg = this.listFile(content, attachments, msg);
      }
        transport.sendMessage(msg, msg.getAllRecipients());
        log.info("邮件已发送");
        return true;
    }

    public MimeMessage listFile(String content, List<File> attachments, MimeMessage message) throws MessagingException, IOException {

        Multipart multipart = new MimeMultipart();
        //邮件正文
        BodyPart contentPart = new MimeBodyPart();
        contentPart.setContent(content, "text/html;charset=utf-8");
        multipart.addBodyPart(contentPart);
        //邮件附件
        if (attachments != null) {
            for (File attachment : attachments) {
                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();
        return message;
//        Transport.send(message);
    }

    public String toChinese(String text) {
        try {
            text = MimeUtility.encodeText(new String(text.getBytes(), "GB2312"), "GB2312", "B");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return text;
    }

}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------服务器

好了,一下是另一种的实现方式,首先要建立一个 mail.setting 的文件,在classpath(在标准Maven项目中为src/main/resources)的config目录下新建mail.setting文件,最小配置内容以下,在此配置下,smtp服务器和用户名都将经过from参数识别:参考---参考资料session

cn.hutool.extra.mail.MailUtil.send(CollUtil.newArrayList("13740519@qq.com"),
                CollUtil.newArrayList("8040824@qq.com"),
                CollUtil.newArrayList("timagi@163.com"),
                "测试主题",
                "<h1>邮件来自Hutool测试</h1>",
                true);
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
host = smtp.qiye.163.com
# 邮件服务器的SMTP端口,可选,默认25
port = 25
# 发件人(必须正确,不然发送失败)
from = Tihui@pa.com
# 用户名,默认为发件人邮箱前缀
user = Tihui@pa.com
# 密码(注意,某些邮箱须要为SMTP服务单独设置密码,详情查看相关帮助)
pass = Lo1313

引入的依赖为 ide

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>