本文接上一篇,将得到的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)方法