Spring Boot实现自动发送邮件

 更新时间:2020年02月12日 10:56:49   作者:javaStudentZhang  
这篇文章主要为大家详细介绍了Spring Boot实现自动发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

研究此程序的前提是经理给我安排的一个任务,盯着每天的问号箱(跟公司的业务有关,负责集装箱管理的),只要一有产生,就立马报告给另一个经理,我当时就想:如此机械性的操作、逻辑清晰明了,肯定是可以用程序来解决的。同时感叹计算机的伟大,代码真的是改变了我们的生活。

首先我们有一个问号箱管理的接口,此接口会实时性的产生问号箱的数据,程序总的思路就是数据一有更新,立马发送一条信息给经理。原先我想到的是通过微信来发送信息,因为工作中就是通过它来传达消息的,但是研究了一下,微信好像没有提供这样的API,无奈放弃微信,想到邮件肯定是有的,立马搜到了一个纯java写的,主要用到的是javax.mail.jar包,动手写了一下确实可以发送邮件,但是,我想把这个程序写成一个接口,在前端代码的配合下调用此接口。所以基于Maven搭建了一个SpringBoot框架,项目依赖:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>SendMail</groupId>
 <artifactId>SendMail</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>
 
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.4.3.RELEASE</version>
 <relativePath />
 </parent>
 <dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
 </dependency>
 
 </dependencies>
 
 
 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <java.version>1.8</java.version>
 </properties>
 
 <build>
 <plugins>
  <plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  </plugin>
 </plugins>
 </build>
</project>

添加好依赖后项目名右键,java EE Tools > Generat Deployment  Descriptor Stub ,然后Maven > Update Project 。
在src/main/resources目录下手动添加application.properties文件,可以把邮箱的用户名、密码写到这里,此处我只配置了项目的端口号,

server.port=10000。项目结构:

接下来就写代码,首先是程序启动的代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
@EnableAutoConfiguration
public class SendMailApplication {
 
 
 public static void main(String[] args) { 
    SpringApplication.run(SendMailApplication.class, args); 
  } 
}

接口层的代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
 
import com.domain.Message;
import com.service.MailService; 
 
@RestController 
@RequestMapping(value="/main")
public class Mail {
 @Autowired 
  JavaMailSender mailSender; 
 
 @RequestMapping(value="/sendemail/{roadName}/{recordTime}/{truckName}",method = RequestMethod.GET )
 
   public void sendEmail(@PathVariable(value = "roadName",required = true) String roadName,
    @PathVariable(value = "recordTime",required = true) String recordTime,
    @PathVariable(value = "truckName",required = true) String truckName) 
   { 
     try 
     { 
     Message msg = new Message(roadName,recordTime,truckName);
     MailService.send(msg);
     
/*       final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
//       final MimeMessageHelper message = new MimeMessageHelper(mimeMessage); 
//       message.setFrom("*********@163.com "); 
//       message.setTo("*******@qq.com"); 
//       message.setSubject("测试邮件主题"); 
//       message.setText("测试邮件内容"); 
//       this.mailSender.send(mimeMessage); 
     
*/        
      
     } 
     catch(Exception ex) 
     { 
      
     } 
   } 

注销掉的部分为Springboot的邮件发送到的写法,我没用,接下来是我用到的写法。service层,这一段直接拷贝,谢谢那位大哥,搞得这么详细:

import java.util.Date;
import java.util.Properties;
 
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
 
import com.domain.Message;
 
@Service
public class MailService {
 
 // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
  // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”), 
  //   对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
 @Value("${spring.mail.username}")
  public static String myEmailAccount = "****@163.com";
 //  
 @Value("${spring.mail.password}")
  public static String myEmailPassword = "********";
 
  // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
  // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
  public static String myEmailSMTPHost = "smtp.163.com";
 
  // 收件人邮箱(替换为自己知道的有效邮箱)
  public static String receiveMailAccount = "*****@126.com";
 
  public static void send(Message msg) throws Exception {
    // 1. 创建参数配置, 用于连接邮件服务器的参数配置
    Properties props = new Properties();          // 参数配置
    props.setProperty("mail.transport.protocol", "smtp");  // 使用的协议(JavaMail规范要求)
    props.setProperty("mail.smtp.host", myEmailSMTPHost);  // 发件人的邮箱的 SMTP 服务器地址
    props.setProperty("mail.smtp.auth", "true");      // 需要请求认证
 
    // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
    //   如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
    //   打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
    /*
    // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
    //         需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
    //         QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
    final String smtpPort = "465";
    props.setProperty("mail.smtp.port", smtpPort);
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.socketFactory.fallback", "false");
    props.setProperty("mail.smtp.socketFactory.port", smtpPort);
    */
 
    // 2. 根据配置创建会话对象, 用于和邮件服务器交互
    Session session = Session.getInstance(props);
    session.setDebug(true);                 // 设置为debug模式, 可以查看详细的发送 log
 
    // 3. 创建一封邮件
    MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount,msg);
 
