本文接上一篇,将得到的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. Ubuntu12.04下安装VirtualBox

    目录: 安装虚拟机VirtualBox 虚拟机VirtualBox安装win7全过程 虚拟机共享文件夹.U盘 一.安装虚拟机VirtualBox VirtualBox下载地址:https://www. ...

  2. 重载和const形参的学习心得

    在C++ primer 5th中,第6章的练习6.39(a)中,关于重载和const形参的学习心得. 练习6.39:说明在下面的每组声明中第二条声明语句是何含义.如果有非法的声明,请指出来. (a)  ...

  3. 前端HTML 与css 整理(未完)

    HTML 中的标签存放于文本文件中 需要按照以下固定的文档结构组织:<!DOCTYPE HTML><html> <head>头部相关信息 </head> ...

  4. API网络接口

    1.天气 文章:http://segmentfault.com/a/1190000002607883 地址:http://api.lib360.net/open/weather.json?city=北 ...

  5. CodeForces 623B【预处理+DP】

    题意: 给出n,a,b以及n个整数a1,a2-an, 可以对数组进行以下两种操作: (1)花费len*a的代价删除连续的len个数,len<|S| (2)花费b的代价将某一个a[i]加一或减一, ...

  6. Codeforces482B【线段树构造】

    题意: 有M个限制,每个限制有l,r,q,表示从a[l]~a[r]取且后的数一定为q,问是否有满足的数列. 思路: 看到大牛说是线段树,线段树对于区间操作,印象中乘啊,+啊,-啊都不错,但是并没有就是 ...

  7. 强大的在线web编辑器UEditor

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. UEditor在线演示地址:http://u ...

  8. mongodb 由于计算机死机造成的无法启动故障

    一次计算机死机,重启后,mongodb无法启动,log显示: exception in initAndListen: 12596 old lock file, terminating Sun Mar ...

  9. js 判断当前操作系统 ios, android, 电脑端

    一 .   js判断移动端的操作系统(ios或Android) $(function () { var u = navigator.userAgent; var isAndroid = u.index ...

  10. A - Beautiful numbers

    #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...