远方蔚蓝
一刹那情真,相逢不如不见

文章数量 126

访问次数 199888

运行天数 1437

最近活跃 2024-10-04 23:36:48

进入后台管理系统

Spring发送email


application配置
<!-- mail -->
    <bean class="com.mov.mwweb.service.ent.commonUtils.MailUtil">
    <!-- POP3/SMTP协议
	接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
	发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
	海外用户可使用以下服务器
	接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
	发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465 -->
    	<property name="host" value="smtp.exmail.qq.com"/><!-- 邮件服务器 -->
    	<property name="port" value="465"/><!-- 服务器端口 -->
    	<property name="user" value="******@***.com"/><!-- 服务器登录账户 -->
    	<property name="pwd" value="*******"/><!-- 授权码 -->
    	<property name="factory" value="javax.net.ssl.SSLSocketFactory"/><!-- 连接工厂 -->
    	<property name="ftPort" value="465"/><!-- 工厂端口-腾讯 -->
    	
    	<property name="smtp" value="mail.transport.protocol"/><!-- 发送邮件协议(简单邮件发送协议) -->
    	<property name="auth" value="true"/><!-- 登录认证 -->
    	<property name="debug" value="true"/><!-- debug模式 -->
    	
    	<property name="administrator" value="******@***.com"/><!-- 邮箱管理员 -->
    	<property name="from" value="mwapp@movingupon.com"/><!-- 邮件发送者 -->
    	<property name="ServerAddress" value="http://www.movcode.com"/><!-- 网站 -->
    </bean>
import java.io.File;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import java.util.UUID;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.servlet.http.HttpSession;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.Text;
import org.dom4j.io.SAXReader;
import com.mov.mw.exception.MwException;
import com.mov.mw.utils.StringUtils;
/**
 * 邮件工具类
 * 
 * @author wst 2018-2-26
 */
public class MailUtil {
	
