Springboot实现邮箱发送短信

完整目录结构

在这里插入图片描述

第一步:依赖

邮箱的依赖主要是

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

        </dependency>

其它资源可以根据自己情况修改,不需要可以删除

在这里插入代码片
 <dependencies>


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

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

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <!--邮件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>

        </dependency>
        <!--邮件-->
        <!--junit单元测试 start-->
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--junit单元测试 end-->

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
   		<!--mysql驱动 end-->
        <!--数据源驱动-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.25</version>
        </dependency>
        <!-- 开发热启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 集成redis依赖  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--配置后redis生效-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

        <!--数据源驱动结束-->
        <!-- mybatis start-->
        <!-- Swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- swagger end -->
		<!-- mybaits start -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
		<!-- mybaits end-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>

        </plugins>
    </build>

第二步:配置邮箱信息

邮箱是放在了yaml文件中配置的,不过这里的邮箱配置是需要授权码的,因此,需要提前获取授权码(注意,这个授权码,要好好保存)
获取授权码的方式:
可以参考我这个博客http://t.csdn.cn/0UT66

##配置服务端口
server:
  port: 8888
  servlet:
    context-path: /app
##配置redis

#  #配置邮箱
#  mail:
#    default-encoding: UTF-8
#    host: smtp.163.com
#    protocol: stmp
#    username: XXX@163.com
#    password: BIZDYBTTTNLDYLCG
#    from: a2020940170@163.com
#
spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 5000
    lettuce:
      pool:
        enabled: true
      # 连接池中的最大空闲连接,默认值也是8。
        max-idle: 500
      # 连接池中的最小空闲连接,默认值也是0。
        min-idle: 50
      # 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
        max-active: 1000
      # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
        max-wait: 2000
  mail:
    protocol: smtp
    default-encoding: UTF-8
    #配置POP3服务器,此处使用网易邮箱 如果是qq邮箱,记得更改成smtp.qq.com
    host: smtp.163.com
    #发送邮件的用户名(改成你自己的)及授权码,注意不是登陆密码 如果是qq邮箱,记得更改成qq的邮箱和qq的授权码
    username: XXXX@163.com 
    password: XXXXXX
    from: XXXXXX@163.com
  ###原因:swagger jar冲突这是因为Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher。
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher   

第三步:邮箱服务层

MailService.java代码如下:
注意:这个类需要你自己建包,我没把包路径放进来

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 说明
 * Description: <br/>
 * date: 2022/7/21 10:41<br/>
 *
 * @author 哎,就是玩儿<br />
 * @since JDK 1.8
 */
@Service
public class MailService {
    //定义邮件发送器
    @Autowired
    private  JavaMailSender mailSender;
    //定义邮件发送者
    @Value("${spring.mail.from}")
    private String from;
    @Value("${spring.mail.username}")
    private String userName;
    /**
     * @param to 接收者
     * @param subject 主题
     * @param content 内容
     * @Value注解读取配置文件中同名的配置值
     */
    public boolean sendSimpleMail(String to, String subject, String content) {
      boolean falg = true;
      String code= String.valueOf(ThreadLocalRandom.current().nextInt(100000, 1000000));

        //创建一个简单文本邮件的对象
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            //赋予相应的内容
            message.setTo(to);
          //  String username = userName;
            message.setSubject(subject);
            message.setText(content+code);

            message.setFrom(from);
            message.setSentDate(new Date());
            //将邮件对象赋予邮件发送器
            mailSender.send(message);
        } catch (MailException e) {
            falg = false;
            e.printStackTrace();
        }
        return falg;
    }
}

第四步:发送短信

这个类中用了swagger,以及自定义的返回类,你可以修改一下代码


import com.emailTest.emailtest.service.MailService;
import com.emailTest.emailtest.util.JsonResult;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * 说明
 * Description: <br/>
 * date: 2022/7/21 13:55<br/>
 *
 * @author 哎,就是玩儿<br />
 * @since JDK 1.8
 */
@RestController
@RequestMapping("login")
public class LoginController {
    @Autowired
    private MailService mailService;

    /**
     *
     * @return
     */
    @RequestMapping(value = "/sendEmail", method = RequestMethod.GET)
    @ApiOperation(value="发送邮件", notes="发送邮件")
    public JsonResult sendEmail(){
        String to = "XXXX@163.com";
        String subject="测试邮箱功能";
        String content = "这是测试邮箱功能是否正常,请您注意查收邮箱验证码";
        boolean falg =   mailService.sendSimpleMail(to,subject,content);
        return JsonResult.ok(falg);
    }
    
}


