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

至此,程序已完成。

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

(0)

相关推荐

  • SpringBoot使用FreeMarker模板发送邮件

    本文实例为大家分享了SpringBoot +Mail+FreeMarker发送邮件,供大家参考,具体内容如下 通过spirngboot 自带的mail服务及FreeMarker模板引擎,发送邮 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </depen

  • Spring Boot实战之发送邮件示例代码

    一.邮件服务简介 邮件服务在互联网早期就已经出现,如今已成为人们互联网生活中必不可少的一项服务.那么邮件服务是怎么工作的呢?如下给出邮件发送与接收的典型过程: 1.发件人使用SMTP协议传输邮件到邮件服务器A: 2.邮件服务器A根据邮件中指定的接收者,投送邮件至相应的邮件服务器B: 3.收件人使用POP3协议从邮件服务器B接收邮件. SMTP(Simple Mail Transfer Protocol)是电子邮件(email)传输的互联网标准,定义在RFC5321,默认使用端口25: POP3(

  • Spring Boot中利用JavaMailSender发送邮件的方法示例(附源码)

    快速入门 在Spring Boot的工程中的pom.xml中引入spring-boot-starter-mail依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 如其他自动化配置模块一样,在完成了依赖引入之后,只需要在applicatio

  • SpringBoot JavaMailSender发送邮件功能

    本文实例为大家分享了SpringBoot JavaMailSender发送邮件的具体代码,供大家参考,具体内容如下 引入Maven依赖包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 163邮箱 application.properties

  • Spring Boot 发送邮件功能案例分析

    邮件服务简介 邮件服务在互联网早期就已经出现,如今已成为人们互联网生活中必不可少的一项服务.那么邮件服务是怎么工作的呢?如下给出邮件发送与接收的典型过程: 1.发件人使用SMTP协议传输邮件到邮件服务器A: 2.邮件服务器A根据邮件中指定的接收者,投送邮件至相应的邮件服务器B: 3.收件人使用POP3协议从邮件服务器B接收邮件. SMTP(Simple Mail Transfer Protocol)是电子邮件(email)传输的互联网标准,定义在RFC5321,默认使用端口25: POP3(Po

  • Spring Boot发送邮件详解

    Spring框架使用JavaMailSender接口为发送邮件提供了一个简单的抽象,并且Spring Boot也为它提供了自动配置和一个starter模块. 如果spring.mail.host和相关的库(通过spring-boot-starter-mail定义)都存在,一个默认的JavaMailSender将被创建.该sender可以通过spring.mail命名空间下的配置项进一步自定义,下面本站素文宅博客具体讲述一下Spring Boot如何实现发送邮件. 引入spring-boot-st

  • SpringBoot实现发送邮件功能

    背景 有个小伙伴问我你以前发邮件功能怎么弄的.然后我就给他找了个demo,正好在此也写一下,分享给大家. 理清痛点 发送邮件,大家可以想一下,坑的地方在哪? 我觉得是三个吧. 第一:邮件白名单问题. 第二:邮件超时问题. 第三:邮件带附件问题. 我下面的demo都会介绍这些问题及解决. 实现方案 准备工作 我们先要准备一个可以发送的邮箱,我这里以我的163邮箱为例,现在发送邮件的规则,要求你输入一种叫做授权码的东西,注意这个东西不是密码. 获取授权码的步骤: 当选择开启,通过验证之后就可以获取到

  • Spring Boot实现自动发送邮件

    研究此程序的前提是经理给我安排的一个任务,盯着每天的问号箱(跟公司的业务有关,负责集装箱管理的),只要一有产生,就立马报告给另一个经理,我当时就想:如此机械性的操作.逻辑清晰明了,肯定是可以用程序来解决的.同时感叹计算机的伟大,代码真的是改变了我们的生活. 首先我们有一个问号箱管理的接口,此接口会实时性的产生问号箱的数据,程序总的思路就是数据一有更新,立马发送一条信息给经理.原先我想到的是通过微信来发送信息,因为工作中就是通过它来传达消息的,但是研究了一下,微信好像没有提供这样的API,无奈放弃

  • Spring Boot集成JavaMailSender发送邮件功能的实现

    目录 前言 集成步骤 添加依赖 邮件配置信息 邮件配置类 代码实现 发送简单邮件 邮件实体类 业务实现类 测试类 扩展功能 发送Html内容的邮件 业务实现类 测试类 发送带附件邮件 业务实现类 测试类 发送模板邮件 添加依赖 模板内容 业务实现类 测试示例 总结 前言 项目中邮件发送为常用功能之一,例如注册成功后需要发送激活邮件,账号的会员到期提示,每日报表统计等功能都需要自动发送邮件,本文将讲解Spring Boot如何实现邮件发送功能. 集成步骤 添加依赖 <dependency> &l

  • 初识Spring Boot框架之Spring Boot的自动配置

    在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单的Spring Boot 自动配置的案例,看看这一切到底是怎么发生的. 假设我的需求是这样的:当我的项目中存在某个类的时候,系统自动为我配置该类的Bean,同时,我这个Bean的属性还可以在application.properties中进行配置,OK,就这样一个需求,我们来看看怎么实现. 1.新建s

  • Spring boot中@Conditional和spring boot的自动配置实例详解

    我们知道,spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean Thymeleaf是不是在Classpath里面?如果是,则自动配置Thymeleaf的模板解析器.视图解析器.模板引擎 那个这个是怎么实现的呢?原因就在于它利用了Spring的条件化配置,条件化配置允许配置存在于应用中

  • Spring Boot中自动执行sql脚本的实现

    说明:所有的代码基于SpringBoot 2.0.3版本 背景 在应用程序启动后,可以自动执行建库.建表等SQL脚本.下文中以要自动化执行people.sql脚本为例说明,脚本在SpringBoot工程中的路径为:classpath:people.sql,脚本的具体内容如下: CREATE TABLE IF NOT EXISTS people( persion_id BIGINT NOT NULL AUTO_INCREMENT, first_name VARCHAR(20), last_name

  • spring boot实现自动输出word文档功能的实例代码

    spring boot实现自动输出word文档功能 本文用到Apache POI组件 组件依赖在pom.xml文件中添加 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId&

  • 基于Spring Boot 排除自动配置的4个方法

    Spring Boot 排除自动配置 方法1 使用 @SpringBootApplication 注解,用 exclude 属性进行排除指定的类: @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class Application { // ... } 方法2 单独使用 @EnableAutoConfiguration 注解的时候: @EnableAutoConfiguration(excl

  • Spring Boot中自动执行sql脚本的方法实例

    目录 背景 实现核心 实现方法 注意 总结 说明:所有的代码基于SpringBoot 2.0.3版本 背景 在应用程序启动后,可以自动执行建库.建表等SQL脚本.下文中以要自动化执行people.sql脚本为例说明,脚本在SpringBoot工程中的路径为:classpath:people.sql,脚本的具体内容如下: CREATE TABLE IF NOT EXISTS people( persion_id BIGINT NOT NULL AUTO_INCREMENT, first_name

  • Spring Boot整合邮箱发送邮件实例

    目录 1.准备工作 2.代码整合 总结 1. 准备工作 登录进自己的 qq 邮箱获取授权码 设置 – 账户 – POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 点击开始获取授权码,将授权码保存下来,下面代码整合的时候需要使用 2. 代码整合 创建一个 Spring Boot 项目,引入以下依赖 <!-- email --> <dependency> <groupId>org.springframework.boot</groupI

随机推荐