Spring mail邮件

邮件概述

一共三种协议:

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
  • POP3:用于接收电子邮件的标准协议;
  • IMAP:互联网消息协议,是 POP3 的替代协议。

首先打开下面这两个服务
在这里插入图片描述
导入依赖

<!-- Java Mail -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>

针对不同的的邮件协议,JavaMail 规定了服务提供者必须支持一系列属性,下表是针对 SMTP 协议的一些常见属性(属性值都以 String 类型进行设置,属性类型栏仅表示属性是如何被解析的):

mail.smtp.hostStringSMTP 服务器地址,如smtp.sina.com.cn
mail.smtp.portintSMTP 服务器端口号,默认为 25
mail.smtp.authbooleanSMTP 服务器是否需要用户认证,默认为 false
mail.smtp.userStringSMTP 默认的登陆用户名
mail.smtp.fromString默认的邮件发送源地址
mail.smtp.socketFactory.classStringsocket 工厂类类名
通过设置该属性可以覆盖提供者默认的实现,必须实现javax.NET.SocketFactory接口
mail.smtp.socketFactory.portint指定 socket 工厂类所用的端口号
如果没有规定,则使用默认的端口号
mail.smtp.socketFactory.fallbackboolean设置为 true 时,当使用指定的socket 类创建 socket 失败后,将使用 Java.net.Socket 创建socket,默认为 true
mail.smtp.timeoutintI/O 连接超时时间,单位为毫秒,默认为永不超时

javaMail 测试(qq邮箱)

package com.example.demo;

import org.springframework.boot.test.context.SpringBootTest;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;

@SpringBootTest
class Demo1ApplicationTests {

    public static void main(String[] args) throws MessagingException, GeneralSecurityException {
        // 首先配置邮箱信息
        Properties properties = new Properties();
        // 设置邮箱服务器主机名,qq邮箱就设置qq,163,换成 163
        properties.put("mail.smtp.host", "smtp.qq.com");
        // 设置邮箱服务器的端口号
        properties.put("mail.smtp.port", 465);
        // 设置是否需要身份认证,设置true
        properties.put("mail.smtp.auth", "true");
//        properties.put("mail.smtp.starttls.enable", "false");
        properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

        // 1. session对象,加载properties对象
        //import javax.mail.Session;
        Session session = Session.getInstance(properties);
        // 开启调试模式,可以看到状态
        session.setDebug(true);
        // 2. 通过session对象得到transport对象
        Transport transport = session.getTransport();
        // 3. 使用邮箱的用户名和密码连接邮件服务器,参数1:主机地址,参数2,用户名,参数3, 授权码
        transport.connect("smtp.qq.com", "3109405015", "bsjudvffhletdhci");
        // 4. 设置message邮件对象,javax Email下
        Message message = createSimpleMail(session);
        // 5. 发送邮件,参数2,所有接收者
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }

    // 创建普通文本的内容
    private static Message createSimpleMail(Session session) throws MessagingException {
        // 创建邮件对象
        MimeMessage message = new MimeMessage(session);
        // 设置邮件发送人
        message.setFrom("3109405015@qq.com");
        // 设置接收人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("819302342@qq.com"));
        // 设置邮件主题
        message.setSubject("测试文本");
        // 设置发送日期
        message.setSentDate(new Date());
        // 设置文本内容
        message.setText("哈哈,我想你哦,可是你不知道吖");
        return message;
    }
}

发送Html页面

基础发送一样,只是修改了发送方式

