javamail——邮件发送

最近都在熟悉先前学习的一系列知识,感觉需要加强巩固。
最近实现了邮件发送的业务,这是我的记录。

分析

javamail是用来发送邮件的。我们在代码里操作他来实现邮件发送。
我们使用qq邮箱作为案例

设置

首先,我们需要去qq邮箱里面开smtp服务,具体的操作看这里qq邮箱smtp服务开通
然后,我们需要先在pom中添加依赖

<!--        java-mail依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

然后,我们需要在application.yml中配置smtp(这里由于想好要部署到服务器上所以预先设置好了smtps,本地照样可用)

# java mail
  mail:
    host: smtp.qq.com
    protocol: smtps
    username: 你的/你公司的邮箱地址@qq.com
    password: 去邮箱获取
    port: 465
    properties:
      mail:
        smtp:
          socketFactort:
            port: 465
            class: javax.net.ssl.SSLSocketFactory
            fallback: false

我们将使用R作为结果集响应,并使用MailFileDTO作为data传回的数据的javabean:

R

package cn.calendo.common;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 前后端协议联调 结果集R
 */
@Data
public class R<T> implements Serializable {
    /**
     * 状态码
     * 200: 成功
     * 400: 请求语法错误
     * 403: 服务器拒绝请求
     * 404: 服务器未响应
     * 500: 服务器内部错误
     */
    private Integer code;
    /**
     * 返回信息
     */
    private String msg;
    /**
     * 返回时间戳
     */
    private Date timestamp;
    /**
     * 返回的数据
     */
    private T data;

    /**
     * 响应成功
     *
     * @param code      状态码 200: 成功
     * @param object    任意对象
     * @param timestamp 时间戳
     * @param <T>       返回类型任意
     * @return R结果集
     */
    public static <T> R<T> success(Integer code, Date timestamp, T object) {
        R<T> r = new R<T>();
        r.code = code;
        r.timestamp = timestamp;
        r.data = object;
        return r;
    }

    /**
     * 响应成功
     *
     * @param code      状态码 200: 成功
     * @param msg       返回的消息
     * @param timestamp 时间戳
     * @param <T>       返回类型任意
     * @return R结果集
     */
    public static <T> R<T> success(Integer code, String msg, Date timestamp) {
        R<T> r = new R<T>();
        r.code = code;
        r.msg = msg;
        r.timestamp = timestamp;
        return r;
    }

    /**
     * 响应成功
     *
     * @param code      状态码 200: 成功
     * @param msg       返回的消息
     * @param timestamp 时间戳
     * @param object    返回的数据
     * @param <T>       返回类型任意
     * @return R结果集
     */
    public static <T> R<T> success(Integer code, String msg, Date timestamp, T object) {
        R<T> r = new R<T>();
        r.code = code;
        r.msg = msg;
        r.timestamp = timestamp;
        r.data = object;
        return r;
    }

    /**
     * 响应失败
     *
     * @param code      状态码 400: 请求语法错误 403: 服务器拒绝请求 404: 服务器未响应 500: 服务器内部错误
     * @param msg       返回给前端的错误信息
     * @param timestamp 时间戳
     * @param <T>       返回类型任意返回类型任意
     * @return R结果集
     */
    public static <T> R<T> error(Integer code, String msg, Date timestamp) {
        R<T> r = new R<>();
        r.code = code;
        r.msg = msg;
        r.timestamp = timestamp;
        return r;
    }

    /**
     * 响应失败
     *
     * @param code      状态码 400: 请求语法错误 403: 服务器拒绝请求 404: 服务器未响应 500: 服务器内部错误
     * @param msg       返回给前端的错误信息
     * @param timestamp 时间戳
     * @param object    任意对象
     * @param <T>       返回类型任意返回类型任意
     * @return R结果集
     */
    public static <T> R<T> error(Integer code, String msg, Date timestamp, T object) {
        R<T> r = new R<>();
        r.code = code;
        r.msg = msg;
        r.timestamp = timestamp;
        r.data = object;
        return r;
    }

}

MailFileDTO