	/**
	 * 
	 * 根据测试,可以发送HTML格式的邮件,在网页端显示依然是text文本,但在移动设备上是显示html格式,可能是QQ邮箱的原因,其他邮箱没有测试
	 * 
	 * @author wst 2018-2-26
	 * 
	 */
	public static final String RANDOMVALIDATECODE = "RANDOMVALIDATECODE";// 放到session中的key
	public static final String MAIL_SUBJECT_TEST = "测试邮件";
	public static final String MAIL_SUBJECT_ACCOUNT_ACTIVATION = "账号激活";
	public static final String MAIL_SUBJECT_BINDEMAIL = "绑定邮箱";
	private MailUtil() {
	}
	private static String host = "smtp.qq.com";// 邮件服务器
	private static String port = "587";// 邮件服务器端口
	private static String auth = "true";// 登录验证
	private static String user = "245281709@qq.com";// 邮箱服务器账号
	private static String pwd = "ijazjbyltwydcajh";// 授权码
	private static String from = "245281709@qq.com";// 邮件发送者
	private static String debug = "false";// debug模式
	private static String smtp = "mail.transport.protocol";// 发邮件协议
	private static String factory = "javax.net.ssl.SSLSocketFactory";// 连接工厂
	private static String ftPort = "465";// 连接工厂端口
	private static String administrator = "Movingupon 测试团队";// 邮箱管理者
	private static String serverAddress = "http://www.movingupon.com/";// 服务器地址
	/**
	 * 建立邮件
	 * 
	 * @author wst
	 * @param to
	 *            收件人
	 * @param subject
	 *            邮件主题
	 * @param content
	 *            邮件正文
	 */
	public static void sendMail(String to, String subject, String content) {
        // 校验邮箱正则
        String re = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
        if (!to.matches(re)) {
            throw new MwException("Incorrect email address format.");
        }
        try {
            // 创建Properties 类用于记录邮箱的一些属性
            final Properties properties = new Properties();
            // 发送邮件服务器 ,此处填写SMTP服务器
            properties.put("mail.smtp.host", host);
            // 发送端口
            properties.put("mail.smtp.port", port);
            // 表示SMTP发送邮件,必须进行身份验证
            properties.put("mail.smtp.auth", auth);
            // 此处填写发件人邮箱
            properties.put("mail.user", user);
            // 16位STMP密码
            properties.put("mail.password", pwd);
            // debug模式开启
            properties.setProperty("mail.debug", debug);
            
            properties.setProperty("mail.transport.protocol", smtp);
            properties.setProperty("mail.smtp.socketFactory.class", factory);
            properties.setProperty("mail.smtp.socketFactory.port", ftPort);
            
            // 构建授权信息,用于进行SMTP进行身份验证
            Session session = Session.getInstance(properties,
            new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、16位SMTP密码
                    String userName = properties.getProperty("mail.user");
                    String password = properties.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            });
            // 创建邮件对象
            MimeMessage message = new MimeMessage(session);
            // 设置发件人
            message.setFrom(new InternetAddress(from));
            // 设置收件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(
            to));
            // 设置主题
            if (!StringUtils.isBlank(subject)) {
                message.setSubject(subject, "UTF-8");
            } else {
                message.setSubject(MAIL_SUBJECT_TEST, "UTF-8");
            }
            // 正文
            BodyPart html = new MimeBodyPart();
            Multipart mainPart = new MimeMultipart("alternative");
            html.setContent(content, "text/html;charset=utf-8");
            mainPart.addBodyPart(html);
            message.setContent(mainPart);
            // 发送邮件
            Transport.send(message);
            
        } catch (AddressException e) {
            e.printStackTrace();
            throw new MwException("Incorrect email address format.(邮箱地址格式不正确!)");
        } catch (MessagingException e) {
            e.printStackTrace();
            throw new MwException("Invalid Addresses.(无效的邮箱地址!)");
        } finally {
            
        }
	}
	/**
	 * 产生4位随机数
	 * 
	 * @author wst
	 * @return
	 */
	public static String getRandomNum() {
		return new Random().nextInt(8999) + 1000 + "";
	}
	/**
	 * 产生UUID, replace("-", "");
	 * 
	 * @author wst
	 * @return
	 */
	public static String getUUID() {
		return UUID.randomUUID().toString().replace("-", "");
	}
	/**
	 * 账号激活邮件
	 * 
	 * @author wst 2018-2-26 下午6:04:12
	 * @param key
	 *            激活匙
	 * @return
	 */
	public static String register_mail(String key) {
		return ""
				+ "<br/>您收到这封邮件,是因为您在 Movingupon 上进行了新用户注册或者是Email变更使用到了这个邮箱。"
				+ "<br/>如果您并没有访问过 Movingupon ,或者没有进行上述操作,您可以忽略这封邮件,不需要进行退订或者进行其他下一步操作。"
				+ "<br/><br/>绑定邮箱说明:<script>alert()</script>"
				+ "<br/>如果您是 Movingupon 的新用户,或者修改注册Email操作时,使用了本邮箱地址,我们需要对您的邮箱地址的有效性进行验证以避免垃圾邮件或地址被滥用。"
				+ "<br/><br/>绑定邮箱验证码:" + key + "<br/><br/>";
	}
	/**
	 * 读取html文件
	 * 
	 * @author wst 2018-2-26 下午5:24:56
	 * @param session
	 *            用于获取模板路径
	 * @param content
	 *            添加的正文内容
	 * @param receiver
	 *            收件人
	 * @param date
	 */
	public static String getMailTemplet(HttpSession session, String content, String receiver, Date date) {
		Document doc = null;
		File file = null;
		String path = session.getServletContext().getRealPath("WEB-INF/classes/mail_templet.html").toString();
		// 本地main方法测试使用
		// String path = getPath().substring(6);
		try {
			file = new File(path);
			if (!file.exists()) {
				throw new MwException("Card templet file is not exists!(模板文件不存在!)");
			}
			doc = new SAXReader().read(file);
			// 读取根标签
			Element rootELem = doc.getRootElement();
			StringBuffer sb = new StringBuffer("");
			Element contentElement = (Element) doc.selectSingleNode("//p[@id='content']");// XPath根据id获取节点
			contentElement.setText(content);// 要添加的正文内容
			Element receiverElement = (Element) doc.selectSingleNode("//span[@id='receiver']");// XPath根据id获取节点
			receiverElement.setText(receiver);// 收件人
			Element emailElement = (Element) doc.selectSingleNode("//span[@id='email']");// XPath根据id获取节点
			emailElement.setText(administrator);// 管理员邮箱
//			Element timeElement = (Element) doc.selectSingleNode("//p[@id='time']");// XPath根据id获取节点 时间
//			timeElement.setText(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format( date ));
			getChildNodes(rootELem, sb);
			return sb.toString();
		} catch (DocumentException e) {
			e.printStackTrace();
			throw new MwException("mail_templet.html 不存在!");
		}
	}
	@SuppressWarnings("unchecked")
	/**
	 * 组装文本,获得完整的html文本
	 * @author wst 2018-2-26 下午5:25:20
	 * @param elem
	 * @param sb
	 */
	private static void getChildNodes(Element elem, StringBuffer sb) {
        // 开始标签
        sb.append("<" + elem.getName());
        // 得到标签的属性列表
        List<Attribute> attrs = elem.attributes();
        if (attrs != null) {
            for (Attribute attr : attrs) {
                sb.append(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
            }
        }
        sb.append(">");
        Iterator<Node> it = elem.nodeIterator();// 得到文本
        while (it.hasNext()) {
            Node node = it.next();
            // 标签
            if (node instanceof Element) {
                Element el = (Element) node;
                // ---递归
                getChildNodes(el, sb);
            }
            // 文本
            if (node instanceof Text) {
                Text text = (Text) node;
                sb.append(text.getText());
            }
        }
        // 结束标签
        sb.append("</" + elem.getName() + ">");
	}
	/**
	 * 获取项目路径下MailUtil.class所在目录的mail_templet.html文件
	 * @author wst 2018-5-8 上午11:01:29
	 * @return
	 */
	@Deprecated
	public static String getPath() {
        return MailUtil.class.getResource("mail_templet.html").toString();
	}
	public static void main(String[] args) {
		sendMail(
                "245281709@qq.com",
                "主题",
                getMailTemplet(
                null, 
                register_mail(getRandomNum() + ""), "wo", new Date())
            );
	}
	public static void setHost(String host) {
		MailUtil.host = host;
	}
	public static void setPort(String port) {
		MailUtil.port = port;
	}
	public static void setAuth(String auth) {
		MailUtil.auth = auth;
	}
	public static void setUser(String user) {
		MailUtil.user = user;
	}
	public static void setPwd(String pwd) {
		MailUtil.pwd = pwd;
	}
	public static void setFrom(String from) {
		MailUtil.from = from;
	}
	public static void setDebug(String debug) {
		MailUtil.debug = debug;
	}
	public static void setSmtp(String smtp) {
		MailUtil.smtp = smtp;
	}
	public static void setFactory(String factory) {
		MailUtil.factory = factory;
	}
	public static void setFtPort(String ftPort) {
		MailUtil.ftPort = ftPort;
	}
	public static void setAdministrator(String administrator) {
		MailUtil.administrator = administrator;
	}
	public static void setServerAddress(String serverAddress) {
		MailUtil.serverAddress = serverAddress;
	}
	public static String getServerAddress() {
		return serverAddress;
	}
	
}
邮件的模板
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
    <title></title>
    <meta charset='utf-8' />
