关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java SendEmail实现带附件的邮件功能

    Java SendEmail实现带附件的邮件功能

    2015-03-14 00:00:00 出处:codeceo
    分享

    之前自己这边是有一个sendmail的组件,但是只能实现text的发送,今天逛博客,无意间发现了一个能够实现发送附件的senfmail功能的java实现,于是就进行了测试和实现,经过测试能够成功实现附件功能,希望通过发博的方式进行收藏,也把中间出现的问题和大家进行分享:

    1.首先在Mail工程下新建lib文件夹,导入javax.mail.jar包;

    2.在Mail项目下新建conf文件夹,新建file:mail-info.properties,进行配置;

    mail.host=smtp.126.com
    mail.port=25
    mail.username=zhanglincumt@126.com
    mail.password=******
    mail.from=zhanglincumt@126.com
    mail.to=1447363383@qq.com

    3.新建一个util的package,里面放读取配置文件的AppContext.java和保存临时配置文件的SystemContains.java;

    package util;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    /**
     * 读取配置文件
     * 2014年12月31日
     */
    public enum AppContext {
    
        INSTANCE;
    
        public Properties configuration = new Properties();
    
        public void init() {
            InputStream is = this.getClass().getResourceAsStream("/mail-info.properties");
            if (is != null) {
                try {
                    this.configuration.clear();
                    this.configuration.load(is);
                } catch (IOException e) {
                } finally {
                    try {
                        is.close();
                    } catch (Throwable t) {}
                }
            }
        }
    
        public String getConfigValue(String key) {
              return this.configuration.getProperty(key);
        }
    
    }
    package util;
    /**
     * 临时保存配置文件信息
     */
    public class SystemConstants {
        //info
        public static final String MAILHOST = AppContext.INSTANCE.getConfigValue("mail.host");
        public static final String MAILPORT = AppContext.INSTANCE.getConfigValue("mail.port");
        public static final String MAILUSERNAME = AppContext.INSTANCE.getConfigValue("mail.username");
        public static final String MAILPASSWORD = AppContext.INSTANCE.getConfigValue("mail.password");
        public static final String MAILFROM = AppContext.INSTANCE.getConfigValue("mail.from");
        public static final String MAILTO = AppContext.INSTANCE.getConfigValue("mail.to");
    }

    4.在mail包下新建发送文件类JavaMail.java和压缩解压缩类ZIP.java;

    package mail;
    
    import java.io.File;
    
    import javax.activation.DataHandler;
    import javax.activation.DataSource;
    import javax.activation.FileDataSource;
    import javax.mail.Address;
    import javax.mail.BodyPart;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Multipart;
    import javax.mail.Session;
    import javax.mail.Transport;
    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 util.AppContext;
    import util.SystemConstants;
    /**
     * send email
     * 2014年12月31日
     */
    
    public class JavaMail {
        /**
         * Message对象将存储我们实际发送的电子邮件信息,
         * Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。
         */
        private MimeMessage message;
    
        /**
         * Session类代表JavaMail中的一个邮件会话。
         * 每一个基于JavaMail的应用程序至少有一个Session(可以有任意多的Session)。
         * 
         * JavaMail需要Properties来创建一个session对象。
         * 寻找"mail.smtp.host"    属性值就是发送邮件的主机
         * 寻找"mail.smtp.auth"    身份验证,目前免费邮件服务器都需要这一项
         */
        private Session session;
    
        /***
         * 邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能:Transport 和 Store。 
         * Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。
         */
        private Transport transport;
    
        /*
         * 初始化方法
         */
        public JavaMail(boolean debug) {
            session = Session.getInstance(AppContext.INSTANCE.configuration);
            session.setDebug(debug);//开启后有调试信息
            message = new MimeMessage(session);
        }
    
        /**
         * 发送邮件
         * @param subject     邮件主题
         * @param sendHtml    邮件内容
         */
        public void sendEmail(String subject, String sendHtml) {
            try {
                // 发件人
                //InternetAddress from = new InternetAddress(sender_username);
                // 下面这个是设置发送人的Nick name
                InternetAddress from = new InternetAddress(MimeUtility.encodeWord("zhanglincc")+" <"+SystemConstants.MAILUSERNAME+">");
                message.setFrom(from);
    
                // 收件人
                InternetAddress to = new InternetAddress(SystemConstants.MAILTO);
                message.setRecipient(Message.RecipientType.TO, to);//还可以有CC、BCC
    
                // 邮件主题
                message.setSubject(subject);
    
                String content = sendHtml.toString();
    
                // 邮件内容,也可以使纯文本"text/plain"
                message.setContent(content, "text/html;charset=UTF-8");
    
                // 保存邮件
                message.saveChanges();
    
                // smtp验证,就是你用来发邮件的邮箱用户名密码            
                transport = session.getTransport("smtp");
                transport.connect(SystemConstants.MAILHOST, SystemConstants.MAILUSERNAME, SystemConstants.MAILPASSWORD);
    
                // 发送
                transport.sendMessage(message, message.getAllRecipients());
    
                System.out.println("send success!");
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(transport!=null){
                    try {
                        transport.close();
                    } catch (MessagingException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        /**
         * 发送邮件
         * @param subject 邮件主题
         * @param sendHtml  邮件内容
         * @param attachment  附件
         */
        public void sendEmail(String subject, String sendHtml, String filePath) {
            File file = new File(filePath);
            if(file.exists()){
                try {
                    // 发件人
                    InternetAddress from = new InternetAddress(SystemConstants.MAILUSERNAME);
                    message.setFrom(from);
    
                    String [] strings = SystemConstants.MAILTO.split(";");
                    Address [] receiverAddress = new Address[strings.length];
    
                    for(int i = 0;i<strings.length;i++){
                        receiverAddress[i]=new InternetAddress(strings[i]);
                    }
    
                    message.setRecipients(Message.RecipientType.TO, receiverAddress);
    
                    // 邮件主题
                    message.setSubject(subject);
    
                    // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
                    Multipart multipart = new MimeMultipart();
    
                    // 添加邮件正文
                    BodyPart contentPart = new MimeBodyPart();
                    contentPart.setContent(sendHtml, "text/html;charset=UTF-8");
                    multipart.addBodyPart(contentPart);
    
                    //如果所给的路径是目录就压缩
                    if(file.isDirectory()){
                        File fileTemp = new File(file.getParentFile().getAbsoluteFile()+"\"+file.getName()+".zip");
                        System.out.println(fileTemp.getAbsolutePath());
                        ZIP.zipFiles(file.listFiles(),fileTemp);
                        file = fileTemp;
                        System.out.println(file.isFile());
                    }
                    // 添加附件的内容
                    if (file.isFile()) {
                        BodyPart attachmentBodyPart = new MimeBodyPart();
                        DataSource source = new FileDataSource(file);
                        attachmentBodyPart.setDataHandler(new DataHandler(source));
    
                        // 网上流传的解决文件名乱码的方法,其实用MimeUtility.encodeWord就可以很方便的搞定
                        // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
                        //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
                        //messageBodyPart.setFileName("= GBK B " + enc.encode(attachment.getName().getBytes()) + " =");
    
                        //MimeUtility.encodeWord可以避免文件名乱码
                        attachmentBodyPart.setFileName(MimeUtility.encodeWord(file.getName()));
                        multipart.addBodyPart(attachmentBodyPart);
                    }
    
                    // 将multipart对象放到message中
                    message.setContent(multipart);
                    // 保存邮件
                    message.saveChanges();
    
                    transport = session.getTransport("smtp");
                    // smtp验证,就是你用来发邮件的邮箱用户名密码
                    transport.connect(SystemConstants.MAILHOST, SystemConstants.MAILUSERNAME, SystemConstants.MAILPASSWORD);
                    // 发送
                    transport.sendMessage(message, message.getAllRecipients());
    
                    System.out.println("send success!");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (transport != null) {
                        try {
                            transport.close();
                        } catch (MessagingException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }else{
                System.out.println("附件地址有误  ");
                System.exit(-1);
            }
        }
    
    }
    package mail;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Enumeration;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipOutputStream;
    
    /**
     * 压缩文件、解压压缩文件
     * 2014年12月31日
     */
    public class ZIP {
    
        /**
         * 功能:压缩多个文件成一个zip文件
         * @param srcfile:源文件列表
         * @param zipfile:压缩后的文件
         */
        public static void zipFiles(File[] srcfile, File zipfile) {
            byte[] buf = new byte[1024];
            try {
                // ZipOutputStream类:完成文件或文件夹的压缩
                ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
                for (int i = 0; i < srcfile.length; i++) {
                    FileInputStream in = new FileInputStream(srcfile[i]);
                    out.putNextEntry(new ZipEntry(srcfile[i].getName()));
                    int len;
                    while ((len = in.read(buf)) > 0) {
                        out.write(buf, 0, len);
                    }
                    out.closeEntry();
                    in.close();
                }
                out.close();
                System.out.println("压缩完成.");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 功能:解压缩
         * @param zipfile:需要解压缩的文件
         * @param descDir:解压后的目标目录
         * @throws IOException
         */
        @SuppressWarnings("rawtypes")
        public static void unZipFiles(File zipfile, String descDir) {
            File file = new File(descDir);
            if (!file.exists()) {
                try {
                    file.mkdir();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            try {
                ZipFile zf = new ZipFile(zipfile);
                for (Enumeration entries = zf.entries(); entries.hasMoreElements();) {
                    ZipEntry entry = (ZipEntry) entries.nextElement();
                    String zipEntryName = entry.getName();
                    InputStream in = zf.getInputStream(entry);
                    OutputStream out = new FileOutputStream(descDir + zipEntryName);
                    byte[] buf1 = new byte[1024];
                    int len;
                    while ((len = in.read(buf1)) > 0) {
                        out.write(buf1, 0, len);
                    }
                    in.close();
                    out.close();
                    System.out.println("解压缩完成.");
                }
    
                zf.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            // 需要解压缩的文件
            File file = new File("D:\test");
            File filenew = new File("D:\test.zip");
            zipFiles(file.listFiles(), filenew);
    
            // 解压后的目标目录
            String dir = "D:\workspace\";
            unZipFiles(filenew, dir);
        }
    }

    5.新建测试类进行测试;

    package main;
    
    import util.AppContext;
    import mail.JavaMail;
    
    public class Main {
        public static void main(String[] args) {
            AppContext.INSTANCE.init();
            JavaMail mail = new JavaMail(false);
            mail.sendEmail("来自lynnzhangcc的邮件", "我是邮件内容");
            mail.sendEmail("测试附件为文件夹的邮件主题", "测试附件为文件夹的邮件内容","D:\test");
            mail.sendEmail("测试附件为文件的邮件主题", "测试附件文件的邮件内容","D:\test");
        }
    }

    如果运行正常,console会打印send success!的语句。

    运行过程中可能会出现以下异常:

    1.java运行和编译版本冲突

    该异常表明java编译和运行的jdk版本不同,可能是你进行项目位置更改发生的异常,解决办法如下:

    右键点击项目Mail,选择properties


    该问题就能解决。

    2.身份验证异常;

    该问题一般是身份验证未通过,只要在mail-info.properties配置中,不要使用申请时间不长的邮箱就可以解决。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    最全面的前端开发指南

    Windows7任务栏桌面下角的一些正在运行的图标不见了

    sql server快速删除记录方法

    SQL Server 7移动数据的6种方法

    SQL Server 2008的新压缩特性

    每个Java程序员必须知道的5个JVM命令行标志

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。