java实现 生成excel附件表格 群发/单发 附件 到邮箱

该博客介绍了如何使用Java的javax.mail和Apache POI库来创建并发送带有Excel附件的电子邮件。首先,通过POI库创建Excel工作簿,写入数据,然后将其转换为字节数组输入流。接着,配置邮件发送的属性,如SMTP服务器和授权信息,创建MimeMessage对象,并添加邮件内容和附件。最后,通过Transport发送邮件,实现群发或单发功能。
摘要由CSDN通过智能技术生成

使用javax.mail和poi生成excel表格 群发/单发 附件 到邮箱

  1. maven导入依赖:`
<!--poi生成excel依赖-->
		<dependency>
		  <groupId>org.apache.poi</groupId>
		  <artifactId>poi-ooxml</artifactId>
		  <version>3.17</version>
		</dependency>
		<dependency>
		  <groupId>org.apache.poi</groupId>
		  <artifactId>poi</artifactId>
		  <version>3.17</version>
		</dependency>

<!-- 发送邮件依赖 -->
<!--        发送邮件主要依赖这个包 导入的时候注意一下 不要导成了下面com.sun.mail-->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>javax.mail-api</artifactId>
            <version>1.6.0</version>
        </dependency>

<!--        代码里面主要session依赖这个包 不要导错了-->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.0</version>
        </dependency>
    </dependencies>
  1. 使用poi制作excel生成字节数组输入流
   //创建工作簿(传入的是我的数据集合 )
    public InputStream markExcelByDataList(List<MemberInfo> dataList) {
        String sheetName = "erp采购执行人员消息";
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet(sheetName);
        //表头
        String[] headers = {"采购人员名称", "采购人员手机号码"};
        int[] widths = {4000, 9000};

        //写入表头
        XSSFRow row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            sheet.setColumnWidth(i, widths[i]);
            XSSFCell cell = row.createCell(i);
            XSSFRichTextString text = new XSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }

        //写入数据
        for (int i = 0; i < dataList.size(); i++) {
            XSSFRow rowObj = sheet.createRow(i + 1);
            rowObj.createCell(0).setCellValue(dataList.get(i).getName());
            rowObj.createCell(1).setCellValue(dataList.get(i).getMobile());
        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            workbook.write(bos);
            bos.flush();
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("创建工作簿异常");
        }
        byte[] bt = bos.toByteArray();
        return new ByteArrayInputStream(bt, 0, bt.length);
    }

  1. 发送邮件(传入上面的输入流,附件文件名称)
public boolean sendExcelEmail(InputStream is, String fileName) {
        Transport transport = null;
        try {
            System.setProperty("mail.mime.splitlongparameters", "false");
            Properties props = new Properties();
            // 设置发送邮件的邮件服务器的属性 (”主机固定key名称“,"公司邮箱服务器地址 例如qq的是smtp.qq.com 可以在QQ邮箱看到的");
            props.put("mail.smtp.host", "smtp.xxxxx.com");
            // 需要经过授权,也就是有户名和密码的校验,这样才能通过验证(”固定key“,"固定boolean值")
            props.put("mail.smtp.auth", "true");
            // 用刚刚设置好的props对象构建一个session
            Session session = Session.getDefaultInstance(props);
            // 在发送邮件的过程中在console处显示过程信息
            session.setDebug(false);
            // 用session为参数定义消息对象
            MimeMessage message = new MimeMessage(session);
            // 加载发件人地址(这是我公司的企业邮箱地址)
            message.setFrom(new InternetAddress("xxxxx@xxx.com"));

            //邮件群发 maillArray为收件人地址
            String[] mailArray = {"xxxxxxxxxxx@qq.com", "xxxxxxxxxx@qq.com"};
            InternetAddress address[] = new InternetAddress[mailArray.length];
            for (int i = 0; i < mailArray.length; i++) {
                address[i] = new InternetAddress(mailArray[i]);
            }
            // 邮件单发(上面群发的就不要了)
//            message.addRecipient(Message.RecipientType.TO, new InternetAddress("收件人地址@qq.com"));
            // 加载邮件标题
            message.setSubject(fileName);
            // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
            Multipart mimeMultipart = new MimeMultipart();
            // 设置邮件的文本内容(因为发的是附件 所以需要这个)
            BodyPart contentPart = new javax.mail.internet.MimeBodyPart();
            contentPart.setText("请查看附件");
            mimeMultipart.addBodyPart(contentPart);
            // 添加附件
            BodyPart messageBodyPart = new javax.mail.internet.MimeBodyPart();
            DataSource source = new ByteArrayDataSource(is, "application/msexcel");
            // 添加附件的内容
            messageBodyPart.setDataHandler(new DataHandler(source));
            // 添加附件的标题(因为发送的是excel  所以一定要有这个注释)
            messageBodyPart.setFileName(MimeUtility.encodeText(fileName + ".xls"));
            mimeMultipart.addBodyPart(messageBodyPart);

            // 将multipart对象放到message中
            message.setContent(mimeMultipart);
            // 保存邮件
            message.saveChanges();
            // 发送邮件
            transport = session.getTransport("smtp");
            // 连接服务器的邮箱(公司邮箱服务器地址 和上面那个一样,邮箱账户,邮箱密码)
            transport.connect("smtp.xxxxx.com", "xxxx@xxx.com", "密码");
            // 把邮件发送出去  群发
            transport.sendMessage(message, address);
            //  把邮件发送出去  单发(上面群发就不要了)
            //            transport.sendMessage(message, message.getAllRecipients());
            return true;
        } catch (Throwable e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                transport.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  1. 调用发送方法
 //创建工作簿(传入数据集合)
            InputStream inputStream = this.markExcelByDataList(dataList);
            //群发邮件
            boolean res = this.sendExcelEmail(inputStream, "附件名称");
            if (res) {
                logger.info("发送rep采购员人员信息成功");
                return true;
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值