zoukankan      html  css  js  c++  java
  • 发送邮件的工具类

    如下:

    package com.thinkgem.jeesite.common.utils;
    
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import org.apache.commons.mail.HtmlEmail;
    import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
    
    import java.io.File;
    import java.util.HashMap;
    import java.util.Locale;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * 发送电子邮件
     */
    public class SendMailUtil {
    
        private static final String fromName = "管理员";
        private static final String charSet = "utf-8";
        // TODO 邮箱和密码要改,如果邮箱不是下面列出的域名的还需要手动加域名和端口
        private static final String from = "xxx@qq.com";//发件人
        private static final String username = "xxx@qq.com";//发件人账户名
        private static final String password = "xxx";//发件人密码
    
        private static Map<String, String> hostMap = new HashMap<String, String>();
        static {
            // 126
            hostMap.put("smtp.126", "smtp.126.com");
            // qq
            hostMap.put("smtp.qq", "smtp.qq.com");
    
            // 163
            hostMap.put("smtp.163", "smtp.163.com");
    
            // sina
            hostMap.put("smtp.sina", "smtp.sina.com.cn");
    
            // tom
            hostMap.put("smtp.tom", "smtp.tom.com");
    
            // 263
            hostMap.put("smtp.263", "smtp.263.net");
    
            // yahoo
            hostMap.put("smtp.yahoo", "smtp.mail.yahoo.com");
    
            // hotmail
            hostMap.put("smtp.hotmail", "smtp.live.com");
    
            // gmail
            hostMap.put("smtp.gmail", "smtp.gmail.com");
            hostMap.put("smtp.port.gmail", "465");
    
            hostMap.put("xxx", "smtp.exmail.qq.com");
            hostMap.put("xxx", "465");
        }
    
        public static String getHost(String email) throws Exception {
            Pattern pattern = Pattern.compile("\w+@(\w+)(\.\w+){1,2}");
            Matcher matcher = pattern.matcher(email);
            String key = "unSupportEmail";
            if (matcher.find()) {
                key = "smtp." + matcher.group(1);
            }
            if (hostMap.containsKey(key)) {
                return hostMap.get(key);
            } else {
                throw new Exception("unSupportEmail");
            }
        }
    
        public static int getSmtpPort(String email) throws Exception {
            Pattern pattern = Pattern.compile("\w+@(\w+)(\.\w+){1,2}");
            Matcher matcher = pattern.matcher(email);
            String key = "unSupportEmail";
            if (matcher.find()) {
                key = "smtp.port." + matcher.group(1);
            }
            if (hostMap.containsKey(key)) {
                return Integer.parseInt(hostMap.get(key));
            } else {
                return 25;
            }
        }
    
        /**
         * 发送模板邮件
         * 
         * @param toMailAddr
         *            收信人地址
         * @param subject
         *            email主题
         * @param templatePath
         *            模板地址
         * @param map
         *            模板map
         */
        public static void sendFtlMail(String toMailAddr, String subject,
                String templatePath, Map<String, Object> map) {
            Template template = null;
            Configuration freeMarkerConfig = null;
            HtmlEmail hemail = new HtmlEmail();
            try {
                hemail.setHostName(getHost(from));
                hemail.setSmtpPort(getSmtpPort(from));
                hemail.setCharset(charSet);
                hemail.addTo(toMailAddr);
                hemail.setFrom(from, fromName);
                hemail.setAuthentication(username, password);
                hemail.setSubject(subject);
                freeMarkerConfig = new Configuration();
                freeMarkerConfig.setDirectoryForTemplateLoading(new File(
                        getFilePath()));
                // 获取模板
                template = freeMarkerConfig.getTemplate(getFileName(templatePath),
                        new Locale("Zh_cn"), "UTF-8");
                // 模板内容转换为string
                String htmlText = FreeMarkerTemplateUtils
                        .processTemplateIntoString(template, map);
                System.out.println(htmlText);
                hemail.setMsg(htmlText);
                hemail.send();
                System.out.println("email send true!");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("email send error!");
            }
        }
    
        /**
         * 发送普通邮件
         * 
         * @param toMailAddr
         *            收信人地址
         * @param ccList
         *            抄送列表,多个邮件地址用分号分隔
         * @param subject
         *            email主题
         * @param message
         *            发送email信息
         */
        public static void sendCommonMail(String toMailAddr, String ccList, String subject,
                String message) {
            HtmlEmail hemail = new HtmlEmail();
            try {
                hemail.setHostName(getHost(from));
                int port = getSmtpPort(from);
                if(465 == port){
                    hemail.setSSLOnConnect(true);
                    hemail.setSslSmtpPort("465");
                }else{
                    hemail.setSmtpPort(getSmtpPort(from));
                }
                hemail.setCharset(charSet);
                hemail.addTo(toMailAddr);
                if(StringUtils.isNotBlank(ccList)){
                    String[] ccLists = ccList.split(";");
                    for(String s:ccLists){
                        hemail.addCc(s);
                    }
                }
                hemail.setFrom(from, fromName);
                hemail.setAuthentication(username, password);
                hemail.setSubject(subject);
                hemail.setMsg(message);
                hemail.send();
                System.out.println("email send true!");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("email send error!");
            }
    
        }
    
        /**
         * 发送普通邮件
         *
         * @param toMailAddr
         *            收信人地址
         * @param subject
         *            email主题
         * @param message
         *            发送email信息
         */
        public static void sendCommonMail(String toMailAddr, String subject,
                                          String message) {
            sendCommonMail(toMailAddr, "", subject, message);
        }
    
        public static String getHtmlText(String templatePath,
                Map<String, Object> map) {
            Template template = null;
            String htmlText = "";
            try {
                Configuration freeMarkerConfig = null;
                freeMarkerConfig = new Configuration();
                freeMarkerConfig.setDirectoryForTemplateLoading(new File(
                        getFilePath()));
                // 获取模板
                template = freeMarkerConfig.getTemplate(getFileName(templatePath),
                        new Locale("Zh_cn"), "UTF-8");
                // 模板内容转换为string
                htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(
                        template, map);
                System.out.println(htmlText);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return htmlText;
        }
    
        private static String getFilePath() {
            String path = getAppPath(SendMailUtil.class);
            path = path + File.separator + "mailtemplate" + File.separator;
            path = path.replace("\", "/");
            System.out.println(path);
            return path;
        }
    
        private static String getFileName(String path) {
            path = path.replace("\", "/");
            System.out.println(path);
            return path.substring(path.lastIndexOf("/") + 1);
        }
    
    //    @SuppressWarnings("unchecked")
        public static String getAppPath(Class<?> cls) {
            // 检查用户传入的参数是否为空
            if (cls == null)
                throw new java.lang.IllegalArgumentException("参数不能为空!");
            ClassLoader loader = cls.getClassLoader();
            // 获得类的全名,包括包名
            String clsName = cls.getName() + ".class";
            // 获得传入参数所在的包
            Package pack = cls.getPackage();
            String path = "";
            // 如果不是匿名包,将包名转化为路径
            if (pack != null) {
                String packName = pack.getName();
                // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库
                if (packName.startsWith("java.") || packName.startsWith("javax."))
                    throw new java.lang.IllegalArgumentException("不要传送系统类!");
                // 在类的名称中,去掉包名的部分,获得类的文件名
                clsName = clsName.substring(packName.length() + 1);
                // 判定包名是否是简单包名,如果是,则直接将包名转换为路径,
                if (packName.indexOf(".") < 0)
                    path = packName + "/";
                else {// 否则按照包名的组成部分,将包名转换为路径
                    int start = 0, end = 0;
                    end = packName.indexOf(".");
                    while (end != -1) {
                        path = path + packName.substring(start, end) + "/";
                        start = end + 1;
                        end = packName.indexOf(".", start);
                    }
                    path = path + packName.substring(start) + "/";
                }
            }
            // 调用ClassLoader的getResource方法,传入包含路径信息的类文件名
            java.net.URL url = loader.getResource(path + clsName);
            // 从URL对象中获取路径信息
            String realPath = url.getPath();
            // 去掉路径信息中的协议名"file:"
            int pos = realPath.indexOf("file:");
            if (pos > -1)
                realPath = realPath.substring(pos + 5);
            // 去掉路径信息最后包含类文件信息的部分,得到类所在的路径
            pos = realPath.indexOf(path + clsName);
            realPath = realPath.substring(0, pos - 1);
            // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名
            if (realPath.endsWith("!"))
                realPath = realPath.substring(0, realPath.lastIndexOf("/"));
            /*------------------------------------------------------------ 
             ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 
              中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 
              的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的 
              中文及空格路径 
            -------------------------------------------------------------*/
            try {
                realPath = java.net.URLDecoder.decode(realPath, "utf-8");
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            System.out.println("realPath----->" + realPath);
            return realPath;
        }
    
        // private static File getFile(String path){
        // File file =
        // SendMail.class.getClassLoader().getResource("mailtemplate/test.ftl").getFile();
        // return file;
        // }
        //
    
        public static void main(String[] args) {
            // HtmlEmail hemail = new HtmlEmail();
            // try {
            // hemail.setHostName("smtp.exmail.qq.com");
            // hemail.setCharset("utf-8");
            // hemail.addTo("fly.1206@qq.com");
            // hemail.setFrom("zhoujunfeng@et-bank.com", "周俊峰");
            // hemail.setAuthentication("zhoujunfeng@et-bank.com", "31415926@aa");
            // hemail.setSubject("sendemail test!");
            // hemail.setMsg("<a href="http://www.google.cn">谷歌</a><br/>");
            // hemail.send();
            // System.out.println("email send true!");
            // } catch (Exception e) {
            // e.printStackTrace();
            // System.out.println("email send error!");
            // }
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("subject", "测试标题");
            map.put("content", "测试 内容");
            String templatePath = "mailtemplate/test.ftl";
            sendFtlMail("test@163.com", "sendemail test!", templatePath, map);
    
            // System.out.println(getFileName("mailtemplate/test.ftl"));
        }
    
    }

    调用方法:

    SendMailUtil.sendCommonMail("xxx.qq.com", "", "XXX异常", e.getMessage());
  • 相关阅读:
    GoldenGate Studio 12.2.1.1发布
    重构-改善既有代码的设计完整笔记系列之8
    重构-改善既有代码的设计完整笔记系列之6、7
    Java多线程开发系列-线程管理
    Java多线程开发系列-线程活性故障
    Java多线程开发系列-线程间协作
    Java多线程开发系列-基础
    了不起的Java-CompletableFuture组合异步编程
    了不起的Java-Optional替代null处理
    了不起的Java-Lambda替代设计模式
  • 原文地址:https://www.cnblogs.com/xh_Blog/p/14869727.html
Copyright © 2011-2022 走看看