content: /**
   * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
   */
  package com.jeespring.common.utils;
  
  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;
  
  import com.jeespring.common.config.Global;
  import org.apache.commons.mail.HtmlEmail;
  import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
  
  import freemarker.template.Configuration;
  import freemarker.template.Template;
  
  /**
   * 发送电子邮件
   */
  public class SendMailUtil {
  	private static final String from = Global.getConfig("email.from");
  	private static final String fromName = Global.getConfig("email.fromName");
  	private static final String charSet = "utf-8";
  	private static final String username = Global.getConfig("email.username");
  	private static final String password = Global.getConfig("email.password");
  
  	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");
  	}
  
  	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!"+e.getMessage());
  		}
  	}
  
  	/**
  	 * 发送普通邮件
  	 * 
  	 * @param toMailAddr
  	 *            收信人地址,可以使用,分割。
  	 * @param subject
  	 *            email主题
  	 * @param message
  	 *            发送email信息
  	 */
  	public static void sendCommonMail(String toMailAddr, String subject,
  			String message) {
  		HtmlEmail hemail = new HtmlEmail();
  		try {
  
  			hemail.setHostName(getHost(from));
  			hemail.setSmtpPort(getSmtpPort(from));
  			hemail.setCharset(charSet);
  			if(toMailAddr.indexOf(",")>0){
  				String[] toMailAddrArray=toMailAddr.split(",");
  				for(String item : toMailAddrArray) {
  					hemail.addTo(item);
  				}
  			}else{
  				hemail.addTo(toMailAddr);
  			}
  			hemail.setFrom(from, fromName);
  			hemail.setAuthentication(username, password);
  			hemail.setSubject(subject);
  			hemail.setMsg(message);
  			if(from.contains("@qq.com"))
  				hemail.setSSL(true);
  			hemail.send();
  			//System.out.println("email send true!");
  		} catch (Exception e) {
  			//e.printStackTrace();
  			System.out.println("email send error!"+e.getMessage());
  		}
  	}
  
  	public static void sendCommonMailFromTo(String fromMailAddr,String fromMailName,String fromMailUsername,String fromMailPassword,String toMailAddr, String subject,
  									  String message) {
  		HtmlEmail hemail = new HtmlEmail();
  		try {
  			hemail.setHostName(getHost(fromMailAddr));
  			hemail.setSmtpPort(getSmtpPort(fromMailAddr));
  			hemail.setCharset(charSet);
  			hemail.addTo(toMailAddr);
  			hemail.setFrom(fromMailAddr, fromMailName);
  			hemail.setAuthentication(fromMailUsername, fromMailPassword);
  			hemail.setSubject(subject);
  			hemail.setMsg(message);
  			if(fromMailAddr.contains("@qq.com"))
  				hemail.setSSL(true);
  			hemail.send();
  			//System.out.println("email send true!");
  		} catch (Exception e) {
  			//e.printStackTrace();
  			System.out.println("email send error!"+e.getMessage());
  		}
  	}
  
  	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 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 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"));
  	}
  
  }