csv格式订单下载,完成后伴随邮件通知下载
前言
功能开发中会遇到大量订单下载,而服务器的请求响应时间又配置的很短,导致下载时候请求超时。
这篇文章主要思路:异步查询数据,生成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格式订单下载,完成后伴随邮件通知下载的更多相关文章
- dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); dispatch_group_ ...
- STM32使用cube生成的程序后在keil5编译后首次SWD可以下载再次下载不行的解决办法。
使用cube配置导出工程在keil5编译后首次SWD下载可以再次下载不行的解决办法. 1原因: cube使用的是HAL库,初始化语句里面禁用了调试功能. 在stm32f1xx_hal_msp.c中 _ ...
- 微信不支持App下载的解决方案 微信跳转打开外部浏览器下载(苹果跳转商店下载)
在微信中,打开app下载链接,或者使用微信扫一扫app下载二维码,都是无法下载app的. 因为腾讯为了自身利益,屏蔽了其他app直接在微信中下载.下面给分享下,找到的2种有效的解决方案. 方案:点击链 ...
- Git学习-->如何通过Shell脚本实现 监控Gitlab备份整个过程并且通过邮件通知得到备份结果?
一.背景 Git学习–>如何通过Shell脚本自动定时将Gitlab备份文件复制到远程服务器? http://blog.csdn.net/ouyang_peng/article/details/ ...
- ABAP->内表数据下载到CSV格式(原创转载请注明)
需求:将alv上面的数据计算到内表中区,然后通过自定义按钮进行下载到csv格式中 附加:现在基本不用csv导出了,但是有些变态需求强行要求,也只好研究出来了,excel与txt导出很简单,那就不多说了 ...
- js将json数据以csv格式下载
摘要: 最近有一个非项目的小需求,就是将项目开发分工文件化,方便后期管理维护.但是开发时,分工安排都是以json格式记录的,所以就做了一个将json数据以csv格式下载到本地. 代码: <!DO ...
- php生成CSV格式(转)
参考网址: php对csv文件的常用操作集合 http://blog.xhbin.com/archives/748 1,下载CSV格式文档 唯一需要特别注意的是编码. <? include_on ...
- R语言︱用excel VBA把xlsx批量转化为csv格式
笔者寄语:批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入.本章来自博客:http://www.cnblogs.com/weibaar/p/4506144.html 在 ...
- Excel 转 vCard格式、CSV格式
Excel 转vCard格式(常用于Gmail, Yahoo, 163等).CSV格式(常用于Outlook, Foxmail等) 最近公司邮件通讯录需要更新,我就将原来的通讯录给删除了,准备重新导入 ...
随机推荐
- python3.6安装pyspider
win10下安装pyspider 1.pip 我在安装pip的时候默认安装了Pip. 如果没有的话:pip安装 2.PhantomJS PhantomJS 是一个基于 WebKit 的服务器端 Jav ...
- OpenWRT 恢复出厂设置命令
如果通过无线或者有线口无法连接到router,可以用恢复某些设置重新设置路由器. 1. 开机,等着一个工作灯亮的时候立即按下rest键2秒,然后就开始拼命闪烁,很好现在进入failsafe模式了. 2 ...
- Node.js之异步流控制
前言 在没有深度使用函数回调的经验的时候,去看这些内容还是有一点吃力的.由于Node.js独特的异步特性,才出现了"回调地狱"的问题,这篇文章中,我比较详细的记录了如何解决异步流问 ...
- Android性能优化之启动速度优化
Android性能优化之启动速度优化 Android app 启动速度优化,首先谈谈为什么会走到优化这一步,如果一开始创建 app 项目的时候就把这个启动速度考虑进去,那么肯定就不需要重新再来优化 ...
- php代码常见错误详解整理
错误类型: 一.未使用二进制上传 代码: Fatal error: This encoded file is corrupted. Please refer to http://www.ze ...
- Entity Framework Core 2.0 使用代码进行自动迁移
一.前言 我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的 ...
- 基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
- C# 使用OpenCV在一张图片里寻找人脸
先上个效果图 相关库的下载 例程中用到一个库叫做emgucv,是opencv\的net封装 编译打包好的稳定版,在这:https://sourceforge.net/projects/emgucv/f ...
- 01-从零玩转JavaWeb-面向过程与面向对象
配套视频讲解:面向过程面向对象 一.面向过程 所有事情都按顺序一件一件来执行. 二.面向对象 面向对象是将功能通过对象也实现,将功能封装进对象之中 让对象去实现具体的细节 三.面向对象的目的 ...
- open-falcon Agent配置文件修改hostname后,还是有其他名称的endpoint
问题 open-falcon Agent在配置文件修改hostname后,log日志中还是发现其他名称的endpoint. 原因 Graph, Gateway组件会引用goperfcounter(gi ...