如果不修改,就引入以下swagger配置类:


import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * 说明
 * Description: <br/>
 * date: 2022/1/20 14:23<br/>
 *
 * @author 哎,就是玩儿<br />
 * @since JDK 1.8
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //是否开启 (true 开启  false隐藏。生产环境建议隐藏)
                //.enable(false)
                .select()
                //扫描的路径包,设置basePackage会将包下的所有被@Api标记类的所有方法作为api
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                //指定路径处理PathSelectors.any()代表所有的路径
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //设置文档标题(API名称)
                .title("SpringBoot中使用Swagger2接口规范")
                //文档描述
                .description("接口说明")
                //服务条款URL
                .termsOfServiceUrl("http://localhost:8888/")
                //版本号
                .version("1.0.0")
                .build();
    }

}

顺便,把自定义的返回类也放上去吧:


import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.lang.Nullable;


/**
 * 说明
 * Description: <br/>
 * date: 2022/7/21 13:57<br/>
 *  自定义返回值
 * @author 哎,就是玩儿<br />
 * @since JDK 1.8
 */
@Data
@AllArgsConstructor
public class JsonResult {
    public Integer code;
    public Boolean status;
    public String message;
    public Object data;
    private JsonResult(){}
    public static JsonResult ok(Object param){
        return new JsonResult(
                ResultEnum.OK.getCode(),
                ResultEnum.OK.getSuccess(),
                ResultEnum.OK.getMessage(),
                param
        );
    }
    public static JsonResult err(@Nullable String message){
        return new JsonResult(
                ResultEnum.NOT_FOUND.getCode(),
                ResultEnum.NOT_FOUND.getSuccess(),
                message != null ? message :  ResultEnum.NOT_FOUND.getMessage(),
                null
        );
    }
}

引入的枚举类:



import lombok.Getter;

/**
 * 说明
 * Description: <br/>
 * date: 2022/7/21 14:06<br/>
 *  只需要getter即可
 * @author 哎,就是玩儿<br />
 * @since JDK 1.8
 */
@Getter
public enum ResultEnum {
    OK(true,200,"请求成功"),
    NOT_FOUND(false,404,"资源不存在");
    private Boolean success;
    private Integer code;
    private String message;
    ResultEnum(boolean success,Integer code,String message){
        this.success = success;
        this.code = code;
        this.message = message;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以提供一个简单的示例来实现使用MQ发送邮箱短信注册的功能。在这个示例中,我们将使用RabbitMQ作为我们的消息代理。 首先,我们需要在我们的Spring Boot项目中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 接下来,我们需要配置RabbitMQ连接和队列: ```yml spring: rabbitmq: host: localhost port: 5672 username: guest password: guest myapp: queue: email: email_queue sms: sms_queue ``` 然后,我们可以创建一个消息生产者来发送消息到队列: ```java @Component public class MessageProducer { @Autowired private RabbitTemplate rabbitTemplate; @Value("${myapp.queue.email}") private String emailQueue; @Value("${myapp.queue.sms}") private String smsQueue; public void sendEmail(String email) { rabbitTemplate.convertAndSend(emailQueue, email); } public void sendSms(String phone) { rabbitTemplate.convertAndSend(smsQueue, phone); } } ``` 最后,我们可以创建一个消息消费者来处理队列中的消息: ```java @Component public class MessageConsumer { @Autowired private MailSender mailSender; @Autowired private SmsSender smsSender; @Value("${myapp.queue.email}") private String emailQueue; @Value("${myapp.queue.sms}") private String smsQueue; @RabbitListener(queues = "${myapp.queue.email}") public void receiveEmail(String email) { mailSender.send(email, "Registration successful"); } @RabbitListener(queues = "${myapp.queue.sms}") public void receiveSms(String phone) { smsSender.send(phone, "Registration successful"); } } ``` 这样,我们就可以通过调用消息生产者的`sendEmail`和`sendSms`方法来发送消息到相应的队列,然后消息消费者会自动从队列中获取消息并进行处理。 需要注意的是,在实际开发中,我们可能需要使用异步方式来发送邮件和短信,以免阻塞主线程。我们可以使用`AsyncTaskExecutor`或`CompletableFuture`等方式来实现异步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值