前言

功能开发中会遇到大量订单下载,而服务器的请求响应时间又配置的很短,导致下载时候请求超时。

这篇文章主要思路:异步查询数据,生成csv文件,放入email中并发送给用户。(异步部分本文不做介绍,配置个线程池就可以)

代码亲测可以使用,邮箱的设置稍微需要配置一下 文章底部会说明。

代码下载地址(包含JavaMail  jar包):https://gitee.com/wangpinpin_595/reservationDownload/attach_files

正文

代码如下:

Main.java

import java.io.*;
import java.util.*; public class Main { /**
* csv格式订单下载,完成后伴随邮件通知下载
* 步骤分三部,一步一步的看,其实很简单
* 封装数据-->规范csv格式及写入文件-->邮件通知
*
* @author wappin
*/
public static void main(String[] args) throws Exception {
//封装数据
//我这里随便写点测试数据,上项目的时候,这里换成数据库读的数据。
List<Student> studentList = new ArrayList<>();
studentList.add(new Student(1, "小明", "男", "18011111111"));
studentList.add(new Student(2, "小王", "男", "18022222222"));
studentList.add(new Student(3, "小张", "男", "18033333333"));
studentList.add(new Student(4, "小红", "女", "18044444444"));
studentList.add(new Student(5, "小花", "女", "18055555555")); //规范csv格式及写入文件
File file = Configuring.configuringCsvFormat(studentList); //邮件通知
SendEmailUtil.sendEmail("442042162@qq.com", file); //发送结束后删除文件,看个人需求使用
//file.delete();
} }

Student.java

/**
* 学生实体类
*/
public class Student {
private int id; //id
private String name; //姓名
private String gender; //性别
private String phoneNumber;//电话号码 Student(int id, String name, String gender, String phoneNumber) {
this.id = id;
this.name = name;
this.gender = gender;
this.phoneNumber = phoneNumber;
} int getId() {
return id;
} String getName() {
return name;
} String getGender() {
return gender;
} String getPhoneNumber() {
return phoneNumber;
} void setId(int id) {
this.id = id;
} void setName(String name) {
this.name = name;
} void setGender(String gender) {
this.gender = gender;
} void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}

Configuring.java

