当前位置 : 主页 > 编程语言 > java >

Spring Boot实现自动发送邮件

来源:互联网 收集:自由互联 发布时间:2021-05-10
研究此程序的前提是经理给我安排的一个任务,盯着每天的问号箱(跟公司的业务有关,负责集装箱管理的),只要一有产生,就立马报告给另一个经理,我当时就想:如此机械性的操

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

首先我们有一个问号箱管理的接口,此接口会实时性的产生问号箱的数据,程序总的思路就是数据一有更新,立马发送一条信息给经理。原先我想到的是通过微信来发送信息,因为工作中就是通过它来传达消息的,但是研究了一下,微信好像没有提供这样的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

至此,程序已完成。

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

网友评论