    // 4. 根据 Session 获取邮件传输对象
    Transport transport = session.getTransport();
 
    // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
    // 
    //  PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
    //      仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
    //      类型到对应邮件服务器的帮助网站上查看具体失败原因。
    //
    //  PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
    //      (1) 邮箱没有开启 SMTP 服务;
    //      (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
    //      (3) 邮箱服务器要求必须要使用 SSL 安全连接;
    //      (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
    //      (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
    //
    //  PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
    transport.connect(myEmailAccount, myEmailPassword);
 
    // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
    transport.sendMessage(message, message.getAllRecipients());
 
    // 7. 关闭连接
    transport.close();
  }
 
  /**
   * 创建一封只包含文本的简单邮件
   *
   * @param session 和服务器交互的会话
   * @param sendMail 发件人邮箱
   * @param receiveMail 收件人邮箱
   * @return
   * @throws Exception
   */
  public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail,Message msg) throws Exception {
    // 1. 创建一封邮件
    MimeMessage message = new MimeMessage(session);
 
    // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称)
    message.setFrom(new InternetAddress(sendMail, "*******", "UTF-8"));
 
    // 3. To: 收件人(可以增加多个收件人、抄送、密送)
    message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "Dear", "UTF-8"));
 
    // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
    message.setSubject("问号箱信息 \n时间: "+new Date(), "UTF-8");
 
    // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
    message.setContent("时间:"+msg.getRecordTime()+" 车号:"+msg.getTruckName()+" 道口:"+msg.getRoadName(), "text/html;charset=UTF-8");
 
    // 6. 设置发件时间
    message.setSentDate(new Date());
 
    // 7. 保存设置
    message.saveChanges();
 
    return message;
  }

前端主要是ajax调用接口,代码不发了,另外还有一个实体类Message。好,右键项目Run As > Maven install 打包

打包完成。

jar包在target目录下面,写一个批处理运行:java -jar SendMail-0.0.1-SNAPSHOT.jar            pause

至此,程序已完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java对double数组排序示例分享

    java对double数组排序示例分享

    这篇文章主要介绍了java对double数组排序示例,代码简单,下面我们直接上代码,需要的朋友可以参考下
    2014-03-03
  • rabbitmq使用springboot实现direct模式(最新推荐)

    rabbitmq使用springboot实现direct模式(最新推荐)

    这篇文章主要介绍了rabbitmq使用springboot实现direct模式,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Spring Boot中的WebSocketMessageBrokerConfigurer接口使用

    Spring Boot中的WebSocketMessageBrokerConfigurer接口使用

    在SpringBoot中,我们可以使用 WebSocketMessageBrokerConfigurer接口来配置WebSocket消息代理,以实现实时通信,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • java通过PDF模板填写PDF表单

    java通过PDF模板填写PDF表单

    这篇文章主要为大家详细介绍了java通过PDF模板填写PDF表单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Java版画板的实现方法

    Java版画板的实现方法

    这篇文章主要为大家详细介绍了Java版画板的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Maven依赖爆红的几种解决思路

    Maven依赖爆红的几种解决思路

    本文介绍了多种解决Maven依赖爆红的方法,包括删除.lastupdate文件、更改镜像设置、配置私服、删除错误依赖、手动修改依赖和检查pom文件错误等,通过这些方法可以有效解决Maven项目中遇到的依赖问题,感兴趣的可以了解一下
    2024-10-10
  • Spring Cloud Config工作原理概述

    Spring Cloud Config工作原理概述

    Spring Cloud Config 是 Spring Cloud 生态系统的一部分,它提供了一种集中化管理应用配置的方法,本文给大家介绍Spring Cloud Config工作原理概述,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • java接口性能从20s优化到500ms示例详解

    java接口性能从20s优化到500ms示例详解

    这篇文章主要为大家介绍了java接口性能从20s优化到500ms的操作技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Java任务定时执行器案例的实现

    Java任务定时执行器案例的实现

    定时器会执行指定的任务,本文主要介绍了Java任务定时执行器案例的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Tree组件实现支持50W数据方法剖析

    Tree组件实现支持50W数据方法剖析

    这篇文章主要为大家介绍了Tree组件实现支持50W数据的方法剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论