常见的邮件协议包括:
SMTP:简单邮件传输协议,用于发送电子邮件的传输协议。
POP3:用于接收电子邮件的标准协议。
IMAP:互联网消息访问协议,是POP3的替代协议。
这三种协议都有对应的SSL加密传输的协议,分别是SMTPS、POP3S和IMAPS。
除了JavaMail的核心包之外,JavaMail还需要JAF(JavaBeans
Activation Framework)来处理不是纯文本的邮件内容。这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。
JavaMail的关键对象
1.Properties
属性 | 类型 | 说明 |
mail.smtp.host | string | smtp服务器地址 |
mail.smtp.port | int | smtp服务器端口,默认25 |
mail.smtp.auth | boolean | smtp服务器是否需要用户认证,默认false |
mail.smtp.user | string | smtp默认的登录用户名 |
mail.smtp.from | string | 默认的邮件发送源地址 |
mail.smtp.socketFactory.class | String | 必须实现javax.net.SocketFactory接口 |
mail.smtp.socketFactory.port | int | 指定socket工厂类所用的端口号 |
mail.smtp.socketFactory.fallback | boolean | 设定为true时,当使用指定的socket类创建socket失败后,将使用java.net.Socket创建socket,默认为true |
mail.smtp.timeout | int | 连接超时时间,单位为ms,默认为永不超时 |
2.Session
会话对象, 是一堆配置信息的集合。
3.Transport和Store:传输和存储。
应用实例
1.引入jar包
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
package com.xiets.javamaildemo;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;
/**
* JavaMail 版本: 1.6.0
* JDK 版本: JDK 1.7 以上(必须)
*/
public class Main {
// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
// PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),
// 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。
public static String myEmailAccount = "xxxxxxxxx@163.com";
public static String myEmailPassword = "xxxxxxxxx";
// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com
// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
public static String myEmailSMTPHost = "smtp.163.com";
// 收件人邮箱(替换为自己知道的有效邮箱)
public static String receiveMailAccount = "xxxxxxxxx@qq.com";
public static void main(String[] args) 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"); // 需要请求认证
// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
// 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
// 打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
/*
// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
// 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
// QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
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);
*/
// 2. 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
// 3. 创建一封邮件
MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
// 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
//
// PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
// 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
// 类型到对应邮件服务器的帮助网站上查看具体失败原因。
//
// PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
// (1) 邮箱没有开启 SMTP 服务;
// (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
// (3) 邮箱服务器要求必须要使用 SSL 安全连接;
// (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
// (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
//
// PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
transport.connect(myEmailAccount, myEmailPassword);
// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
// 7. 关闭连接
transport.close();
}
/**
* 创建一封只包含文本的简单邮件
*
* @param session 和服务器交互的会话
* @param sendMail 发件人邮箱
* @param receiveMail 收件人邮箱
* @return
* @throws Exception
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) 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, "XX用户", "UTF-8"));
// 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
message.setSubject("打折钜惠", "UTF-8");
// 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
message.setContent("XX用户你好, 今天全场5折, 快来抢购, 错过今天再等一年。。。", "text/html;charset=UTF-8");
// 6. 设置发件时间
message.setSentDate(new Date());
// 7. 保存设置
message.saveChanges();
return message;
}
}
发送带附件的邮件
package com.hd.javamail;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import com.sun.mail.util.MimeUtil;
/**
*
* @author H__D
* @date 2016年12月6日 下午7:38:33
*
*/
public class Demo3 {
/**
* 生成一份本地的邮件
* @param args
* @throws MessagingException
* @throws IOException
*/
public static void main(String[] args) throws MessagingException, IOException {
//环境
Session session = Session.getDefaultInstance(new Properties());
//邮件
MimeMessage msg = new MimeMessage(session);
//设置主题
msg.setSubject("test123456");
//发件人,注意中文的处理
msg.setFrom(new InternetAddress("\"" + MimeUtility.encodeText( "某某") + "\"<xxxxxx@163.com>"));
//设置邮件回复人
msg.setReplyTo(new Address[]{new InternetAddress("123456@163.com")});
//整封邮件的MINE消息体
MimeMultipart msgMultipart = new MimeMultipart("mixed");//混合的组合关系
//设置邮件的MINE消息体
msg.setContent(msgMultipart);
//附件1
MimeBodyPart attch1 = new MimeBodyPart();
//附件2
MimeBodyPart attch2 = new MimeBodyPart();
//正文内容
MimeBodyPart content = new MimeBodyPart();
//把内容,附件1,附件2加入到 MINE消息体中
msgMultipart.addBodyPart(attch1);
msgMultipart.addBodyPart(attch2);
msgMultipart.addBodyPart(content);
//把文件,添加到附件1中
//数据源
DataSource ds1 = new FileDataSource(new File("C:/Users/H__D/Desktop/1.txt"));
//数据处理器
DataHandler dh1 = new DataHandler(ds1 );
//设置第一个附件的数据
attch1.setDataHandler(dh1);
//设置第一个附件的文件名
attch1.setFileName("file1.jpg");
//把文件,添加到附件2中
DataSource ds2 = new FileDataSource(new File("C:/Users/H__D/Desktop/2.txt"));
DataHandler dh2 = new DataHandler(ds2 );
attch2.setDataHandler(dh2);
attch2.setFileName(MimeUtility.encodeText( "文件2.jpg"));
//正文(图片和文字部分)
MimeMultipart bodyMultipart = new MimeMultipart("related");
//设置内容为正文
content.setContent(bodyMultipart);
//html代码部分
MimeBodyPart htmlPart = new MimeBodyPart();
//html中嵌套的图片部分
MimeBodyPart imgPart = new MimeBodyPart();
//正文添加图片和html代码
bodyMultipart.addBodyPart(htmlPart);
bodyMultipart.addBodyPart(imgPart);
//把文件,添加到图片中
DataSource imgds = new FileDataSource(new File("C:/Users/H__D/Desktop/logo.png"));
DataHandler imgdh = new DataHandler(imgds );
imgPart.setDataHandler(imgdh);
//说明html中的img标签的src,引用的是此图片
imgPart.setHeader("Content-Location", "http://sunteam.cc/logo.jsg");
//html代码
htmlPart.setContent("<span style='color:red'>中文呵呵</span><img src=\"http://sunteam.cc/logo.jsg\">","text/html;charset=utf-8");
//生成文件邮件
msg.saveChanges();
//输出
OutputStream os = new FileOutputStream("C:/Users/H__D/Desktop/demo.eml");
msg.writeTo(os);
os.close();
}
}
附件为excel
public void sendAttachByTemplate(File file,
TBaseMailset from, String toEmail,String attachname) {
String subject = "薪酬通知邮件";
try {
getMailSession().setDebug(true);
Message msg = new MimeMessage(getMailSession());
//发件人
if(from!=null&&!"".equals(from.getMail())){
msg.setFrom(new InternetAddress(from.getMail()));//邮箱地址
}else{
msg.setFrom(new InternetAddress("lantuo103@163.com"));//邮箱地址
}
//收件人
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(toEmail));
//设置主题
msg.setSubject(subject);
//发送时间
msg.setSentDate(new java.util.Date());
// 添加附件
Multipart mm = new MimeMultipart();
BodyPart mdp = new MimeBodyPart();
///E:/JavaWorkspace/rs/WebRoot/WEB-INF/classes/xlsresult/ygxc.xls
//File file = new File(this.getClass().getResource("/").getPath()+"xlsresult/ygxc.xls");
FileDataSource fds = new FileDataSource(file);
DataHandler dh = new DataHandler(fds);
//mdp.setFileName("salary.xls");//设置后缀为xls的名字后就可以发送excel附件了
//mdp.setFileName(attachname);//设置后缀为xls的名字后就可以发送excel附件了
mdp.setFileName(MimeUtility.encodeWord(attachname));//设置后缀为xls的名字后就可以发送excel附件了
//mdp.setFileName(URLEncoder.encode(attachname, "UTF-8"));
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);
msg.setContent(mm);
Transport transport = mailSession.getTransport("smtp");
//transport.connect("smtp.163.com", "lantuo103@163.com", "lantuo");
if(from!=null){ //如果没有设置发送邮箱
transport.connect(from.getServerHost(), from.getMail(), from.getMailPassword());
}else{
transport.connect("smtp.163.com", "lwww@163.com", "lwww");
}
transport.sendMessage(msg, msg.getAllRecipients());
} catch (Exception ex) {
ex.printStackTrace();
}
}
要一个临时系统功能可以查询数据结果生成excel文件,在指定时间把excel文件发送个多个人,并抄送给多个人。
技术要点:Java使用poi生成excel文件通过javamail邮件发送给多个人;数据库mysql
代码有部分删减剪!!只能参考修改,不能直接使用!!
==================================
相关jar
==================================
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
<!-- BEGIN: Java mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>${javamail.version}</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- END: Java mail -->
==================================
相关数据表
==================================
CREATE TABLE `mail_set` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`code` varchar(100) NOT NULL COMMENT '唯一主键',
`from_address` varchar(100) DEFAULT NULL COMMENT '发送邮箱',
`from_address_pwd` varchar(100) DEFAULT NULL COMMENT '发送邮箱密码',
`smtp` varchar(100) DEFAULT NULL COMMENT '简单邮件传输协议',
`debug` int(1) DEFAULT '0' COMMENT 'debug模式 0 开启 1 关闭',
`auth` int(1) DEFAULT '0' COMMENT '需要身份验证 0需要 1 不需要',
`host` varchar(100) DEFAULT NULL COMMENT '发送邮件的服务Ip',
`port` varchar(100) DEFAULT NULL COMMENT '端口',
`copyto` varchar(2000) DEFAULT NULL COMMENT '发件抄送人邮箱 cc@qq.com;dd@qq.com',
`remark` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`creater` bigint(20) DEFAULT NULL,
`modifier` bigint(20) DEFAULT NULL,
`modify_time` datetime DEFAULT NULL,
`version` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COMMENT='发件邮箱账号设置';
CREATE TABLE `send_bi_mail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`city_id` bigint(20) DEFAULT NULL COMMENT '城市id',
`city_name` varchar(100) DEFAULT NULL COMMENT '城市',
`user_name` varchar(100) DEFAULT NULL COMMENT '业管人员姓名',
`email` varchar(100) DEFAULT NULL COMMENT '业管人员邮箱',
`bi_type` bigint(20) DEFAULT '1' COMMENT '1,收款明细,2其他',
`tos` varchar(2000) DEFAULT NULL COMMENT '群发邮箱aa@qq.com;bb@qq.com',
`remark` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`creater` bigint(20) DEFAULT NULL,
`modifier` bigint(20) DEFAULT NULL,
`modify_time` datetime DEFAULT NULL,
`version` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8 COMMENT='报表邮件收件人';
==================================
java代码
==================================
import java.io.Serializable;
/**
* 邮箱账号信息
*/
public class MailSetEntity extends SsAuditAuto {
// 唯一主键
private String code;
// 发送邮箱
private String fromAddress;
// 发送邮箱密码
private String fromAddressPwd;
// 简单邮件传输协议
private String smtp;
// debug模式
private Long debug;
// 发送邮件的服务Ip
private String host;
// 端口
private String port;
// 需要身份验证
private Long auth;
// 抄送人
private String copyto;
}
import java.io.Serializable;
/**
* 邮件发送信息
*/
public class MailInfoEntity implements Serializable {
private static final long serialVersionUID = 1L;
// 收件人
private String[] tos;
// 抄送人
private String[] copyto;
// 附件地址
private String fileAddress;
// 附件名称
private String fileName;
// 主题
private String subject;
// 正文
private String context;
}
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.sql.SQLException;
import java.io.IOException;
import java.io.OutputStream;
/**
* bi报表邮件定时发送
*/
@Service("sendBiMailService")
public class SendBiMailServiceImpl implements SendBiMailService {
private Logger logger = LoggerFactory.getLogger(getClass());
// 报表临时文件目录
public static final String BI_TMP_FILES = SendBiMailServiceImpl.class.getResource("/").getPath() + "bitmpfiles/";
// 发送邮箱账号
public static final String MAIL_BI_CODE = "MAIL_BI_CODE";
@Autowired
private SendBiMailDao sendBiMailDao;
@Autowired
private SendBiMailUserDao sendBiMailUserDao;
@Autowired
private MailSetDao mailSetDao;
@Override
public void sendMail() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
Date time = cal.getTime();
String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(time);
String date = DateTools.formatDateTime(new Date(), DateTools.YYYY_MM_DD);
String dateTableName = DateTools.formatDateTime(new Date(), DateTools.YYYYMMDD);
// 邮箱账号信息
MailSetEntity mailSet = mailSetDao.queryByKey(MAIL_BI_CODE);
if (mailSet != null) {
SendBiMailUserEntity city = sendBiMailUserDao.queryCity(条件查询);
// 先删除昨天的文件
String yesterDayFileName = city.getCityName() + yesterday + "收款明细.xls";
String yesterDayFileFullPath = BI_TMP_FILES + yesterDayFileName;
DeleteFileUtil.deleteFile(yesterDayFileFullPath);
// 创建当日文件
String fileName = city.getCityName() + date + "收款明细.xls";
String fileFullPath = BI_TMP_FILES + fileName;
// 数据库查询数据结果集
List<SendBiMailEntity> sendBiMailEntityList = sendBiMailDao.queryList(条件查询);
if (sendBiMailEntityList.size() > 0) {
// 生成excel文件
createExcel(city, fileFullPath, sendBiMailEntityList);
// 设置邮件发送信息
MailInfoEntity mailInfo = new MailInfoEntity();
mailInfo.setSubject(city.getCityName() + date + "销售报表明细");
mailInfo.setFileAddress(fileFullPath);
mailInfo.setFileName(fileName);
mailInfo.setContext(city.getCityName() + date + " 销售报表明细,请查收。\n -- BI报表系统");
// 发送邮件给城市业管人员
sendEmail(mailSet, mailInfo, city);
} else {
logger.info(city.getCityName() + " 当日没有收款明细,邮件不发送");
}
} else {
logger.info("没有找到发送邮箱账号:" + MAIL_BI_CODE);
}
}
/**
* 发送邮件给城市业管人员
*
* @param city 城市信息
*/
public void sendEmail(MailSetEntity mailSet, MailInfoEntity mailInfo, SendBiMailUserEntity city) {
// 发送邮件
try {
// 设置收件人
if (StringUtils.isNotBlank(city.Tos())) {
String[] tos = city.getTos.split(";");
mailInfo.setTos(tos);
}
// 设置抄送人
if (StringUtils.isNotBlank(mailSet.getCopyto())) {
String[] copyto = mailSet.getCopyto().split(";");
mailInfo.setCopyto(copyto);
}
SendMailUtil.send(mailSet, mailInfo);
logger.info("发送成功 >>>>" + city.getCityName() + " 的销售报表收款明细给:" + toStr.toString());
} catch (Exception e) {
e.printStackTrace();
logger.info(city.getCityName() + " 的销售报表收款明细发送邮件失败");
}
}
/**
* 创建Excel
*
* @param city 城市信息
* @param fileFullPath 文件路径
* @param sendBiMailEntityList 数据内容
*/
public void createExcel(SendBiMailUserEntity city, String fileFullPath, List<SendBiMailEntity> sendBiMailEntityList) {
OutputStream out = null;
try {
//out = new FileOutputStream(new File("E:\\北京2017-03-20收款明细.xls"));
out = new FileOutputStream(new File(fileFullPath));
write(out, sendBiMailEntityList);
logger.info("生成" + city.getCityName() + "销售报表收款明细EXCEL 成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
logger.info("生成" + city.getCityName() + "销售报表收款明细EXCEL 失败");
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 生成Excel文件的方法write
*
* @param outputStream
* @throws SQLException
*/
public void write(OutputStream outputStream, List<SendBiMailEntity> list) {
// 初始一个workbook
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建单个sheet
HSSFSheet sheet = workbook.createSheet("sheet0");
// 创建第一行,设置列名
HSSFRow row0 = sheet.createRow(0);
row0.setHeight((short) 400); // 设置行高
HSSFCell cell = null; // Excel的列
HSSFFont font = workbook.createFont(); // 设置字体
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 粗体显示
font.setColor(HSSFFont.COLOR_NORMAL); // 设置单元格字体的颜色
HSSFCellStyle style = workbook.createCellStyle(); // 样式
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 设置边框样式
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
// 设置边框颜色
style.setTopBorderColor(HSSFColor.BLACK.index);
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setLeftBorderColor(HSSFColor.BLACK.index);
style.setRightBorderColor(HSSFColor.BLACK.index);
// 设置文本格式
HSSFDataFormat format = workbook.createDataFormat();
style.setDataFormat(format.getFormat("@"));
StringBuffer tableHeaderStr = new StringBuffer("客户姓名;手机号;收款时间;pos单号;收款金额;收据号;项目编号;项目名称;城市编号;城市名称");
String[] tableHeader = tableHeaderStr.toString().split(";");
short cellNumber = (short) tableHeader.length; // 表的列数
for (int k = 0; k < cellNumber; k++) {
int i = 0;
i += k;
short b = 5000;
cell = row0.createCell(i); // 创建第0行第k列
cell.setCellValue(tableHeader[k]); // 设置第0行第k列的值
sheet.setColumnWidth(i, b); // 设置列的宽度
style.setFont(font); // 设置字体风格
cell.setCellStyle(style);
}
HSSFCellStyle styleContext = workbook.createCellStyle();
styleContext.setWrapText(true);
styleContext.setAlignment(HSSFCellStyle.ALIGN_LEFT);
// 设置边框样式
styleContext.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleContext.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleContext.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleContext.setBorderRight(HSSFCellStyle.BORDER_THIN);
// 设置边框颜色
styleContext.setTopBorderColor(HSSFColor.BLACK.index);
styleContext.setBottomBorderColor(HSSFColor.BLACK.index);
styleContext.setLeftBorderColor(HSSFColor.BLACK.index);
styleContext.setRightBorderColor(HSSFColor.BLACK.index);
// 设置文本格式
styleContext.setDataFormat(format.getFormat("@"));
if (list.size() > 0) {
// 创建剩余行
for (int rowIndex = 1; rowIndex <= list.size(); rowIndex++) {
HSSFRow row = sheet.createRow(rowIndex);
SendBiMailEntity entity = list.get(rowIndex - 1);
// 创建多列
for (int cellIndex = 0; cellIndex < 10; cellIndex++) {
cell = row.createCell(cellIndex);
cell.setCellStyle(styleContext); // 设置风格
switch (cellIndex) {
case 0:
cell.setCellValue(entity.getClientName());
break;
case 1:
cell.setCellValue(entity.getClientPhone());
break;
case 2:
cell.setCellValue(entity.getCreateTime());
break;
case 3:
cell.setCellValue(entity.getPoseNo());
break;
case 4:
cell.setCellValue(entity.getInvoiceAmount());
break;
case 5:
cell.setCellValue(entity.getReceiptNo());
break;
case 6:
cell.setCellValue(entity.getProjectId());
break;
case 7:
cell.setCellValue(entity.getProjectName());
break;
case 8:
cell.setCellValue(entity.getCityId());
break;
case 9:
cell.setCellValue(entity.getCityName());
break;
}
}
}
} else {
HSSFRow row = sheet.createRow(1);
cell = row.createCell(0);
cell.setCellValue("没有收款明细");
}
try {
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
/**
* 通过JavaMail发送邮件
*/
public class SendMailUtil {
/*
* 发送邮件到指定邮箱
* 收件人,抄送人 ,附件地址,附件名称
*/
public static void send(MailSetEntity mailSet, MailInfoEntity mailInfo) throws Exception {
// 1.创建Session,包含邮件服务器网络连接信息
Properties props = new Properties();
// 指定邮件的传输协议,smtp;同时通过验证
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.auth", mailSet.getAuth());
Session session = Session.getDefaultInstance(props);
// 开启调试模式
session.setDebug(mailSet.getDebug());
// 2.编辑邮件内容
Message message = new MimeMessage(session);
// 设置邮件消息头
message.setFrom(new InternetAddress(mailSet.getFromAddress()));
// 创建邮件接收者地址
String[] tos = mailInfo.getTos();
if (tos != null && tos.length != 0) {
InternetAddress[] to = new InternetAddress[tos.length];
// 设置邮件消息的发送者
for (int i = 0; i < tos.length; i++) {
to[i] = new InternetAddress(tos[i]);
}
message.setRecipients(Message.RecipientType.TO, to);
}
// 设置邮件抄送者地址
String[] copyto = mailInfo.getCopyto();
if (copyto != null && copyto.length != 0) {
InternetAddress[] toCC = new InternetAddress[copyto.length];
// 设置邮件消息的发送者
for (int i = 0; i < copyto.length; i++) {
toCC[i] = new InternetAddress(copyto[i]);
}
message.addRecipients(Message.RecipientType.CC, toCC);
}
// 设置主题
message.setSubject(mailInfo.getSubject());
// 设置邮件消息内容、包含附件
Multipart msgPart = new MimeMultipart();
message.setContent(msgPart);
MimeBodyPart body = new MimeBodyPart(); // 正文
MimeBodyPart attach = new MimeBodyPart(); // 附件
msgPart.addBodyPart(body);
msgPart.addBodyPart(attach);
// 设置正文内容
body.setContent(mailInfo.getContext(), "text/html;charset=utf-8");
// 设置附件内容
attach.setDataHandler(new DataHandler(new FileDataSource(mailInfo.getFileAddress())));
attach.setFileName((MimeUtility.encodeText(mailInfo.getFileName())));
message.saveChanges();
// 3.发送邮件
Transport trans = session.getTransport();
trans.connect(mailSet.getSmtp(), mailSet.getFromAddress(), mailSet.getFromAddressPwd());
trans.sendMessage(message, message.getAllRecipients());
}
}
import java.io.File;
/**
* 删除文件和目录
*/
public class DeleteFileUtil {
/**
* 删除文件,可以是文件或文件夹
*
* @param fileName 要删除的文件名
* @return 删除成功返回true,否则返回false
*/
public static boolean delete(String fileName) {
File file = new File(fileName);
if (!file.exists()) {
System.out.println("删除文件失败:" + fileName + "不存在!");
return false;
} else {
if (file.isFile())
return deleteFile(fileName);
else
return deleteDirectory(fileName);
}
}
/**
* 删除单个文件
*
* @param fileName 要删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
System.out.println("删除单个文件" + fileName + "成功!");
return true;
} else {
System.out.println("删除单个文件" + fileName + "失败!");
return false;
}
} else {
System.out.println("删除单个文件失败:" + fileName + "不存在!");
return false;
}
}
/**
* 删除目录及目录下的文件
*
* @param dir 要删除的目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String dir) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile = new File(dir);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
System.out.println("删除目录失败:" + dir + "不存在!");
return false;
}
boolean flag = true;
// 删除文件夹中的所有文件包括子目录
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
flag = DeleteFileUtil.deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
// 删除子目录
else if (files[i].isDirectory()) {
flag = DeleteFileUtil.deleteDirectory(files[i]
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
System.out.println("删除目录失败!");
return false;
}
// 删除当前目录
if (dirFile.delete()) {
System.out.println("删除目录" + dir + "成功!");
return true;
} else {
return false;
}
}
}
文件换行
问题描述:
发送文本邮件用\n,\r,\r\n都实现不了换行。
解决方案:
在创建Message对象的时候。
用setContent(Object o,String s);方法设置了内容格式s,如果是text/html;charset=UTF-8换行符就是<br>.
最后欢迎大家访问我的个人网站:1024s