SpringBoot发送复杂邮件(可添加附件)

今天这个是一个非常简单的邮件发送,也是我在网上看到的,我简化了很多,初学者都能看懂
我们先创建一个web项目,导入mail依赖,还有一些后面需要用到的依赖

 <!--传输文件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
 <!--引入模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!--webjars中的jquery-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

        <!--bookstarp-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.0.0</version>
        </dependency>

我们先创建一个实例类

package com.jiang.pojo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;

/**
 * @ClassName Mail
 * @Description TODO
 * @Author ht
 * @Date 2020/8/17 9:55
 * @Version 1.0
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Mail {

  private String id;//邮件id
  private String from;//邮件发送人
  private String to;//邮件接收人(多个邮箱则用逗号","隔开)
  private String subject;//邮件主题
  private String text;//邮件内容
  private String status;//状态
  private String error;//报错信息
  @JsonIgnore
  private MultipartFile[] multipartFiles;//邮件附件 输入流

}

我们写我们的业务,想一想,我们写邮件是不是一开始要创建邮件,邮件创建好后,我们要检查邮件,若邮件没问题,我们就该发送邮件,所有我们的业务有三个
自己写测试的话,就直接写业务实现了
service层

package com.jiang.service;

import com.jiang.pojo.Mail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Date;

/**
 * @ClassName MailService
 * @Description TODO
 * @Author ht
 * @Date 2020/8/17 10:00
 * @Version 1.0
 **/
//业务层逻辑
@Service
public class MailService {
  private Logger logger = LoggerFactory.getLogger(getClass());//提供日志类

  @Autowired
  JavaMailSenderImpl mailSender;


  //构建一个复杂的发送邮件(可以添加附件)
  public void buildMail(Mail mail) {

    MimeMessage mailMessage = mailSender.createMimeMessage();

    //封装
    MimeMessageHelper helper = null;//true表示支持复杂类型
    try {
      helper = new MimeMessageHelper(mailMessage, true);
      //配置发送人
      helper.setFrom(getMailSendFrom());//获取getMailSendFrom方法中的数据
      //发送给谁
      helper.setTo(mail.getTo());
      //邮件主题
      helper.setSubject(mail.getSubject());
      //邮件内容
      helper.setText(mail.getText());
      //邮件附件
      if (mail.getMultipartFiles() != null) {//添加邮件附件
        for (MultipartFile multipartFile : mail.getMultipartFiles()) {
          //addAttachment的两个参数的意思分别是获取邮件中显示的附件的名称,获取附件的资源
          helper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
        }
      }
      mailSender.send(helper.getMimeMessage());
      //发送成功后,它的状态变为ok
      mail.setStatus("ok");
      logger.info("发送邮件成功:{}->{}", mail.getFrom(), mail.getTo());
    } catch (Exception e) {
      throw new RuntimeException(e);//发送失败
    }

  }

  public void  checkMail(Mail mail){
    if (StringUtils.isEmpty(mail.getTo())){
      throw new RuntimeException("邮件收信人不能为空");
    }
    if (StringUtils.isEmpty(mail.getSubject())){
      throw new RuntimeException("邮件主题不能为空");
    }
    if (StringUtils.isEmpty(mail.getText())){
      throw new RuntimeException("邮件内容不能为空");
    }
  }




  //发送邮件
  public Mail sendMail(Mail mail) throws MessagingException {
    checkMail(mail);
    buildMail(mail);
    return mail;
  }


  //获取邮件发信人,在yaml配置中获取
  public String getMailSendFrom() {
    return mailSender.getJavaMailProperties().getProperty("from");
  }
}

这些没什么好说的,我都注释好了,主要的是我们的最后一个,通过代码在yaml中获取我们配置的静态资源

//获取邮件发信人,在yaml配置中获取
  public String getMailSendFrom() {
    return mailSender.getJavaMailProperties().getProperty("from");
  }

我们的配置文件是这样的

spring:
  mail:
    host: smtp.qq.com #SMTP服务器地址
    username: 1661259340@qq.com #登陆账号
    password: thgbslbtlznechfh #登陆密码(或授权码)
    properties:
      from: 1661259340@qq.com #邮件发信人(即真实邮箱)
      #开启加密验证 qq有
      #自定义配置 是否自动开启安全验证
      mail:
        smtp:
          ssl:
            enable: true;
  thymeleaf:
    cache: false
    prefix: classpath:/views/

  servlet:
    multipart:
      max-file-size: 10MB #限制单个文件大小
      max-request-size: 50MB #限制请求总量

我们获取的就是spring.properties.from中的数据

获取到过后,我们就需要些Controller层了
我们要先进入发送邮件的界面,然后在界面中输入数据

package com.jiang.controller;

import com.jiang.pojo.Mail;
import com.jiang.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.mail.MessagingException;