// 发送Html内容邮件
private static Message createHtmlMail(Session session) throws MessagingException {
    MimeMessage message = new MimeMessage(session);
    // 发件人
    message.setFrom("3109405015@qq.com");
    // 收件人
    message.setRecipient(Message.RecipientType.TO, new InternetAddress("819302342@qq.com"));
    // 主题
    message.setSubject("测试HTML内容!");
    // 发达时间
    message.setSentDate(new Date());

    // 创建多媒体容器
    MimeMultipart multipart = new MimeMultipart();
    // 设置邮件体对象
    MimeBodyPart bodyPart = new MimeBodyPart();

    // 设置到邮件体对象中
    bodyPart.setContent("<html><body><a href=\"https://www.baidu.com\">百度一下</a></body></html>"
            , "text/html;charset=UTF-8");
    // 将邮件体对象设置到多媒体对象中
    multipart.addBodyPart(bodyPart);
    // 将多媒体容器设置到message邮件中
    message.setContent(multipart);
    return message;
}

发送带附件的邮件

// 发送Html内容邮件
private static Message createAttachMail(Session session) throws MessagingException {
    MimeMessage message = new MimeMessage(session);
    message.setFrom("3109405015@qq.com");
    message.setRecipient(Message.RecipientType.TO, new InternetAddress("819302342@qq.com"));
    message.setSubject("测试附件文本");
    message.setSentDate(new Date());

    // 邮件正文
    MimeBodyPart bodyPart = new MimeBodyPart();
    bodyPart.setContent("<h2>这是一个包含附件的邮箱!</h2>", "text/html;charset=UTF-8");

    // 创建附件对象
    MimeBodyPart part = new MimeBodyPart();
    // 本地文件
    DataHandler df = new DataHandler(new FileDataSource("C:\\Users\\坤\\Desktop\\高智坤 -Java 分布式开发工程师.pdf"));
    // 设置到附件对象中
    part.setDataHandler(df);
    // 设置附件文件名
    part.setFileName(df.getName());

    // 创建多媒体对象
    MimeMultipart mimeMultipart = new MimeMultipart();
    // 添加正文
    mimeMultipart.addBodyPart(bodyPart);
    // 添加附件
    mimeMultipart.addBodyPart(part);
    // 设置附件类型
    mimeMultipart.setSubType("mixed");

    //设置到容器中
    message.setContent(mimeMultipart);
    return message;
}

封装发送邮箱

邮箱发送类

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;

/**
 * 邮件发送器
 */
public class MailSender {
    /**
     * 发送邮件
     *
     * @param mailSendInfo 邮件信息
     */
    public void sendMail(MailSendInfo mailSendInfo) {
        try {
            // 首先配置邮箱信息
            Properties properties = new Properties();
            properties.put("mail.smtp.host", mailSendInfo.getServeHost());
            properties.put("mail.smtp.port", mailSendInfo.getServerPost());
            properties.put("mail.smtp.auth", mailSendInfo.isFlag());
            properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            // 身份认证
            MyAuthenticator authenticator = new MyAuthenticator(mailSendInfo.getUserName(), mailSendInfo.getUserPwd());
            // 发送邮件
            Session session = Session.getDefaultInstance(properties, authenticator);
            session.setDebug(true);
            // 创建message对象
            MimeMessage mimeMessage = new MimeMessage(session);
            mimeMessage.setFrom(mailSendInfo.getFromAddress());
            mimeMessage.setSubject(mailSendInfo.getSubject());
            mimeMessage.setSentDate(new Date());
            List<String> address = mailSendInfo.getToAddress();
            if (address != null && address.size() > 0) {
                Address[] addresses = new Address[address.size()];
                for (int i = 0; i < address.size(); i++) {
                    Address address1 = new InternetAddress(address.get(i));
                    // 将地址设置到数组中
                    addresses[i] = address1;
                }
                // 将接收的邮箱地址设置到message对象中
                mimeMessage.setRecipients(Message.RecipientType.TO, addresses);
            }
            // 创建多媒体正文容器
            MimeMultipart multipart = new MimeMultipart();
            // 创建正文内容
            MimeBodyPart part = new MimeBodyPart();
            part.setContent(mailSendInfo.getContent(), "text/html;charset=UTF-8");
            multipart.addBodyPart(part);

            // 获取所有附件文件名
            List<String> fileNames = mailSendInfo.getAttachFileNames();
            if (fileNames != null && fileNames.size() > 0) {
                for (String fileName : fileNames) {
                    File file = new File(fileName);
                    if (file.exists()) {
                        // 如果附件存在
                        MimeBodyPart part1 = new MimeBodyPart();
                        DataHandler handler = new DataHandler(new FileDataSource(file));
                        part1.setDataHandler(handler);
                        // 设置附件名称解决乱码
                        part1.setFileName(MimeUtility.encodeText(handler.getName()));
                        multipart.addBodyPart(part1);
                    }
                }
            }
            // 设置到message对象中
            mimeMessage.setContent(multipart);
            Transport.send(mimeMessage);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

认证类

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * 认证类
 */
public class MyAuthenticator extends Authenticator {
    private String userName;
    private String userPwd;

    public MyAuthenticator(String userName, String userPwd) {
        this.userName = userName;
        this.userPwd = userPwd;
    }

    /**
     * 邮件服务器发送邮件时进行身份认证。
     */
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, userPwd);
    }
}

测试

@SpringBootTest
public class DemoTest {

