本文接上一篇,将得到的Excel表发送到邮箱。、

  在上一篇中,本人使用的是直接从数据库中获取数据,然后包装成Excel表。现在将该Excel表发送到目的邮箱,如果需要跟上篇一样,定时每天某时刻发送,就需要定时清理数据库。如果直接从客户端获取数据然后直接包装发送,可使用流的思想,不需要保存数据库中。首先使用一个Excel模板保存客户端数据,然后再发送到邮箱。

  代码:

  {

    HSSFWorkbook wb = new HSSFWorkbook();        

    //将表数据保存在输出流中
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    wb.write(baos);
    baos.flush();
    byte[] bytes = baos.toByteArray();
    //将数据保存在输入流中,将作为邮箱发送的附件对象
    InputStream iStream = new ByteArrayInputStream(bytes, 0,
    bytes.length);
    baos.close();

    String content = "这个一个java发送邮箱的测试!";     // 正文内容
    String email = "2570316162@qq.com";           // 发送邮箱
    String subject = "客户信息";              //文件主题

    //本文中实现发送主要为sendMail()方法体  
    sendMail(subject,email,content,iStream)

  }

  

  private boolean sendMail(String subject, String email,String content,InputStream iStream) {
    boolean isFlag = false;
    try {
      String smtpFromMail = "447123463@qq.com"; //账号
      String pwd = "arzpwxgtvisxbhce"; //密码,该密码为服务授权码

      //此处为认证机制对象
      /*Authenticator auth = new Authenticator() {
        public PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication("smtpFromMail ", "pwd ");//注意此处password为smtp服务授权码,不是qq密码
        }
      };*/

      //配置属性
      Properties properties = new Properties();
      properties.put("mail.transport.protocol", "smtp");
      properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");//当出现 "smtp.exmail.qq.com" port 465, isSSL false" 错误时,可以配置这个
      //properties.put("mail.smtp.socketFactory.port", 465);
      properties.put("mail.smtp.ssl.enable", "true");
      properties.put("mail.smtp.port", "465");
      properties.put("mail.smtp.host","smtp.qq.com");

      //发送协议论证,选中了就要有相应的论证机制。
      //如果有Authenticator 对象,需要使用properties.put("mail.smtp.auth",auth)论证
      //本文中由transport.connect(smtpFromMail,pwd)进行论证
      properties.put("mail.smtp.auth","true");
      Session session = Session.getDefaultInstance(properties);
      session.setDebug(true); //可以从控制台中看一下服务器的响应信息

      //用MIME协议能生成一封有文字、图片和附件的复杂邮件
      MimeMessage mimeMessage = new MimeMessage(session);
      try {
        //设置基本信息
        mimeMessage.setFrom(new InternetAddress(smtpFromMail));    //设置发送邮箱 
        mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(email));//设置接收邮箱。 
        mimeMessage.setSubject(subject);
        mimeMessage.addHeader("charset", "UTF-8");

        //Multipart添加正文内容
        Multipart multipart = new MimeMultipart();
        BodyPart contentPart = new MimeBodyPart();
        contentPart.setText(content);
        contentPart.setHeader("Content-Type","text/html; charset=UTF-8");
        multipart.addBodyPart(contentPart);

        //Multipart添加附件
        MimeBodyPart fileBodyPart = new MimeBodyPart();
        DataSource source = new ByteArrayDataSource(iStream, "application/msexcel");  //Excel样式的附件
        //DataSource source = new ByteArrayDataSource(is, "application/octet-stream");
        fileBodyPart.setDataHandler(new DataHandler(source));
        String fileName = "用户信息列表.xls";
        fileBodyPart.setFileName(MimeUtility.encodeText(fileName,"UTF-8",null));//中文乱码问题
        multipart.addBodyPart(fileBodyPart);

        mimeMessage.setContent(multipart);
        mimeMessage .setSentDate(new Date());
        mimeMessage.saveChanges();

        //传送
        //Transport transport = session.getTransport("smtp");
        Transport transport = session.getTransport();
        transport.connect(smtpFromMail,pwd);    // 有进行协议论证
        transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());  
        transport.close();
        isFlag = true;
      } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        isFlag = false;
      }
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  return isFlag;
}

发送邮箱主要有邮箱的基本信息设置,数据源设置,协议端口,认证等设置。关于协议端口,发送方一般为“smtp”与“465”,host有“smtp.qq.com”与“smtp.exmail.qq.com”,“smtp.136.com”等的区别。

另外,对于设置接收邮箱,如果有多个接收方,可在发送邮件时Transport的sendMessage()方法指定收件人时使用数组来指定收件人,也可使用Message对象来添加收件人时使用InternetAddress对象的parse(String string)方法,如:InternetAddress.parse(“2577336655@qq.com”,”2578895667@qq.com”,...);