/**
 * @ClassName MailController
 * @Description TODO
 * @Author ht
 * @Date 2020/8/24 17:24
 * @Version 1.0
 **/

@RestController
public class MailController {

  @Autowired
  MailService service;

  /**
   * 发送邮件的主界面
   */

  @GetMapping("/mail")
  public ModelAndView index(ModelAndView modelAndView) {
    modelAndView =new ModelAndView("/sendMail");
    //打开发送邮件的页面
    modelAndView.addObject("from", service.getMailSendFrom());//邮件发信人
    return modelAndView;
  }
  /**
   * 发送邮件
   */

  @PostMapping("/send")
  public Mail sendMail(Mail mail, MultipartFile[] files) throws MessagingException {
    mail.setMultipartFiles(files);
    Mail mail1 = service.sendMail(mail);//发送邮件和附件
    return mail1;
  }
}

把我们的“from”传到sendeMail界面
在这里插入图片描述
sendMail界面,它是用的thymeleaf模板引擎

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8"/>
    <title>发送邮件</title>
    <link th:href="@{/webjars/bootstrap/4.0.0/css/bootstrap.min.css}" rel="stylesheet" type="text/css"/>
    <script th:src="@{/webjars/jquery/3.3.1/jquery.min.js}"></script>
    <script th:href="@{/webjars/bootstrap/4.0.0/js/bootstrap.min.js}"></script>

</head>

<body>
<div class="col-md-6" style="margin:20px;padding:20px;border: #E0E0E0 1px solid;">
    <marquee behavior="alternate" onfinish="alert(12)" id="mq"
             onMouseOut="this.start();$('#egg').text('嗯 真听话!');"
             onMouseOver="this.stop();$('#egg').text('有本事放开我呀!');">
        <h5 id="egg">祝大家新年快乐!</h5><img style="display: inline-block;width: 100px;height: 100px" id="doge" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1597645635473&di=9acb697a372d54e689be3c600228d114&imgtype=0&src=http%3A%2F%2Fimg5.cache.netease.com%2Fgame%2F2012%2F10%2F19%2F201210191523330b2ec.gif" alt="">
    </marquee>

    <form class="form-horizontal" id="mailForm">
        <div class="form-group">
            <label class="col-md-2 control-label">邮件发信人:</label>
            <div class="col-md-6">
                <input class="form-control" id="from" name="from" th:value="${from}" readonly="readonly">
            </div>
        </div>
        <div class="form-group">
            <label class="col-md-2 control-label">邮件收信人:</label>
            <div class="col-md-6">
                <input class="form-control" id="to" name="to" title="多个邮箱使用,隔开">
            </div>
        </div>
        <div class="form-group">
            <label class="col-md-2 control-label">邮件主题:</label>
            <div class="col-md-6">
                <input class="form-control" id="subject" name="subject">
            </div>
        </div>
        <div class="form-group">
            <label class="col-md-2 control-label">邮件内容:</label>
            <div class="col-md-6">
                <textarea class="form-control" id="text" name="text" rows="5"></textarea>
            </div>
        </div>
        <div class="form-group">
            <label class="col-md-2 control-label">邮件附件:</label>
            <div class="col-md-6">
                <input class="form-control" id="files" name="files" type="file" multiple="multiple">
            </div>
        </div>
        <div class="form-group">
            <label class="col-md-2 control-label">邮件操作:</label>
            <div class="col-md-3">
                <a class="form-control btn btn-primary" onclick="sendMail()">发送邮件</a>
            </div>
            <div class="col-md-3">
                <a class="form-control btn btn-default" onclick="clearForm()">清空</a>
            </div>
        </div>
    </form>

    <script th:inline="javascript">
        var appCtx = [[${#request.getContextPath()}]];

        function sendMail() {

            var formData = new FormData($('#mailForm')[0]);
            $.ajax({
                url: appCtx + '/send',
                type: "POST",
                data: formData,
                contentType: false,
                processData: false,
                success: function (result) {
                    alert(result.status === 'ok' ? "发送成功!" : "你被Doge嘲讽了:" + result.error);
                },
                error: function () {
                    alert("发送失败!");
                }
            });
        }

        function clearForm() {
            $('#mailForm')[0].reset();
        }

        setInterval(function () {
            var total = $('#mq').width();
            var width = $('#doge').width();
            var left = $('#doge').offset().left;
            if (left <= width / 2 + 20) {
                $('#doge').css('transform', 'rotateY(180deg)')
            }
            if (left >= total - width / 2 - 40) {
                $('#doge').css('transform', 'rotateY(-360deg)')
            }
        });
    </script>
</div>
</body>
</html>

最后我们运行的结果是这样的
在这里插入图片描述
邮件发送人使我们直接在配置文件中获取的,当然我们也可以自己写,自己写那个也是一样的

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值