package cn.calendo.dto.fileDTO;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 邮件文件dto
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MailFileDTO {
    /**
     * 文件名(业务层设为原始文件名)
     */
    private String fileName;
    /**
     * 是否为空(true:空;false:非空)
     */
    private boolean isEmpty;
    /**
     * 文件大小(B)
     */
    private long fileSize;
}

使用

首先我们需要知道,一个邮件由发送者from,接收者to,抄送cc,密送bcc,主题subject,正文text组成,更多的例如上传的文件file,而在javamail中,需要我们传入的参数也是这些。
而发送不同格式的邮件是有不同的操作的,但是被操作对象只有一个:javaMailSender,因此,我们首先去建一个业务类,将其自动装配进来

@Autowired
private JavaMailSender javaMailSender;

然后,我们先实现一个简单类型的邮件发送功能。

public R sendSimpleMail(String from, String to, String cc, String bcc, String subject, String text) {
	return R.success(200, "发送成功", new Date());
}

我们需要知道,当JavaMailSender 注入后,我们可以new一个SimpleMailMessage

SimpleMailMessage message = new SimpleMailMessage();

接下来再设置传进来的请求参数

message.setFrom(from);
        message.setTo(to);
        //抄送可以不填
        if (cc != null) {
            message.setCc(cc);
        }
        //密送可以不填
        if (bcc != null) {
            message.setBcc(bcc);
        }
        message.setSubject(subject);
        message.setText(text);

最后,sender来发送即可

javaMailSender.send(message);

简单邮件代码

@Autowired
    private JavaMailSender javaMailSender;

    /**
     * 简单邮件发送
     *
     * @param from    发送者
     * @param to      接收者(多人用,隔开)
     * @param cc      抄送
     * @param bcc     密送
     * @param subject 邮件主题
     * @param text    邮件内容
     * @return R对象
     */
    @Override
    public R sendSimpleMail(String from, String to, String cc, String bcc, String subject, String text) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        if (cc != null) {
            message.setCc(cc);
        }
        if (bcc != null) {
            message.setBcc(bcc);
        }
        message.setSubject(subject);
        message.setText(text);
        javaMailSender.send(message);
        return R.success(200, "发送成功", new Date());
    }

由于我们是前端设置了请求,所以我们需要编写控制层


/**
 * 邮件发送测试控制层,以test开头
 */
@RestController
@RequestMapping("/test/mail")
public class Mail {

    @Autowired
    private IMailService mailService;

    /**
     * 简单邮件发送
     *
     * @param from    发送者
     * @param to      接收者(多人用,隔开)
     * @param cc      抄送
     * @param bcc     密送
     * @param subject 邮件主题
     * @param text    邮件内容
     * @return R对象
     */
    @PostMapping("/send_simple_mail")
    public R sendSimpleMail(@RequestParam(value = "from") String from,
                            @RequestParam(value = "to") String to,
                            @RequestParam(value = "cc", required = false) String cc,
                            @RequestParam(value = "bcc", required = false) String bcc,
                            @RequestParam(value = "subject") String subject,
                            @RequestParam(value = "text") String text) {
        return mailService.sendSimpleMail(from, to, cc, bcc, subject, text);
    }
}

接下来,我们去postman里面测试一波
在这里插入图片描述
也确实收到了
在这里插入图片描述

至此,简单邮件传输完成。

链接邮件

链接邮件是可以在正文里面写html代码的,也就是说,可以生成链接,图片等
与上面一样,需要编写控制层与业务层

控制层


    /**
     * 链接邮件发送(支持多人接收)
     *
     * @param from    发送者
     * @param to      接收者(多人用,隔开)
     * @param cc      抄送
     * @param bcc     密送
     * @param subject 邮件主题
     * @param text    邮件内容(动态链接在内)
     * @return R对象
     */
    @PostMapping("/send_link_mail")
    public R sendLinkMail(@RequestParam(value = "from") String from,
                          @RequestParam(value = "to") String to,
                          @RequestParam(value = "cc", required = false) String cc,
                          @RequestParam(value = "bcc", required = false) String bcc,
                          @RequestParam(value = "subject") String subject,
                          @RequestParam(value = "text") String text) {
        return mailService.sendLinkMail(from, to, cc, bcc, subject, text);
    }

