当前位置:   article > 正文

【javaMail】java创建Excel表不生成本地xls文件,直接通过ByteArrayOutputStream存入javamail邮件附件后发送至相应邮箱_outputstream 导出excel没有生成下载文件

outputstream 导出excel没有生成下载文件

前段时间猫哥遇到一个需求,通过java生成Excel后,利用javamail附件形式发送给相应邮箱。

查阅大量资料后发现,大部分的解决方案都是生成本地xls文件,再通过文件名和文件地址传给javamail的附件内。很明显,这样的解决方案不合理,会占用服务器大量的存储空间和IO,最理想的方法是不生成本地xls文件,直接通过流的形式传给javamail附件。

摸索了一阵后,猫哥找到了解决方案,在这里记录一下。

大致的思路就是:利用ByteArrayOutputStream直接将excel文件传入邮件附件

代码如下:

  1. ByteArrayOutputStream os = new ByteArrayOutputStream();
  2. HSSFWorkbook wb = new HSSFWorkbook();
  3. HSSFSheet sheet = wb.createSheet("new sheet");
  4. /**此处省去对EXCEL表内容和格式的详细编码过程**/
  5. try {
  6. wb.write(os);
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }
  10. ByteArrayInputStream a = new ByteArrayInputStream(os.toByteArray());
  11. String uuid = "test.xls";
  12. //指明让哪个smtp转发
  13. SendMailService themail = new SendMailService("smtp.163.com");
  14. //将ByteArrayInputStream直接存入mail的附件内
  15. themail.addFileAffix(a,uuid)