import java.io.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; /**
* 规范csv格式及写入文件
* @author wappin
*/
public class Configuring {
/**
* 配置csv格式
*/
static File configuringCsvFormat(List<Student> studentList) {
LinkedHashMap<String, String> superClassMap = new LinkedHashMap<>();
//key对应实体类参数,value对应csv标题
superClassMap.put("id", "编号");
superClassMap.put("name", "姓名");
superClassMap.put("gender", "性别");
superClassMap.put("phoneNumber", "电话号码");
List<String> list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for (Student stu : studentList) {
sb.append(stu.getId()).append("\t,").
append(stu.getName() != null ? stu.getName() : "").append("\t,").
append(stu.getGender() != null ? stu.getGender() : "").append("\t,").
append(stu.getPhoneNumber() != null ? stu.getPhoneNumber() : "").append("\t");
list.add(sb.toString());
sb.delete(0, sb.length());
}
return writeFile(list, superClassMap);
} /**
* 写入文件
*/
private static <T> File writeFile(List<T> list, LinkedHashMap<String, String> fieldMap) {
//文件存放地址及名称
String downCsvForEmailAddress = "E:\\" + System.currentTimeMillis();
File file = new File(downCsvForEmailAddress);
FileOutputStream out;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
out = new FileOutputStream(file);
osw = new OutputStreamWriter(out, "GBK");
bw = new BufferedWriter(osw);
if (fieldMap != null) {
StringBuilder head = new StringBuilder();
for (Map.Entry<String, String> stringStringEntry : fieldMap.entrySet()) {
head.append(",").append(((Map.Entry) stringStringEntry).getValue() != null ? (String) ((Map.Entry) stringStringEntry).getValue() : "");
}
head = new StringBuilder(head.substring(1, head.length()));
bw.append(head.toString()).append("\r");
}
for (T aList : list) {
bw.append(aList.toString()).append("\r");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (osw != null) {
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
}

SendEmailUtil.java

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
import java.io.File;
import java.util.Date;
import java.util.Properties; /**
* JavaMail 版本: 1.6.0
* JDK 版本: JDK 1.7 以上(必须)
* 参考文档: http://blog.csdn.net/xietansheng/article/details/51673073
*/
public class SendEmailUtil { //发件人邮箱
public static String myEmailAccount = "自己填";
//授权码 > 独立密码 > 密码(优先级)
public static String myEmailPassword = "自己填";
//SMTP 服务器地址
public static String myEmailSMTPHost = "smtp.qq.com"; /**
* 配置收件人及邮件协议信息
*
* @param receiveMailAccount 收件人地址
* @param attachment 附件
* @throws Exception
*/
public static void sendEmail(String receiveMailAccount, File attachment) throws Exception {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证 final String smtpPort = "465";
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
Session session = Session.getInstance(props);
// 设置为debug模式, 可以查看详细的发送 log
session.setDebug(false); // 3. 创建一封邮件
MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount, attachment); Transport transport = session.getTransport();
transport.connect(myEmailAccount, myEmailPassword);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} /**
* 创建一封只包含文本的简单邮件
*
* @param session 和服务器交互的会话
* @param sendMail 发件人邮箱
* @param receiveMail 收件人邮箱
* @param attachment 附件
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, File attachment) throws Exception {
// 1. 创建一封邮件
MimeMessage message = new MimeMessage(session);
// 2. From: 发件人
message.setFrom(new InternetAddress(sendMail, "", "UTF-8"));
// 3. To: 收件人(可以增加多个收件人、抄送、密送)
message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "收件人姓名", "UTF-8"));
message.addHeader("charset", "UTF-8");
message.setSubject("主题"); //添加正文内容
Multipart multipart = new MimeMultipart();
BodyPart contentPart = new MimeBodyPart();
contentPart.setContent("正文内容", "text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
//附件
if (attachment != null) {
BodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachment);
attachmentBodyPart.setDataHandler(new DataHandler(source));
attachmentBodyPart.setFileName(MimeUtility.encodeText("附件名称.csv"));
multipart.addBodyPart(attachmentBodyPart);
} message.setContent(multipart);
message.setSentDate(new Date());
message.saveChanges();
return message;
}
}

邮箱配置

我用QQ邮箱做的测试,其他邮箱没有试,应该大同小异。

QQ邮箱服务器地址:smtp.qq.com

点击设置--帐号,开启POP3/SMTP/IMAP会得到一个授权码(对应myEmailPassword参数),如图:

如果邮箱配置还有不太懂得可以参考这篇文章,写的很详细:http://blog.csdn.net/xietansheng/article/details/51673073

Coding Changes the World

csv格式订单下载,完成后伴随邮件通知下载的更多相关文章

  1. dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了

    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); dispatch_group_ ...

  2. STM32使用cube生成的程序后在keil5编译后首次SWD可以下载再次下载不行的解决办法。

    使用cube配置导出工程在keil5编译后首次SWD下载可以再次下载不行的解决办法. 1原因: cube使用的是HAL库,初始化语句里面禁用了调试功能. 在stm32f1xx_hal_msp.c中 _ ...

  3. 微信不支持App下载的解决方案 微信跳转打开外部浏览器下载(苹果跳转商店下载)

    在微信中,打开app下载链接,或者使用微信扫一扫app下载二维码,都是无法下载app的. 因为腾讯为了自身利益,屏蔽了其他app直接在微信中下载.下面给分享下,找到的2种有效的解决方案. 方案:点击链 ...

  4. Git学习-->如何通过Shell脚本实现 监控Gitlab备份整个过程并且通过邮件通知得到备份结果?

    一.背景 Git学习–>如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器? http://blog.csdn.net/ouyang_peng/article/details/ ...

  5. ABAP->内表数据下载到CSV格式(原创转载请注明)

    需求:将alv上面的数据计算到内表中区,然后通过自定义按钮进行下载到csv格式中 附加:现在基本不用csv导出了,但是有些变态需求强行要求,也只好研究出来了,excel与txt导出很简单,那就不多说了 ...

  6. js将json数据以csv格式下载

    摘要: 最近有一个非项目的小需求,就是将项目开发分工文件化,方便后期管理维护.但是开发时,分工安排都是以json格式记录的,所以就做了一个将json数据以csv格式下载到本地. 代码: <!DO ...

  7. php生成CSV格式(转)

    参考网址: php对csv文件的常用操作集合 http://blog.xhbin.com/archives/748 1,下载CSV格式文档 唯一需要特别注意的是编码. <? include_on ...

  8. R语言︱用excel VBA把xlsx批量转化为csv格式

    笔者寄语:批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入.本章来自博客:http://www.cnblogs.com/weibaar/p/4506144.html 在 ...

  9. Excel 转 vCard格式、CSV格式

    Excel 转vCard格式(常用于Gmail, Yahoo, 163等).CSV格式(常用于Outlook, Foxmail等) 最近公司邮件通讯录需要更新,我就将原来的通讯录给删除了,准备重新导入 ...

随机推荐

  1. python基于万象优图识别图片中的中文

    最近一直在研究光学字符识别,即OCR.最开始在谷爹那里了解到了开源的Tesseract,可以拿来识别简单的英文和数字.但是识别中文的准确率并不高. 然后从Tesseract到Tesseract.js, ...

  2. Coursera_程序设计与算法_计算导论与C语言基础_数组应用练习

    您也可以在我的个人博客中阅读此文章:跳转 编程题#1:求字母的个数 描述 在一个字符串中找出元音字母a,e,i,o,u出现的次数. 输入 输入一行字符串(字符串中可能有空格,请用gets(s)方法把一 ...

  3. Linux入门(2)——Ubuntu16.04安装wineQQ

    http://www.ubuntukylin.com/application/show.php?lang=cn&id=279 下载得到wine-qqintl.zip 解压得到wine-qqin ...

  4. 购物篮算法的理解-基于R的应用

    是无监督机器学习方法,用于知识发现,而非预测,无需事先对训练数据进行打标签,因为无监督学习没有训练这个步骤.缺点是很难对关联规则学习器进行模型评估,一般都可以通过肉眼观测结果是否合理. 一,概念术语 ...

  5. Loadrunner Webservice接口性能测试脚本编写优化总结

    本文主要介绍使用Loadrunner Webservice接口性能测试脚本编写及优化总结. 1.Webservice协议脚本编写流程 下面介绍使用Loadrunner 11调用Webservice接口 ...

  6. LeetCode 217. Contains Duplicate (包含重复项)

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  7. 开发《WORD阅读器》小结(1)

    这是一个相对原生的APP开发, 从GITHUB上下载了相应的框架,应该是至少2年以前的一个lovereader,是我能快速找到的为数不多的WORD阅读器的源码.应该是用ECLIPSE开发的,而我现在只 ...

  8. 读取本地的json文件

    最近写项目需要读取本地的json文件,然后悲催的发现前端新手的我居然不会,查查找找发现这东西并不难,但是应该是比较常用的,毕竟json太好用了! 我是直接用的jquery实现的,但是Ajax也可以,不 ...

  9. EasyUI实现购物车、菜单和窗口栏等最常用的用户界面功能

    一.EasyUI jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件. easyui 提供建立现代化的具有交互性的 javascript 应用的必要的功能. 使用 e ...

  10. 表空间与数据文件Offline,online的区别

    首先明确,表空间与数据文件的关系:Oracle数据库表空间有两种,一种smallfile小文件表空间(默认),另一种bigfile大文件表空间: 默认表空间与数据文件的关系:允许一对多的处理方式,一个 ...