前言

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

这篇文章主要思路:异步查询数据,生成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. 当 ReactJS 遇到 TypeScript

    由于本人应用项目主要是2B的web应用程序, 所以以下暂不谈react的服务端渲染和react navie, 先说说ReactJS: React 的组件化和  数据单向绑定 的模式(flux) 使应用 ...

  2. 数组去重方法(ES6)

    let arrayBefore = [1,3,3,2,1,5,2,1]; //去重之前的数组 Array.prototype.dedupe = function (){ //去重函数 返回去重后的数组 ...

  3. mysql在cmd命令下执行数据库操作

    windows+r 运行cmd命令,执行以下操作! 当mysql 数据库文件相对于来说比较大的时候,这个时候你可能在正常环境下的mysql中是导入不进去的,因为mysql数据库本身就有默认的导入文件大 ...

  4. Ubuntu 14.04 配置iptables防火墙

    Ubuntu默认安装是没有开启任何防火墙的,为了服务器的安全,建议大家安装启用防火墙设置,这里推荐使用iptables防火墙.如果mysql启本地使用,可以不用打开3306端口. # whereis ...

  5. table插件

    //动态添加一行function addRow(){ var firstrow=document.getElementById('firstrow'); var firstCopy=firstrow. ...

  6. UVa12563- Jin Ge Jin Qu hao

    思路一定要清晰! /* * Author: Bingo * Created Time: 2014/12/25 3:45:35 * File Name: uva12563.cpp */ #include ...

  7. 关于tarjan算法的空间优化

    最近随着对tarjan算法理解的加深,我发现用另外一种途径实现tarjan的方法,且可以省去DFN数组,大大节省了空间.经过大量测试,已经无误.以下将分阶段阐述进行优化的过程. 第一阶段 下面来说一下 ...

  8. angular.js基础

    内置指令 所有的内置指令的前缀都为ng,不建议自定义指令使用该前缀,以免冲突.首先从一些常见的内置指令开始.先列出一些关键的内置指令,顺便简单说说作用域的问题. ng-model 将表单控件和当前作用 ...

  9. Servlet 笔记-读取表单数据

    Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析: getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值. get ...

  10. ALV添加文字输入框

    一.业务场景 在合同打印中,需要临时添加其他约定事项,在打印程序的ALV中添加其他事项字段,点击之后弹出文字输入窗口,点击确定,文字内容存表,并在ALV中展示,点击打印后,文字内容加载到smartfo ...