邮件服务SendMailService 的具体代码如下:

  1. package com.catchgo.devicejob.service;
  2. import com.xxl.job.core.log.XxlJobLogger;
  3. import javax.activation.DataHandler;
  4. import javax.activation.DataSource;
  5. import javax.activation.FileDataSource;
  6. import javax.mail.*;
  7. import javax.mail.internet.*;
  8. import javax.mail.util.ByteArrayDataSource;
  9. import java.io.InputStream;
  10. import java.util.Properties;
  11. /**
  12. * @Description:
  13. * @Author: Li Yacheng
  14. * @Date: 2020/6/24 14:06
  15. */
  16. public class SendMailService {
  17. private MimeMessage mimeMsg; //MIME邮件对象
  18. private Session session; //邮件会话对象
  19. private Properties props; //系统属性
  20. private boolean needAuth = false; //smtp是否需要认证
  21. private String username = ""; //smtp认证用户名和密码
  22. private String password = "";
  23. private Multipart mp; //Multipart对象,邮件内容,标题、附件等内容均添加到其中后在生成Multipart对象
  24. public SendMailService(String smtp) {
  25. setSmtpHost(smtp);
  26. createMimeMessage();
  27. }
  28. /**
  29. *
  30. * @param hostName
  31. */
  32. private void setSmtpHost(String hostName) {
  33. System.out.println("设置系统属性:mail.smtp.host = "+hostName);
  34. if(props == null){
  35. props = System.getProperties(); //获得系统属性对象
  36. }
  37. props.put("mail.smtp.host", hostName); //设置SMTP主机
  38. props.put("mail.smtp.port", "465");
  39. props.put("mail.smtp.socketFactory.port", "465");
  40. props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  41. props.put("mail.smtp.socketFactory.fallback", "false");
  42. }
  43. /**
  44. *
  45. * @return boolean
  46. */
  47. private boolean createMimeMessage() {
  48. try{
  49. System.out.println("准备获取邮件会话对象");
  50. session = Session.getDefaultInstance(props, null); //获取邮件会话对象
  51. }catch(Exception e){
  52. System.out.println("获取邮件会话对象错误!" + e);
  53. return false;
  54. }
  55. System.out.println("准备创建MIME邮件对象!");
  56. try{
  57. mimeMsg = new MimeMessage(session); //创建MIME邮件对象
  58. mp = new MimeMultipart("mixed"); //mp 一个multipart对象
  59. return true;
  60. }catch(Exception e){
  61. System.out.println("创建MIME邮件对象失败!" + e);
  62. return false;
  63. }
  64. }
  65. /**
  66. *
  67. * @param need boolean
  68. */
  69. public void setNeedAuth(boolean need){
  70. System.out.println("设置smtp身份认证:mail.smtp.auth =" + need);
  71. if(props == null){
  72. props = System.getProperties();
  73. }
  74. if(need){
  75. props.put("mail.smtp.auth", "true");
  76. props.put("mail.smtp.starttls.enable", "true");
  77. props.put("mail.smtp.starttls.required", "true");
  78. }else{
  79. props.put("mail.smtp.auth", "false");
  80. }
  81. }
  82. /**
  83. *
  84. * @param name String
  85. * @param pass String
  86. */
  87. public void setNamePass(String name,String pass){
  88. System.out.println("程序得到用户名和密码");
  89. username = name;
  90. password = pass;
  91. }
  92. /**
  93. *
  94. * @param mailSubject String
  95. * @return boolean
  96. */
  97. public boolean setSubject(String mailSubject){
  98. System.out.println("设置邮件主题!");
  99. try{
  100. mimeMsg.setSubject(MimeUtility.encodeText(mailSubject, "UTF-8", "B"));
  101. return true;
  102. }catch(Exception e){
  103. System.out.println("创建邮件主题失败!" + e);
  104. XxlJobLogger.log("创建邮件主题失败!" + e);
  105. return false;
  106. }
  107. }
  108. /**
  109. *
  110. * @param mailBody String
  111. * @return boolean
  112. */
  113. public boolean setBody(String mailBody){
  114. System.out.println("设置邮件主体!");
  115. try{
  116. BodyPart bp = new MimeBodyPart();
  117. bp.setContent(mailBody,"text/html;charset=gbk");
  118. mp.addBodyPart(bp);
  119. return true;
  120. }catch(Exception e){
  121. System.out.println("创建邮件正文发送失败!" + e);
  122. XxlJobLogger.log("创建邮件正文发送失败!" + e);
  123. return false;
  124. }
  125. }
  126. /**
  127. *
  128. * @param InputStream attachmentByteArray
  129. * @param String tittle
  130. * @return boolean
  131. */
  132. public boolean addFileAffix(InputStream attachmentByteArray, String tittle){
  133. try{
  134. MimeBodyPart bp = new MimeBodyPart();
  135. //DataSource files = new ByteArrayDataSource(attachmentByteArray, "application/msword");
  136. DataSource files = new ByteArrayDataSource(attachmentByteArray, "application/vnd.ms-excel;charset=UTF-8");
  137. bp.setDataHandler(new DataHandler(files));
  138. bp.setFileName(MimeUtility.encodeText(tittle));
  139. mp.addBodyPart(bp);
  140. return true;
  141. }catch(Exception e){
  142. //System.err.println("添加邮件:" + fileName +" 发生错误!"+ e);
  143. return false;
  144. }
  145. }
  146. public boolean setFrom(String from){
  147. System.out.println("设置发件人!");
  148. try{
  149. mimeMsg.setFrom(new InternetAddress(from)); //设置发件人
  150. return true;
  151. }catch(Exception e){
  152. XxlJobLogger.log("设置发件人失败!" + e);
  153. return false;
  154. }
  155. }
  156. /**
  157. *
  158. * @param to String
  159. * @return boolean
  160. */
  161. public boolean setTo(String to,String email){
  162. System.out.println("设置收件人!");
  163. if(to == null){
  164. return false;
  165. }
  166. try{
  167. mimeMsg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); //发送别人
  168. mimeMsg.addRecipients(Message.RecipientType.CC, InternetAddress.parse(email)); //抄送自己
  169. return true;
  170. }catch(Exception e){
  171. XxlJobLogger.log("设置收件人失败!"+e);
  172. return false;
  173. }
  174. }
  175. /**
  176. *
  177. * @param copyto String
  178. * @return boolean
  179. */
  180. public boolean setCopyTo(String copyto){
  181. System.out.println("发送附件到");
  182. if(copyto == null){
  183. return false;
  184. }
  185. try{
  186. mimeMsg.setRecipients(Message.RecipientType.CC, (Address[])InternetAddress.parse(copyto));
  187. return true;
  188. }catch(Exception e){
  189. return false;
  190. }
  191. }
  192. public boolean sendout(){
  193. try{
  194. mimeMsg.setContent(mp);
  195. mimeMsg.saveChanges();
  196. System.out.println("正在发送邮件...");
  197. Session mailSession = Session.getInstance(props,null);
  198. Transport transport = mailSession.getTransport("smtp");
  199. transport.connect((String)props.get("mail.smtp.host"), username,password);
  200. // transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));
  201. transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
  202. System.out.println("邮件发送成功!");
  203. transport.close();
  204. return true;
  205. }catch(Exception e){
  206. System.out.println("邮件发送失败!" + e);
  207. XxlJobLogger.log("邮件发送失败!"+e);
  208. return false;
  209. }
  210. }
  211. }

以上即可实现不生成本地文件,直接通过javamail附件发送邮件的功能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/591908
推荐阅读
相关标签
  

闽ICP备14008679号