    @Test
    public void text() {
        // 发给谁
        ArrayList<String> list = new ArrayList<>();
        list.add("819302342@qq.com");
        // 附件
        ArrayList<String> files = new ArrayList<>();
        files.add("C:\\Users\\坤\\Documents\\OneNote 笔记本\\30天\\项目资料(新传)\\006_document\\images\\1579338922007.png");
        files.add("C:\\Users\\坤\\Documents\\OneNote 笔记本\\30天\\项目资料(新传)\\006_document\\images\\1579341520148.png");

        MailSendInfo info = new MailSendInfo("smtp.qq.com", "465", "3109405015@qq.com", list,
                "3109405015@qq.com", "bsjudvffhletdhci",
                "重新开始", "<h2>封装测试</h2>", "true", files);
        MailSender sender = new MailSender();
        sender.sendMail(info);
    }
}

Spring 发送邮箱

普通文本

<!-- Java Mail -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.2.4.RELEASE</version>
</dependency>

配置类或者配置文件

@Configuration
public class MailConfig {

    @Bean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost("smtp.qq.com");
        sender.setUsername("3109405015@qq.com");
        sender.setPassword("bsjudvffhletdhci");
        return sender;
    }

    @Bean
    public SimpleMailMessage simpleMailMessage() {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("3109405015@qq.com");
        return message;
    }
}

但是带附件的特性还是需要自己配置

spring:
  mail:
    host: smtp.qq.com
    username: 3109405015@qq.com
    password: bsjudvffhletdhci

业务层

@Service
public class SimpleOrderManager implements OrderManager {
    @Resource
    private MailSender mailSender;

    @Resource
    private SimpleMailMessage simpleMailMessage;

    @Override
    public void placeOrder() {
        SimpleMailMessage message = new SimpleMailMessage(this.simpleMailMessage);
        message.setTo("819302342@qq.com");
        message.setText("嘿嘿我试试!");
        message.setSubject("究竟是那个主题呢!");
        this.mailSender.send(message);
    }
}

附件文本

@Service
public class SimpleOrderManager implements OrderManager {

    @Resource
    private JavaMailSender javaMailSender;

    @Override
    public void sendAnnex() {
        // 创建邮件对象
        MimeMessage message= javaMailSender.createMimeMessage();
        // 创建主题
        try {
            message.setSubject("测试主题");
            // 创建带有附件的信息帮助类
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setTo("819302342@qq.com");
            helper.setFrom("3109405015@qq.com");
            helper.setText("邮件测试!");
            File file = new File("C:\\Users\\坤\\Documents\\OneNote 笔记本\\30天\\项目资料(新传)\\006_document\\Spring 邮件发送.md");
            // 添加附件
            helper.addAttachment(file.getName(), file);
            javaMailSender.send(message);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值