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等) 最近公司邮件通讯录需要更新,我就将原来的通讯录给删除了,准备重新导入 ...
随机推荐
- python基于万象优图识别图片中的中文
最近一直在研究光学字符识别,即OCR.最开始在谷爹那里了解到了开源的Tesseract,可以拿来识别简单的英文和数字.但是识别中文的准确率并不高. 然后从Tesseract到Tesseract.js, ...
- Coursera_程序设计与算法_计算导论与C语言基础_数组应用练习
您也可以在我的个人博客中阅读此文章:跳转 编程题#1:求字母的个数 描述 在一个字符串中找出元音字母a,e,i,o,u出现的次数. 输入 输入一行字符串(字符串中可能有空格,请用gets(s)方法把一 ...
- Linux入门(2)——Ubuntu16.04安装wineQQ
http://www.ubuntukylin.com/application/show.php?lang=cn&id=279 下载得到wine-qqintl.zip 解压得到wine-qqin ...
- 购物篮算法的理解-基于R的应用
是无监督机器学习方法,用于知识发现,而非预测,无需事先对训练数据进行打标签,因为无监督学习没有训练这个步骤.缺点是很难对关联规则学习器进行模型评估,一般都可以通过肉眼观测结果是否合理. 一,概念术语 ...
- Loadrunner Webservice接口性能测试脚本编写优化总结
本文主要介绍使用Loadrunner Webservice接口性能测试脚本编写及优化总结. 1.Webservice协议脚本编写流程 下面介绍使用Loadrunner 11调用Webservice接口 ...
- LeetCode 217. Contains Duplicate (包含重复项)
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- 开发《WORD阅读器》小结(1)
这是一个相对原生的APP开发, 从GITHUB上下载了相应的框架,应该是至少2年以前的一个lovereader,是我能快速找到的为数不多的WORD阅读器的源码.应该是用ECLIPSE开发的,而我现在只 ...
- 读取本地的json文件
最近写项目需要读取本地的json文件,然后悲催的发现前端新手的我居然不会,查查找找发现这东西并不难,但是应该是比较常用的,毕竟json太好用了! 我是直接用的jquery实现的,但是Ajax也可以,不 ...
- EasyUI实现购物车、菜单和窗口栏等最常用的用户界面功能
一.EasyUI jQuery EasyUI 是一个基于 jQuery 的框架,集成了各种用户界面插件. easyui 提供建立现代化的具有交互性的 javascript 应用的必要的功能. 使用 e ...
- 表空间与数据文件Offline,online的区别
首先明确,表空间与数据文件的关系:Oracle数据库表空间有两种,一种smallfile小文件表空间(默认),另一种bigfile大文件表空间: 默认表空间与数据文件的关系:允许一对多的处理方式,一个 ...