java实战-邮件发送(简单,好用)

java实战-邮件发送

前言

  1. 发送邮件功能是一个比较常用的业务需求,今天就抽空做一下总结

    在这里插入图片描述

准备工作

  1. 邮箱是要有的(生产中建议多个邮箱,随机发送)
  2. 邮箱授权码,自行百度一下

SpringBoot方式

  1. Springboot中需要引入的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-thymeleaf</artifactId>
     </dependency>	
    
  2. application.yml进行配置

spring:
  mail:
    host: smtp.163.com
    port: 25
    default-encoding: UTF-8
    properties:
      mail:
        debug: true
    username: xxxx_system@163.com
    password: XXVMHDQYJFLNFOXX
  1. templates下文件内容
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>用户邮箱验证</title>
    <style>
        body, div, p, ul, li, a {
            margin: 0;
            padding: 0;
            list-style: none;
            text-decoration: none;
        }
        body {
            height: 100%;
            width: 100%;
            background-color: #FFE7E7;
        }
        .wrap {
            width: 750px;
            height: 100%;
            margin: 0 auto;
        }

        nav {
            font-weight: 700;
            padding: 20px 10px;
            box-sizing: border-box;
            background: #f9f9f9;
        }

        .nav-title {
            text-indent:25px;
            margin: 0 0 20px;
        }

        .nav-content, .nav-end, .card-time {
            text-indent:25px;
            font-size: 15px;
            line-height: 30px;
        }

        .list ul {
            width: 100%;
            height: 36px;
            font-size: 13px;
            display: flex;
            align-items: center;
            background: #e4e4e4;
            border-radius: 8px 8px 0 0;
        }

        .list .list-ul {
            background: #fff;
            border-radius: 0;
            height: 52px;
            line-height: 52px;
            background: #f9f9f9;
        }

        .list .list-ul li {
            font-size: 12px;
        }
    </style>
</head>
<body>
<div class="wrap">
    <nav>
        <p class="nav-title">Hi, <span th:text="${nickName}"></span></p>
        <p class="nav-content">本邮件仅供邮箱验证使用,验证码为<b style="color: deepskyblue"
                th:text="${verifyCode}"></b>,有效期为5分钟,
            逾期需重新获取.</p>
        <p class="nav-end">如有任何疑问,请拨打客服电话。感谢您的使用!</p>
    </nav>
</div>
</body>
</html>

  1. 测试类
@SpringBootTest
class MailServerApplicationTests {

    @Autowired
    JavaMailSender javaMailSender;

    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 发送简单邮件
     */
    @Test
    void sendSimpleMail() {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setSubject("这是一封测试邮件"); // 主题
        message.setFrom("evaluate_system@163.com"); // 来源
        message.setTo("511250051@qq.com"); // 目的地
        message.setCc("tyvek_zhang@126.com"); // 抄送
        message.setBcc("1024043315@qq.com"); // 秘密抄送
        message.setSentDate(new Date()); // 时间
        message.setText("这是测试邮件的正文"); // 内容
        javaMailSender.send(message);
    }

    /**
     * 发送带附件邮件
     */
    @Test
    void sendAttachMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
        helper.setSubject("这是一封测试邮件");
        helper.setFrom("xxxx_system@163.com");
        helper.setTo("511250051@qq.com");
        helper.setSentDate(new Date());
        helper.setText("这是测试邮件的正文");
        helper.addAttachment("hello world.pdf",new File("F:\\mywork\\hello world.pdf"));
        javaMailSender.send(mimeMessage);
    }

    /**
     * 使用Thymeleaf发送邮件
     */
    @Test
    void sendMailWithThf() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("这是一封测试邮件");
        helper.setFrom("xxxx_system@163.com");
        helper.setTo("511250051@qq.com");
        helper.setSentDate(new Date());
        Context context = new Context();
        context.setVariable("nickName", "foo");
        context.setVariable("verifyCode", "6666");
        String process = templateEngine.process("verifyEmail.html", context);
        helper.setText(process,true);
        javaMailSender.send(mimeMessage);
    }
}