然后我们需要注意的是我们要通过注入的sender来生成一个mimeMessage进行助理发送


    /**
     * 链接邮件发送(支持多人接收)
     *
     * @param from    发送者
     * @param to      接收者(多人用,隔开)
     * @param cc      抄送
     * @param bcc     密送
     * @param subject 邮件主题
     * @param text    邮件内容(动态链接在内)
     * @return R对象
     */
    @Override
    public R sendLinkMail(String from, String to, String cc, String bcc, String subject, String text) {
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
            message.setFrom(from);
            message.setTo(to);
            if (cc != null) {
                message.setCc(cc);
            }
            if (bcc != null) {
                message.setBcc(bcc);
            }
            message.setSubject(subject);
            message.setText(text);
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
            return R.error(500, "发送失败", new Date());
        }
        return R.success(200, "发送成功", new Date());
    }

文件邮件

首先,我们都知道,上传与下载文件,都是通过MultipartFile格式进行的,这里也不例外

控制层


    /**
     * 单文件邮件发送
     *
     * @param from    发送者
     * @param to      接收者(多人用,隔开)
     * @param cc      抄送
     * @param bcc     密送
     * @param subject 邮件主题
     * @param text    邮件内容
     * @param file    单文件
     * @return R对象
     */
    @PostMapping("/send_file_mail")
    public R sendFileMail(@RequestParam(value = "from") String from,
                          @RequestParam(value = "to") String to,
                          @RequestParam(value = "cc", required = false) String cc,
                          @RequestParam(value = "bcc", required = false) String bcc,
                          @RequestParam(value = "subject") String subject,
                          @RequestParam(value = "text", required = false) String text,
                          @RequestParam(value = "file") MultipartFile file) {
        return mailService.sendFileMail(from, to, cc, bcc, subject, text, file);
    }

业务层

与链接邮件一样,需要使用助理去发送邮件
在业务层内我们使用先前写好的dto进行装载返回对象

/**
     * 单文件邮件发送
     *
     * @param from    发送者
     * @param to      接收者(多人用,隔开)
     * @param cc      抄送
     * @param bcc     密送
     * @param subject 邮件主题
     * @param text    邮件内容
     * @param file    单文件
     * @return R对象
     */
    @Override
    public R sendFileMail(String from, String to, String cc, String bcc, String subject, String text, MultipartFile file) {
        MailFileDTO mailFileDTO = new MailFileDTO();
        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
            message.setFrom(from);
            message.setTo(to);
            if (cc != null) {
                message.setCc(cc);
            }
            if (bcc != null) {
                message.setBcc(bcc);
            }
            message.setSubject(subject);
            message.setText(text);
            message.addAttachment(file.getName(), file);
            //装载dto
            mailFileDTO.setFileName(file.getOriginalFilename());//获取原始文件名
            mailFileDTO.setEmpty(file.isEmpty());//判断是否为空
            mailFileDTO.setFileSize(file.getSize());//获取文件大小
            javaMailSender.send(mimeMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
            return R.error(500, "发送失败", new Date());
        }
        return R.success(200, "发送成功", new Date(), mailFileDTO);
    }

测试

我们在postman里面测试时需要添加请求头
在这里插入图片描述在请求体内添加文件
在这里插入图片描述
返回即是json
在这里插入图片描述

总结

如果你想用简单的邮件发送的话,就直接这样即可

SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
        message.setTo(to);
            message.setCc(cc);
            message.setBcc(bcc);
        message.setSubject(subject);
        message.setText(text);
javaMailSender.send(message);

若你想发送文件或者链接,就这样

try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
            message.setFrom(from);
            message.setTo(to);
            message.setSubject(subject);
            message.setText(text);
            message.addAttachment(file.getName(), file);
            } catch (MessagingException e) {
            e.printStackTrace();
            return R.error(500, "发送失败", new Date());
}
        return R.success(200, "发送成功", new Date(), mailFileDTO);
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值