zoukankan      html  css  js  c++  java
  • JAVA 写Excel附件 每天定时发送邮件

    JAVA 写Excel附件 每天定时发送邮件  

    2011-08-01 13:41:00|  分类: Java |字号 订阅

     
    http://hi.baidu.com/star850323/blog/item/63c5750f520e05ec37d1228d.html

    本项目需求如下:每天早上8点从数据库查出昨天收入报表,写道Execl中,然后发送到指定邮箱

    项目所需要的jar包activation.jar、jxl,jar、mail,jar、msbase.jar、MSSQL-Driver.jar、mssqlserver.jar、msutil.jar、servlet-api.jar

    运行方法:启动tomcat,即自动执行。tomcat启动时,会执行一次。所以如果没有技术问题,请勿重启Tomcat,因为每次重启都会发送一封邮件。

    1、写一个Servlet,用于实现每天早上8点定时执行发送邮件的任务:

    package com.email;

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.GregorianCalendar;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class SendMailServlet extends HttpServlet{
        private Timer timer;
        private SendMailTask tt;
    public SendMailServlet() {
       super();
    }

    public void destroy() {
       super.destroy();
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

       response.setContentType("text/html");
       PrintWriter out = response.getWriter();
       out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
       out.println("<HTML>");
       out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
       out.println(" <BODY>");
       out.print("    This is ");
       out.print(this.getClass());
       out.println(", using the POST method");
       out.println(" </BODY>");
       out.println("</HTML>");
       out.flush();
       out.close();
    }

    public void init() throws ServletException {
       Thread t = new Thread(){
        public void run(){
         timer = new Timer();
         tt = new SendMailTask();
         Calendar cal = new GregorianCalendar(2010, 0, 8, 0, 0, 0);// 从2010年1月8号8点开始执行
              Date date = cal.getTime();
         timer.schedule(tt, date, 24*60*60*1000);//8点后,每24小时执行一次
        }  
       };
       t.start();  
    }
    }

    2、在web.xml中加入如下配置

    <servlet>
        <servlet-name>SendMailServlet</servlet-name><!--邮件发送程序-->
        <servlet-class>com.email.SendMailServlet</servlet-class><!--servlet所在类-->
          <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>SendMailServlet</servlet-name><!--名字自取,但必须与servlet一样-->
       <url-pattern>/SendMailServlet</url-pattern>
    </servlet-mapping>

    3、servlet调用的任务类

    package com.email;

    import java.io.IOException;
    import java.sql.SQLException;
    import java.text.SimpleDateFormat;
    import java.util.TimerTask;
    import com.dao.*;

    public class SendMailTask extends TimerTask   
    {  
       public static long runTime = 1;  
       public SendMailTask()  
       {  
       }
     
       public void run()   
       {  
        java.util.Date   today=new   java.util.Date();
       today.setTime(today.getTime());
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String startdate = formatter.format(today);      
         String day = String.valueOf(Integer.parseInt(startdate.substring(8,10))-1);
         if(day.length()==1)
         startdate = startdate.substring(0,8)+"0"+day+" 00:00:00";
         else
         startdate = startdate.substring(0,8)+"0"+day+" 00:00:00";
         String date = startdate.substring(0,4)+startdate.substring(5,7)+startdate.substring(8,10);
        try {
         IncomeReport.statData();//生成EXCEL报表
        } catch (IOException e1) {
         e1.printStackTrace();
        } catch (SQLException e1) {
         e1.printStackTrace();
        }
        if(runTime>=100)  
         runTime = 0;  
         String host = "smtp.qq.com";
       String user = "12345678@qq.com";  
       String password = "123456";  
       String subject = "XX收入日报表";
       String[] to = {"12345678@qq.com","12345678@126.com"};
       String from = "12345678@qq.com";  
       String bodyashtml = "请查看附件(收入日报表)!";
       String attachfile = "E:\\projects\\tmp\\"+date+"_income.xls";//附件生成位置
        try {
        SendMail send = new SendMail();
        send
        .setHost(host);
        send.setUser(user);
        send.setPass(password);
        send.setSubject(subject);
        send.setFrom(from);
        send.setBodyAsHTML(bodyashtml);//以HTML形式存放内容
        send.addAttachFromFile(attachfile,""+date+"_income.xls");//附件路径,附件名称
        for(int i=0;i<to.length;i++){
         send.setTo(to[i]);
         send.send();
        }
        System.out.println(date+"邮件发送成功!");
       } catch (Exception e) {
        e.printStackTrace();
       }
       }  
    }
    4、发送邮件的程序

    package com.email;
    /**
    * @author 527251717
    * SendMail.java
    */
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;

    import javax.activation.DataHandler;
    import javax.activation.FileDataSource;
    import javax.activation.URLDataSource;
    import javax.mail.BodyPart;
    import javax.mail.Multipart;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeBodyPart;
    import javax.mail.internet.MimeMessage;
    import javax.mail.internet.MimeMultipart;
    import javax.mail.internet.MimeUtility;


    public class SendMail {
            public static String TEXT = "text/plain;charset=gb2312";
            public static String HTML = "text/html;charset=gb2312";
            private String host; //邮件服务器
            private String user; //用户名
            private String pass;//用户密码
            private String from;//发信人
            private String to;//收信人
            private String cc;//Carbon Copy, 抄送邮件给某人
            private String bc;//bcc Blind Carbon Copy,隐蔽副本 隐蔽抄送给某人
            private String subject;//邮件主题
            private BodyPart body;//邮件内容
            private boolean needAuth; //是否需要认证
            private List attaches;//邮件附件
    /**
    * 构造方法
    *
    */
            public SendMail() {
                    needAuth = true;
                    attaches = new ArrayList();
            }
            /**
             * 构造方法
             * @param host
             */
            public SendMail(String host) {
                    needAuth = true;
                    attaches = new ArrayList();
                    this.host = host;
            }
            /**
             * 构造方法
             * @param host
             * @param user
             * @param pass
             */
            public SendMail(String host, String user, String pass) {
                    needAuth = true;
                    attaches = new ArrayList();
                    this.host = host;
                    this.user = user;
                    this.pass = pass;
            }
    //设置邮件服务器是否需要认证
            public void setNeedAuth(boolean needAuth) {
                    this.needAuth = needAuth;
            }
            public void setFrom(String from) {
                    this.from = from;
            }
            public void setTo(String to) {
                    this.to = to;
            }
            public String getPass() {
                    return pass;
            }
            public String getUser() {
                    return user;
            }
            public void setPass(String string) {
                    pass = string;
            }
            public void setUser(String string) {
                    user = string;
            }

            public String getFrom() {
                    return from;
            }
            public String getHost() {
                    return host;
            }
            public boolean isNeedAuth() {
                    return needAuth;
            }
            public String getSubject() {
                    return subject;
            }
            public void setHost(String string) {
                    host = string;
            }
            public void setBlindTo(String bc) {
                    this.bc = bc;
            }
            public void setCopyTo(String cc) {
                    this.cc = cc;
            }
            public void setSubject(String subject) {
                    this.subject = subject;
            }
    /**
    * 设置邮件内容的形式
    * @param string
    * @param contentType
    */
            public void setBody(String string, String contentType) {
                    try {
                            body = new MimeBodyPart();
                            DataHandler dh = new DataHandler(string, contentType);
                            body.setDataHandler(dh);
                    } catch (Exception exception) {
                    }
            }
    /**
    * 设置邮件的内容的格式为文本格式
    * @param string
    */
            public void setBodyAsText(String string) {
                    setBody(string, TEXT);
            }
    /**
    * 以HTMl的形式存放内容
    * @param string
    */
            public void setBodyAsHTML(String string) {
                    setBody(string, HTML);
            }
    /**
    * 从文件中自动导入邮件内容
    * @param filename
    */
            public void setBodyFromFile(String filename) {
                    try {
                            BodyPart mdp = new MimeBodyPart();
                            FileDataSource fds = new FileDataSource(filename);
                            DataHandler dh = new DataHandler(fds);
                            mdp.setDataHandler(dh);
                            attaches.add(mdp);
                    } catch (Exception exception) {
                    }
            }
    /**
    * 从一个URL导入邮件的内容
    * @param url
    */
            public void setBodyFromUrl(String url) {
                    try {
                            BodyPart mdp = new MimeBodyPart();
                            URLDataSource ur = new URLDataSource(new URL(url));
                            DataHandler dh = new DataHandler(ur);
                            mdp.setDataHandler(dh);
                            attaches.add(mdp);
                    } catch (Exception exception) {
                    }
            }
    /**
    * 将String中的内容存放入文件showname,并将这个文件作为附件发送给收件人
    * @param string 为邮件的内容
    * @param showname 显示的文件的名字
    */
            public void addAttachFromString(String string, String showname) {
                    try {
                            BodyPart mdp = new MimeBodyPart();
                            DataHandler dh = new DataHandler(string, TEXT);
                            mdp.setFileName(MimeUtility.encodeWord(showname, "gb2312", null));
                            mdp.setDataHandler(dh);
                            attaches.add(mdp);
                    } catch (Exception exception) {
                    }
            }
    /**
    * filename为邮件附件
    *在收信人的地方以showname这个文件名来显示
    * @param filename
    * @param showname
    */
            public void addAttachFromFile(String filename, String showname) {
                    try {
                            BodyPart mdp = new MimeBodyPart();
                            FileDataSource fds = new FileDataSource(filename);
                            DataHandler dh = new DataHandler(fds);
                            mdp.setFileName(MimeUtility.encodeWord(showname, "gb2312", null));
                            mdp.setDataHandler(dh);
                            attaches.add(mdp);
                    } catch (Exception exception) {
                    }
            }
    /**
    * 将互联网上的一个文件作为附件发送给收信人
    * 并在收信人处显示文件的名字为showname
    * @param url
    * @param showname
    */
            public void addAttachFromUrl(String url, String showname) {
                    try {
                            BodyPart mdp = new MimeBodyPart();
                            URLDataSource ur = new URLDataSource(new URL(url));
                            DataHandler dh = new DataHandler(ur);
                            mdp.setFileName(MimeUtility.encodeWord(showname, "gb2312", null));
                            mdp.setDataHandler(dh);
                            attaches.add(mdp);
                    } catch (Exception exception) {
                    }
            }
    /**
    * 发送邮件,需要身份认证
    * @throws Exception
    */
            public void send() throws Exception {
                    try {
                       Properties props = new Properties();
                            if (host != null && !host.trim().equals(""))
                                    props.setProperty("mail.smtp.host", host);//key   value
                            else
                                    throw new Exception("没有指定发送邮件服务器");
                            if (needAuth)
                                    props.setProperty("mail.smtp.auth", "true");
                            Session s = Session.getInstance(props, null);
                            MimeMessage msg = new MimeMessage(s);
                            //设置邮件主题
                            msg.setSubject(subject);
                            //设置邮件发送时间
                            msg.setSentDate(new Date());
                            //指定发件人
                            if (from != null)
                                    msg.addFrom(InternetAddress.parse(from));
                            else
                                    throw new Exception("没有指定发件人");
                            //指定收件人
                            if (to != null)
                                    msg.addRecipients(javax.mail.Message.RecipientType.TO,InternetAddress.parse(to));
                            else
                                    throw new Exception("没有指定收件人地址");
                            //指定抄送
                            if (cc != null)
                                    msg.addRecipients(javax.mail.Message.RecipientType.CC,InternetAddress.parse(cc));
                            //指定密送
                            if (bc != null)
                                    msg.addRecipients(javax.mail.Message.RecipientType.BCC,InternetAddress.parse(bc));
                            Multipart mm = new MimeMultipart();
                            //设置邮件的附件
                            if (body != null)
                                    mm.addBodyPart(body);
                            for (int i = 0; i < attaches.size(); i++) {
                                    BodyPart part = (BodyPart) attaches.get(i);
                                    mm.addBodyPart(part);
                            }
    //    设置邮件的内容
                            msg.setContent(mm);
                            //保存所有改变
                            msg.saveChanges();
                            //发送邮件服务器(SMTP),简单邮件传输协议
                            Transport transport = s.getTransport("smtp");
                            //访问邮件服务器
                            transport.connect(host, user, pass);
                            //发送信息
                            transport.sendMessage(msg, msg.getAllRecipients());
                            //关闭邮件传输
                            transport.close();
                    } catch (Exception e) {
                       e.printStackTrace();
                            throw new Exception("发送邮件失败:", e);
                    }
            }
    }
    5、连接数据库的程序,数据库用的是SQL SERVER

    package com.dao;

    import java.sql.*;

    public final class DBConnection {

    Statement stmt = null;
    ResultSet rs = null;
    public DBConnection() {}

    public static Connection getConnection()
    {
            Connection con=null;
            String driver="net.sourceforge.jtds.jdbc.Driver";
            String url="jdbc:jtds:sqlserver://localhost:端口/数据库名"; //数据库端口根据自己的实际情况填写
            String user="sa";
            String password="密码";
        try
        {
        Class.forName(driver).newInstance();
        con=DriverManager.getConnection(url,user,password);
        }
        catch(Exception e)
        {
           e.printStackTrace();
        }
        return con;
    }

    /**
       * 关闭连接
       * @param conn
       */
       public static void close(Connection conn){
           try{
               if(conn!=null)
               conn.close();
               conn = null;
           }catch(SQLException e){
               //
           }
       }

       /**
        * 关闭Statement
        * @param stmt
        */
       public static void close(Statement stmt){
           try{
               if(stmt!=null)
               stmt.close();
               stmt = null;
           }catch(SQLException e){
               //
           }
       }

       /**
        * 关闭ResultSet
        * @param rs
        */
       public static void close(ResultSet rs){
           try{
               if(rs!=null)
               rs.close();
               rs = null;
           }catch(SQLException e){
               //
           }
       }
    }
    6、将数据库查询的数据写入Excel中

    package com.dao;

    import java.io.*;
    import java.sql.*;
    import java.text.*;

    import javax.servlet.ServletException;

    import jxl.Workbook;
    import jxl.write.Label;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableFont;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;

    public class IncomeReport {
    public static void statData() throws IOException, SQLException{
       java.util.Date   today=new   java.util.Date();
       today.setTime(today.getTime());
         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String startdate = formatter.format(today);      
         String day = String.valueOf(Integer.parseInt(startdate.substring(8,10))-1);
         if(day.length()==1)
         startdate = startdate.substring(0,8)+"0"+day+" 00:00:00";
         else
         startdate = startdate.substring(0,8)+"0"+day+" 00:00:00";
         String date = startdate.substring(0,4)+startdate.substring(5,7)+startdate.substring(8,10);
       Connection conn = null;
       Statement stmt = null;
       ResultSet rs = null;
       String sql = "select a1,a2,a3,a4 from 数据库名";
       sql += " where Date between '"+startdate+"' and '"+startdate+"'";//根据自己数据库实际情况选择时间
       OutputStream os = new FileOutputStream("E:\\projects\\tmp\\"+date+"_income.xls");//文件所在位置
       WritableWorkbook wwb = Workbook.createWorkbook(os); //创建Excel工作表 指定名称和位置
            WritableSheet ws = wwb.createSheet("XX收入日报表",0);//创建一个sheet
            WritableFont wf = new WritableFont(WritableFont.TIMES, 8, WritableFont.NO_BOLD, false);
            WritableCellFormat wcfF = new WritableCellFormat(wf);
       try {
         conn = DBConnection.getConnection();
          stmt = conn.createStatement();
          rs = stmt.executeQuery(sql);
          writeExcel(rs,wwb,ws,wcfF);
       } catch (Exception ex) {
          ex.printStackTrace();
       } finally {
        DBConnection.close(rs);
          DBConnection.close(stmt);
       }
    }

    public static void writeExcel(ResultSet rs,WritableWorkbook wwb,
                WritableSheet ws,WritableCellFormat wcfF) throws ServletException
         {
         String[] title = {"a1","a2",“a3","a4"};
            try
            {
             int i = 0;
             Label label = null;
             for(int k=0;k<4;k++){
              label = new Label(k,i,title[k],wcfF);
              ws.addCell(label);
             }
             i++;
                //**************往工作表中添加数据*****************//
                while(rs.next()){//行
                   for(int j=0;j<4;j++){//列
                    if(j>1)
                     label = new Label(j,i,rs.getString(j+1)+"%",wcfF);
                    else
                     label = new Label(j,i,rs.getString(j+1),wcfF);
                    ws.addCell(label);
                   }
                   i++;
                }
                //写入工作表
                wwb.write();
                wwb.close();
            }
            catch(Exception e)
            {
                throw new ServletException(e);
            }
         }
    }

    7、转换中文

    package com.tool;

    public class ToChinese{
        public ToChinese() {}
        public String getGB2312(String s){
         if (s != null && !"".equals(s)) {
        try {
         s = new String(s.getBytes("8859_1"), "gb2312");
         return s;
        } catch (Exception ex) {
         System.out.print(ex.getMessage());
        }
       }
       return "";
        }
    }
  • 相关阅读:
    网页版台球小游戏
    代码写响应式时钟效果
    如何使用SVN?
    TP框架---View视图层---模板继承(举例说明)
    ThinkPhp框架:文件上传
    ThinkPhp框架:验证码功能
    ThinkPhp框架:父类及表单验证
    ThinkPhp框架对“数据库”的基本操作
    对thinkphp的命名空间的理解
    控制器操作方法的调用
  • 原文地址:https://www.cnblogs.com/weipeng/p/2760772.html
Copyright © 2011-2022 走看看