Spring boot集成Javamail发送邮件

举报
加油O幸福 发表于 2021/11/23 17:53:44 2021/11/23
【摘要】 邮箱协议邮件传输协议:SMTP协议和POP3协议POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议...

邮箱协议

邮件传输协议:SMTP协议和POP3协议

POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。

SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。

SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

IMAP协议

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的

代码体现

1.pom中引入相关依赖

<!--spring boot集成javamail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2.yml配置邮件服务器地址

本次以163邮箱为例,

注意:此处的邮箱密码不是登录密码,是开通服务时的授权码!

要开通邮件的发送服务(SMTP),去邮箱客户端进行设置即可

tr:
  mail:
      # 邮件服务器地址
      smtpHost: smtp.163.com
       #账号
      account: xxxx@163.com
      # 密码
      password: xxxxx
      # smtp端口
      smtpPort: 465
      # 是否打开SSL
      smtpSSLEnabled: true
      # 发送地址
      smtpFromMail: xxxx@163.com

3.编写邮件工具类

package com.tr.common.utils;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
 

/**
 * email发送工具类
 */ 
@Component
public class SEmailUtils {

    /**
     * 用戶名
     */ 
    @Value("${tr.mail.account}")
    private  String account;
     /**
     * 密碼
     */ 
   @Value("${tr.mail.password}")
    private  String password;
    
   @Value("${tr.mail.smtpPort}")
    private Integer smtpPort ;
    
   @Value("${tr.mail.smtpSSLEnabled}")
    private Boolean smtpSSLEnabled;
    
   @Value("${tr.mail.smtpHost}")
    private String smtpHost ;
    
   @Value("${tr.mail.smtpFromMail}")
    private String smtpFromMail ; 
    
 

    public enum ResponseCode{
        //发送成功
        SENDSUCCESS,
        //发送失敗
        SENDFAIL,
        //邮箱格式不正确
        EMAILTYPEERR,
        //Email不能为空
        ISNULL
    }
    /**
    


    /**
     *   * 邮箱发送 
     * @param es 发送人配置
     * @param title 邮件标题
     * @param msg 邮件内容消息 可以是html
     * @param datas 数据附件 可为空
     * @param name 附件名称 可为空
     * @param targetEmail 收件人地址
     * @return 1:成功,0失敗
     */
    public  ResponseCode sendEmail(  String title , String msg , byte[] datas , String name , String...targetEmail  ){

        if (targetEmail==null || targetEmail.length == 0){
            return ResponseCode.ISNULL;
        }

 
        
        System.setProperty("mail.mime.splitlongparameters","false");
        //设置访问smtp服务器需要认证
        System.setProperty("mail.smtp.auth", "true");
        //设置访问服务器的协议
        System.setProperty("mail.transport.protocol", "smtp");
        //"网页快测异常网站告警" ;
        String subject = title ;
        try {
           HtmlEmail email = new HtmlEmail();
         email.setHostName(smtpHost );
         
         
         if(smtpSSLEnabled ) {
            email.setSslSmtpPort(smtpPort.toString());
         } else {
            email.setSmtpPort(smtpPort);
         }
         email.setAuthentication(account, password);
         email.setSSLOnConnect(smtpSSLEnabled);
          
         
         email.setFrom(smtpFromMail, smtpFromMail);

         //接收地址
         email.addTo(targetEmail);
         //抄送
         //email.addCc(es.getAccount());

            //邮件标题
         email.setSubject(subject);
         email.setCharset("UTF-8");
         

         MimeMultipart multipart = new MimeMultipart("mixed");
         // 邮件内容,采用HTML格式
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.removeHeader("Content-Type");
            messageBodyPart.removeHeader("Content-Transfer-Encoding");
            messageBodyPart.addHeader("Content-Type", "text/html; charset=gbk");
            messageBodyPart.addHeader("Content-Transfer-Encoding", "base64");
            messageBodyPart.setContent(msg, "text/html;charset=GBK");
            
            
            multipart.addBodyPart(messageBodyPart);
            
            email.addPart(multipart);
          
            if(datas != null) {
               javax.activation.DataSource ds = new ByteArrayDataSource(datas , "application/vnd.ms-excel");
             email.attach(ds,name, name);
            }
      
         
         email.send();
        } catch (EmailException e) {
         // TODO Auto-generated catch block
            e.printStackTrace();
             return  ResponseCode.SENDFAIL; 
      } catch (MessagingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }  
        
        return ResponseCode.SENDSUCCESS;
    }
    



}

4.单元测试,验证

注意事项:测试方法应该写在主程序入口test处,目录结构注意保持一致,否则汇报Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

package com.tr;

import com.tr.common.utils.SEmailUtils;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Test {

   @Autowired
   private SEmailUtils sEmailUtils;

   @org.junit.Test
   public void sendEmail() {
      sEmailUtils.sendEmail("测试邮箱发送","皮一下很开心0.0",null,null,"xxxx@qq.com");
   }

}

5.成功

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。