Javax.Mail 工具类

  • 1.基础Model

package com.maple.common.utils.mail;

import javax.activation.DataHandler;
import java.util.List;
import java.util.Map;

import lombok.Data;

@Data
public class MailMessage {
    /**
     * 内容ID
     */
    private String contentID;
    /**
     * 主题
     */
    private String subject;
    /**
     * 内容(包括html)
     */
    private String content;
    /**
     * 文本格式类型(例子:text/html; charset=utf-8)
     */
    private String subType;
    /**
     * 图片传入,适用于HTML邮件,key:cid名称;value:文件路径
     */
    private Map images;
    /**
     * 附件上传
     */
    private List attachments;
    /**
     * 文件
     */
    private DataHandler dh;
    /**
     * 描述
     */
    private String description;
}

package com.maple.common.utils.mail;

import java.util.Map;

import lombok.Data;

/**
 * 填充模板的邮件实体
 */
@Data
public class MailTmplMessage extends MailMessage {
    private String tmplPath;
    private Map params;
}
  • 2.辅助类

package com.maple.common.utils.mail;

import java.io.File;
import java.net.URL;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CacheEntity {
    Logger logger = LoggerFactory.getLogger(getClass());
    Date date;
    URL url;
    long lastModified;
    long hit;
    long length;
    T t;

    public long getLastModified() {
        return lastModified;
    }

    public void setLastModified(long lastModified) {
        this.lastModified = lastModified;
    }

    public long getHit() {
        return hit;
    }

    public void setHit(long hit) {
        this.hit = hit;
    }

    public long getLength() {
        return length;
    }

    public void setLength(long length) {
        this.length = length;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public boolean validate(File file) {
        if (file != null) {
            if (file.lastModified() != this.lastModified) {
                return false;
            }
            if (file.length() != this.length) {
                return false;
            }
        }
        logger.debug("url {} hit {}", url, ++hit);
        return true;
    }

    public CacheEntity(URL url, File file, T t) {
        this.url = url;
        this.date = new Date(System.currentTimeMillis());
        this.hit = 0;
        if (file != null) {
            this.lastModified = file.lastModified();
            this.length = file.length();
        }
        this.t = t;
    }

    public String toString() {
        if (date == null) {
            return "Hit #" + hit;
        }
        return "Hit #" + hit + " since " + date;
    }
}

package com.maple.common.utils.mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.WeakHashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class AbsFileCache {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    WeakHashMap> cache;

    public AbsFileCache(int cacheSize) {
        cache = new WeakHashMap>(cacheSize);
    }
    
    public T get(String path) throws IOException {
        URL url = this.getClass().getClassLoader().getResource(path);
        if (url != null) {
            logger.info("load file:"+url);
            String protocol = url.getProtocol();
            File file = null;
            InputStream is = null;
            if ("jar".equals(protocol) || "zip".equals(protocol)) {
                String jarFile = url.getFile();
                int pos = jarFile.indexOf("!");
                if (pos > 0) {
                    jarFile = jarFile.substring(0, pos);
                }
                file = new File(jarFile);
                is = url.openStream();
            } else if ("file".equals(protocol)) {
                file = new File(url.getFile());
                is = new FileInputStream(file);
            } else {
                logger.warn("not support the protocol {} with {}", protocol, url);
            }
            CacheEntity ce = cache.get(path);
            if (ce != null && ce.validate(file)) {
                return ce.getT();
            } else {
                try {
                    T t = createCache(is);
                    ce = new CacheEntity(url, file, t);
                    cache.put(path, ce);
                    return t;
                } finally {
                    if (is != null) {
                        is.close();
                    }
                }
            }
        } else {
            logger.warn("not found the file {}", path);
        }
        return null;
    }

    protected abstract T createCache(InputStream is) throws IOException;
}

package com.maple.common.utils.mail;

import java.io.InputStream;
import java.io.InputStreamReader;

import groovy.text.StreamingTemplateEngine;
import groovy.text.Template;

public final class TemplateCache extends AbsFileCache