这篇文章写的简单明了,直接拷贝即可实现,唯一我觉得可能不够友好的是就是JAR包没有体现对刚接触JAVA邮件的小伙伴来说可能有点难度因此这次将对应的几个JAR包出处以及MAVEN依赖增加一下。

思路:Java创建Excel,返回一个ByteArrayOutputStream 流   ==>   sendEmail()接受ByteArrayOutputStream 流以附件的形式发送出去

本项目为maven项目,需要导入 JAVA POI 依赖,JAVA MAIL依赖。

<dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180813</version><!--注意:20160810版本不支持JSONArray-->
        </dependency>
        <!-- Javamail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.4</version>
        </dependency>
      <!--读取excel文件-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
   <!--文件上传组件-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>

创建Excel表格:

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.json.JSONArray;

import java.io.IOException;
public class CreatExcel {
	public static ByteArrayOutputStream creatExcel(String[] title, JSONArray all) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		//创建一个表格
		Workbook workbook = new XSSFWorkbook();
		// 创建一个工作薄对象
		XSSFSheet sheet = (XSSFSheet) workbook.createSheet("sheet1");
		//设置首行
		XSSFRow row0 = sheet.createRow(0);
		for(int i=0;i<title.length;i++) {
			XSSFCell cell = (XSSFCell) row0.createCell(i);
            cell.setCellValue(title[i]);
		}
		try {
			workbook.write(baos); // write excel data to a byte array
			baos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("创建成功 office excel");
		return baos;
	}
}

Java 邮件发送附件:

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.json.JSONArray;

import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;

import java.io.IOException;
import java.util.Properties;
public class SendEmail {
	public static boolean sendEmail(String to,ByteArrayOutputStream baos) {
        // 发件人电子邮箱
        String from = "*****@";
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器 ->QQ 邮件服务器
        properties.setProperty("mail.smtp.host", "smtp.");
        properties.put("mail.smtp.auth", "true");
        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties,new Authenticator(){
          public PasswordAuthentication getPasswordAuthentication()
          {
           return new PasswordAuthentication("*******@", "******"); //发件人邮件用户名、授权码
          }
         });
   
        try{
           // 创建默认的 MimeMessage 对象
           MimeMessage message = new MimeMessage(session);
           // Set From: 头部头字段
           message.setFrom(new InternetAddress(from));
           // Set To: 头部头字段
           message.addRecipient(,new InternetAddress(to));
           // Set Subject: 头部头字段
           message.setSubject("This is the Subject Line!");
           /*添加附件*/
           Multipart multipart = new MimeMultipart();   
           if(baos != null) {
               MimeBodyPart fileBody = new MimeBodyPart();
               DataSource source = new ByteArrayDataSource(baos.toByteArray(), "application/msexcel");
               fileBody.setDataHandler(new DataHandler(source));
               // 中文乱码问题
               fileBody.setFileName(MimeUtility.encodeText("ww.xlsx"));
               multipart.addBodyPart(fileBody);
           }
           message.setContent(multipart);
           // 发送消息
           Transport.send(message);
           System.out.println("Sent message successfully....from runoob.com");
        }catch (MessagingException mex) {
           mex.printStackTrace();
        } catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	public static void main(String[] args) {
		JSONArray all = new JSONArray();
		String[] title = {"哈哈","hahahah"};
		ByteArrayOutputStream  baos = CreatExcel.creatExcel(title, all);
		SendEmail.sendEmail("******@",baos);
	}
}

顺带说一句如何获取QQ邮箱的授权码。

  1. 登录电脑版QQ邮箱,选择最上方的“设置”。

    java poi下载 java poi jar包_apache

  2. 如图选择“账户”,切换到账户详情页面。

    java poi下载 java poi jar包_json_02

  3. 在账户页面往下拉,可以看到pop3设置,选择“开启”。

    java poi下载 java poi jar包_java poi下载_03

  4. 按照弹出的窗口提示操作进行密保验证。有多种方式可以验证,比如手机令牌等。推荐使用短信验证。

    java poi下载 java poi jar包_apache_04

  5. 按照短信验证的提示发送短信。发送成功后直接点击“我已发送”。

    java poi下载 java poi jar包_java_05

  6. 弹出的提示中直接显示16位的授权码,可以复制下来,或者是记下来,千万不要记错了。然后点击“确定”。

    java poi下载 java poi jar包_apache_06

  7. 下方的收取选项一般是默认30天的,点击下拉箭头,选择“全部”,并点击页面最下方的保存更改。千万别忘了点击保存,不然之前做的都白费了!

    java poi下载 java poi jar包_java_07

  8. 8
    最后就是到需要授权码的那些地方输入刚获得的16位授权码就可以了。