springboot实现发送功能与遇到的大坑!!!

话不多说直接上代码

//结合springboot导入依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

在springboot中application.properties添加邮件需要的依赖

# JavaMailSender 邮件发送的配置
spring.mail.host=stmp的地址
spring.mail.username=发送人邮箱
spring.mail.password=发送人(授权码)
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8
如何正文的内容为html格式的话需要将(enable,required换成false)
下面上发送的代码
这里将发送邮件的参数封装一个实体类中了
public class Mail {
	@ApiModelProperty(value = "收件人邮箱")
	private String receiver;
	@ApiModelProperty(value = "邮箱标题")
	private String title;
	@ApiModelProperty(value = "邮箱正文")
	private String text;
	@ApiModelProperty(value = "邮箱附件的路径")
	private String filePath;

	public String getReceiver() {
		return receiver;
	}

	public void setReceiver(String receiver) {
		this.receiver = receiver;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public String getFilePath() {
		return filePath;
	}

	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}
}
@RestController
public class test {
	@Autowired
	private MailServices mailService;
	@PostMapping("/send")
	public void mail(Mail mail) {
		mailService.sendMail(mail);
	}
public interface MailServices {
	/**
	 * 发送邮箱
	 * @param mail
	 */
	void sendMail(Mail mail);

}
@Component
public class mailServicesImpl implements MailServices {
	@Autowired
	private JavaMailSender mailSender;
	@Value("${spring.mail.username}")
	private String from;

	private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(MailServices.class);

	@Override
	public void sendMail(Mail mail) {
		MimeMessage message = mailSender.createMimeMessage();
		System.getProperties().setProperty("mail.mime.splitlongparameters", "false");// 他的意义在于你附件名过长导致发送后的附件名更改陈其他格式文件
		try {
			MimeMessageHelper helper = new MimeMessageHelper(message, true);
			helper.setFrom(from);// 发送人
			helper.setText(mail.getText(), true);// 正文的格式,后面添加true时候为html文本,什么也不写默认为text文本
			FileSystemResource file = new FileSystemResource(new File(mail.getFilePath()));
			String fileName = file.getFilename();
			helper.addAttachment(fileName, file);
			mailSender.send(message);
		} catch (MessagingException e) {
			LOG.info("发邮件失败");
		}
	}

}

如上面代码所写看看加与不加(System.getProperties().setProperty(“mail.mime.splitlongparameters”, “false”);)这段代码发送的区别:
这是在这里插入图片描述
在这里插入图片描述
文件的名字与格式都改变了,这个地方真是很大的坑后来在网上找说把这段代码(System.getProperties().setProperty(“mail.mime.splitlongparameters”, “false”);)放到启动类上就好了,然而真的不起作用。然后让我们看看为何会这样
在这里插入图片描述
我们接着看这个方法在这里插入图片描述
这个代表的附件的名字都放到这里来让我们跟一下代码
在这里插入图片描述
看这里当你的附件名base64编码大于60还有其他两个条件进行截取
在这里插入图片描述
此时看这里这个参数默认为true,所以为何我们加上那个代码大家就清楚了吧。

如果正文的内容html格式的话你如何使用呢

上面的代码已经说了,但是为什么为true的时候可以解析html格式的信息呢??
在这里插入图片描述

当你的接收人是多个的话如何操作呢?

public void setTo(String to) throws MessagingException {
		Assert.notNull(to, "To address must not be null");
		setTo(parseAddress(to));
	}

	public void setTo(String[] to) throws MessagingException {
		Assert.notNull(to, "To address array must not be null");
		InternetAddress[] addresses = new InternetAddress[to.length];
		for (int i = 0; i < to.length; i++) {
			addresses[i] = parseAddress(to[i]);
		}
		setTo(addresses);
	}

大家看当你需要发多个邮件时候,你的将你的字符串一","分割成数组形式然后传入,因为setTo是既支持当个收件人,还有多个收件人,希望大家多多点点底层对的实现方式,我开发的时候很好看到这些,而且多个抄送人也是一样的。
相信大家看到这里就明朗的许多了吧!!!希望能帮助大家!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值