将生成的Excel表发送到邮箱的更多相关文章

  1. JAVA笔记-如何将百万级数据高效的导出到Excel表单

    今天,一朋友问我使用JAVA有没有什么办法导出百万级的数据到Excel工作表. 当时我的第一个念头就是这真的是一个好疯狂的念头.然后就想假如真的有这样类似的需求,我自己应该怎么做呢? ps: 首先科普 ...

  2. WebService--导出excel并将excel发送到邮箱

    1.利用NPOI生成EXCEL 2.导出excel之后发送邮件 //导出excel //path :保存路径 //dt:要导出的数据 public static bool DataTableToExc ...

  3. unity 读取excel表 生成asset资源文件

    做unity 项目也有一段时间了,从unity项目开发和学习中也遇到了很多坑,并且也从中学习到了很多曾经未接触的领域.项目中的很多功能模块,从今天开始把自己的思路和代码奉上给学渣们作为一份学习的资料. ...

  4. Python+Selenium+Unittest+HTMLTestRunner生成测试报告+发送至邮箱,记一次完整的cnblog登录测试示例,

    测试思路:单个测试集.单个测试汇成多个测试集.运行测试集.生成测试报告.发送至邮箱. 第一步:建立单个测试集,以cnblog登录为例. 测试用例: cnblog的登录测试,简单分下面几种情况:(1)用 ...

  5. python查询mysql并生成excel表

    需求说明 开发不愿意单独为某个项目做后台 并且运营那边需要合并多个表的数据 因此找上了我. 要求每周执行一次.月初也执行一次 要查询2个mysql数据库多个表并生成excel表 我的想法 找开发要sq ...

  6. C#/Net定时导出Excel并定时发送到邮箱

    一.定时导出Excel并定时发送到邮箱   首先我们先分析一下该功能有多少个小的任务点:1.Windows计划服务 2.定时导出Excel定指定路径 3.定时发送邮件包含附件   接下来我们一个个解决 ...

  7. 后端队列生成pdf,发送到邮箱

    最开始可以先将你想要的pdf模板写好先,如testPage <!DOCTYPE html> <html> <head> <meta http-equiv=&q ...

  8. BI之路学习笔记2--SSIS/ETL设计练习三:《DB->定期生成excel表》

    上次笔记记到,用sql任务给参数赋值,映射到变量,然后把数据流任务放到序列容器中进行执行,可以定期生成excel, 现在的问题是: 在EXCEL目标编辑过程中,必须选定某一个特定的excel目标,这样 ...

  9. ASP.NET导出excel表方法汇总

    asp.net里导出excel表方法汇总  1.由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) ...

随机推荐

  1. NLTK vs SKLearn vs Gensim vs TextBlob vs spaCy

    Generally, NLTK is used primarily for general NLP tasks (tokenization, POS tagging, parsing, etc.) S ...

  2. [转载] C++ 类中的类成员变量怎么调用带参数的构造函数来初始化?

    #include "stdafx.h" class A { public: A(){ax = ;}; A(int a){ax = a;}; int ax; }; class B { ...

  3. log4j的学习和log4j在程序中使用的加载作用过程

    昨天进行代码评审的时候,大家都纠结在了日志信息应该如何输出上,其实我想大家应该一直都在使用log4j来对日志信息进行输出,但是未想应该有很大一部分人对log4j是不了解的,我遇到这个问题的时候也到网上 ...

  4. (转)data Table的用法大全

    jqyery dataTable 基本用法 一:官方网站:[http://www.datatables.net/] 二:基本使用:[http://www.guoxk.com/node/jquery-d ...

  5. HDU-2616

    Kill the monster Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. Asset Catalog Help (八)---Customizing Image Sets for Devices

    Customizing Image Sets for Devices Add images to a set that are customized for display on the device ...

  7. 第三篇:SpringBoot用JdbcTemplates访问Mysql

    本文介绍springboot通过jdbc访问关系型mysql,通过spring的JdbcTemplate去访问. 准备工作 jdk 1.8 maven 3.0 idea mysql 初始化mysql: ...

  8. android调试之adb

    ADB 其实大部分的PC开发机与Android设备的操作都是通过adb(android debug bridge)技术完成的,这是一个C/S架构的命令行工具,主要由三个部分组成 运行在PC开发机上的命 ...

  9. Makefile研究(二)—— 完整可移植性模板

    转自:http://blog.csdn.net/jundic/article/details/17676461 一直想写一个很全很好移植的Makefile模板,我觉得一个完整makefile 应该包含 ...

  10. LeetCode: 485 Max Consecutive Ones(easy)

    题目: Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: ...