Java发送邮件

来源:互联网 发布:windows 无法引导 编辑:程序博客网 时间:2024/06/16 21:03

常见的邮件协议包括:

SMTP:简单邮件传输协议,用于发送电子邮件的传输协议。

POP3:用于接收电子邮件的标准协议。

IMAP:互联网消息访问协议,是POP3的替代协议。

这三种协议都有对应的SSL加密传输的协议,分别是SMTPS、POP3S和IMAPS。


除了JavaMail的核心包之外,JavaMail还需要JAF(JavaBeans

 Activation Framework)来处理不是纯文本的邮件内容。这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。

JavaMail的关键对象

1.Properties

属性类型说明mail.smtp.hoststringsmtp服务器地址mail.smtp.portintsmtp服务器端口,默认25mail.smtp.authbooleansmtp服务器是否需要用户认证,默认falsemail.smtp.userstringsmtp默认的登录用户名mail.smtp.fromstring默认的邮件发送源地址mail.smtp.socketFactory.classString必须实现javax.net.SocketFactory接口mail.smtp.socketFactory.portint指定socket工厂类所用的端口号mail.smtp.socketFactory.fallbackboolean设定为true时,当使用指定的socket类创建socket失败后,将使用java.net.Socket创建socket,默认为truemail.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>.




原创粉丝点击