</head>
<body>
	<div style="background-color:#ECECEC; padding: 35px;">
		<table style="width: 600px; margin: 0px auto; text-align: left; position: relative; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; font-size: 14px; font-family:微软雅黑, 黑体; line-height: 1.5; box-shadow: rgb(153, 153, 153) 0px 0px 5px; border-collapse: collapse; background-position: initial initial; background-repeat: initial initial;background:#fff;">
			<tbody>
				<tr>
					<th valign="middle" style="height: 25px; line-height: 25px; padding: 15px 35px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #C46200; background-color: #FEA138; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;">
					<!-- <font face="微软雅黑" size="5" style="color: rgb(255, 255, 255); ">Movingupon</font> -->
					</th>
				</tr>
				<tr>
					<td>
						<div style="padding:25px 35px 40px; background-color:#fff;">
							<h2 style="margin: 5px 0px; "><font color="#333333" style="line-height: 20px; "><font style="line-height: 22px; " size="4">Hi:<span id="receiver"></span></font></font></h2>
							<p>您好,这封邮件是由 Movingupon 发送的。</p>
							<p id="content"></p>
							<p>感谢您的访问,祝您使用愉快</p>
							<p>如果您有什么疑问可以联系管理员,Email: <span id="email"></span></p>
							<p align="right">Movingupon 官方团队</p>
							<p id="time" align="right"></p>
						</div>
					</td>
				</tr>
			</tbody>
		</table>
	</div>
</body>
</html>