不使用SpringBoot方式

  1. 需要引入的依赖

    <!--邮箱依赖-->
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    
  2. 工具类

    public class Mail163Utils {
    
        // 发送者别名
        private static final String SENDER_NAME = "邮箱验证" ;
    
        // 发送邮箱地址
        private static final String SENDER_ADDRESS = "xxxx_system@163.com" ;
    
        // 发送邮箱的授权码
        private static final String SENDER_PWD = "CTVMHDQYJFLNFOBC" ;
    
        // 密送的邮箱地址
        private static final String PRIVATE_ADDRESS = "xxxx_system@163.com" ;
    
        /**
         * 发送邮件的环境对象
         */
        private static final Session EMAIL_SESSION = getEmailSession();
    
        /**
         * 批量发送电子邮件
         * @param emailAddressList  邮箱地址
         * @param content           邮件内容
         * @param title             邮件标题
         * @param fileList          附件
         * @throws Exception
         */
        public static void sendEmail(List<String> emailAddressList, String title, String content, List<File> fileList) throws Exception {
            MimeMessage mimeMessage = getMimeMessage(emailAddressList, title, content);
            if (!CollectionUtils.isEmpty(fileList)){
                // 处理附件
                Multipart multipart = getMultipart(fileList);
                mimeMessage.setContent(multipart);
                //  添加邮件内容
                BodyPart contentPart = new MimeBodyPart();
                contentPart.setContent(content, "text/html;charset=UTF-8");
                // 将multipart对象放入message中
                multipart.addBodyPart(contentPart);
            }
            Transport.send(mimeMessage);
        }
    
        private static MimeMessage getMimeMessage(List<String> emailAddressList, String title, String content) throws Exception {
            // 创建邮件消息
            MimeMessage message = new MimeMessage(EMAIL_SESSION);
            // 设置发件人
            message.setFrom(new InternetAddress(SENDER_ADDRESS, SENDER_NAME));
            // 设置收件人
            InternetAddress[] address = new InternetAddress[emailAddressList.size()] ;
            for (int i = 0; i < emailAddressList.size(); i++){
                address[i] = new InternetAddress(emailAddressList.get(i)) ;
            }
            message.setRecipients(Message.RecipientType.TO, address);
            // 设置密送
            message.setRecipient(Message.RecipientType.BCC, new InternetAddress(PRIVATE_ADDRESS));
            // 设置抄送
            message.setRecipients(Message.RecipientType.CC, SENDER_ADDRESS);
            // 设置邮件标题
            message.setSubject(title, "UTF-8");
            // 设置邮件的内容体
            message.setContent(content, "text/html;charset=UTF-8");
            // 设置发送时间
            message.setSentDate(new Date());
            return message;
        }
    
        private static Multipart getMultipart(List<File> fileList) {
            if (CollectionUtils.isEmpty(fileList)) {return null;}
            Multipart multipart = new MimeMultipart();
            // 添加附件的内容
            fileList.stream().parallel().forEach(file -> {
                try {
                    BodyPart attachmentBodyPart = new MimeBodyPart();
                    DataSource source = new FileDataSource(file);
                    attachmentBodyPart.setDataHandler(new DataHandler(source));
                    // MimeUtility.encodeWord可以避免文件名乱码
                    attachmentBodyPart.setFileName(MimeUtility.encodeWord(file.getName()));
                    multipart.addBodyPart(attachmentBodyPart);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            return multipart ;
        }
    
        private static Session getEmailSession(){
            // 配置发送邮件的环境属性
            Properties props = new Properties();
            //设置用户的认证方式
            props.setProperty("mail.smtp.auth", "true");
            //设置传输协议
            props.setProperty("mail.transport.protocol", "smtp");
            //设置发件人的SMTP服务器地址
            props.setProperty("mail.smtp.host", "smtp.163.com");
    
    
            // 构建授权信息,用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    return new PasswordAuthentication(SENDER_ADDRESS, SENDER_PWD);
                }
            };
            return Session.getInstance(props, authenticator);
        }
    }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值