当前位置:   article > 正文

javamail——邮件发送

javamail

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

分析

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

设置

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

<!--        java-mail依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

然后,我们需要在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

我们将使用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;
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

使用

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

@Autowired
private JavaMailSender javaMailSender;
  • 1
  • 2

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

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

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

SimpleMailMessage message = new SimpleMailMessage();
  • 1

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

message.setFrom(from);
        message.setTo(to);
        //抄送可以不填
        if (cc != null) {
            message.setCc(cc);
        }
        //密送可以不填
        if (bcc != null) {
            message.setBcc(bcc);
        }
        message.setSubject(subject);
        message.setText(text);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

最后,sender来发送即可

javaMailSender.send(message);
  • 1

简单邮件代码

@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());
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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


/**
 * 邮件发送测试控制层,以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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

接下来,我们去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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

然后我们需要注意的是我们要通过注入的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());
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

文件邮件

首先,我们都知道,上传与下载文件,都是通过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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

业务层

与链接邮件一样,需要使用助理去发送邮件
在业务层内我们使用先前写好的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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

测试

我们在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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/95517
推荐阅读
相关标签
  

闽ICP备14008679号