Spring Boot发送邮件

概述

要发送邮件,必须借助已有的SMTP服务。要么借助本地安装的邮箱客户端,要么借助网络邮箱的SMTP服务。
从本地直接凭空将信息发送到某个指定邮箱是做不到的。
这里使用网络邮箱的SMTP服务。

开启SMTP服务

网络邮箱的SMTP服务默认都是关闭的,需要进入设置后打开。
所有网络邮箱开启SMTP服务的方式都基本相同。这里以QQ邮箱为例。打开邮箱后点击设置,选择其下的账户选项卡:
mail-set
向下找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,然后将其中的IMAP/SMTP服务打开。
mail-open-smtp
注意后面的 (什么是 IMAP,它又是如何设置?) ,点击后弹出说明,在里面可以看到QQ邮箱的发送邮件服务器地址,后面会用到。
点击开启IMAP/SMTP服务,会弹窗提示需要用绑定的手机发短信到指定号码:
mail-authority
发送后,点击我已发送,就会开启SMTP并给出授权码。记下该授权码,后面要用到。

引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

修改配置文件

spring:
  mail:
    host: smtp.qq.com # 发送邮件服务器。
    username: xxx@qq.com # 发送邮件的邮箱地址。
    password:  xxx # 客户端授权码,非邮箱密码。由QQ邮箱生成。
    default-encoding: utf-8 # 编码。
    properties:
      mail:
        smtp:
          port: 465 # 修改端口号为465(SMTP-over-SSL)。
          ssl.enable: true # 开启SSL。
          starttls:
            enable: true
            required: true

其中:

  • host: 邮件服务器地址。各家地址是固定的。在QQ邮箱开启IMAP/SMTP服务的地方有说明(什么是 IMAP,它又是如何设置?),点击后可以在说明中看到QQ邮箱的发送邮件服务器为smtp.qq.com。其他邮箱同理。
  • password: 客户端授权码,非邮箱密码。即前面开启SMTP服务后生成的授权码。
  • mail.smtp.port: 端口号。默认为25。但25端口是SMTP,不安全,现在大多数邮件服务器都禁用该端口。因此将其修改为465端口,该端口是SMTPS,使用SSL/TLS通讯,更安全。但要注意必须配合mail.smtp.ssl.enable
  • mail.smtp.ssl.enable:开启SSL。若将端口更换为465,则必须开启。

发送

发送需要使用JavaMailSender。首先要将其引入:

@Resource
private JavaMailSender javaMailSender;

简单邮件

简单邮件只包含标题和文字内容。使用SimpleMailMessage来构造邮件消息。

SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(env.getProperty("spring.mail.username")); // 发送方地址。必须与配置中的username相同。
simpleMailMessage.setTo("xxx@qq.com"); // 接收方地址。
simpleMailMessage.setSubject("测试标题"); // 邮件标题。
simpleMailMessage.setText("测试内容"); // 邮件文字内容。

javaMailSender.send(simpleMailMessage);

复杂邮件

复杂邮件可在内容中嵌入html,可包含图片,可添加附件。
复杂邮件需要使用MimeMessage来构造邮件消息。

try {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
    messageHelper.setFrom(env.getProperty("spring.mail.username"));
    messageHelper.setTo("xxx@qq.com");
    messageHelper.setSubject("测试标题");
    messageHelper.setText("<h1>标题</h1><br/><p>这是内容</p><img src=\"cid:image01\">", true); // html内容字符串。

    // 添加html中引用的图片资源。
    File image = new File("D:/TEST/testImage.jpg");
    messageHelper.addInline("image01", new FileSystemResource(image));

    // 添加附件。
    File file = new File("D:/TEST/testFile.zip");
    messageHelper.addAttachment("测试文件1", new FileSystemResource(file));

    // 发送。
    javaMailSender.send(messageHelper.getMimeMessage());
} catch (MessagingException e) {
    e.printStackTrace();
}

其中:

  • MimeMessageHelper.setText()可传入一个html格式的文本,该文本会以html形式展示在邮件内容中。注意第二个参数必须传入true才会将第一个参数以html格式解析。
  • html格式文本中可以引用图片,其属性为src="cid:image01"cid:是固定格式,不需要修改。后面的image01是自定义的图片id,需要与后面传入的图片资源对应起来。
  • MessageHelper.addInline()第一个参数为资源的cid,与html格式文本中引用的cid对应起来。若无法对应,则此处传入的资源文件会作为附件添加到邮件中。
  • MessageHelper.addAttachment()第一个参数为附件的文件名。

其他

  • 发送邮件需要耗费一定时间。哪怕是最简单的邮件,也无法做到请求后立即发送完成。
  • 发送的附件不能包含.bat后缀的文件,否则收不到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值