无xml配置——使用Spring发送自定义模版邮件通知

依赖:spring-context-support-4.3.6.RELEASE.jar 

依赖:freemarker-2.3.23.jar


import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.mail.internet.MimeMessage;

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import freemarker.cache.FileTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * 
 * Description:邮件发送类
 * Date:		2018年1月16日
 */
public class MailSender {
	
	private static JavaMailSenderImpl sender;

	private static Configuration configuration;

	private static ExecutorService executor;

	private MailSender() {
		init();
	}

	// 静态私有内部类用于实现线程安全的懒加载
	private static class MailSenderHolder {
		private static final MailSender instance = new MailSender();
	}

	public static final MailSender getInstance() {
		return MailSenderHolder.instance;
	}

	private void init() {
		System.out.println("初始化邮件发送MailSender类...");
		sender = getMailSender();
		configuration = getConfiguration();
		executor = Executors.newFixedThreadPool(4);
	}

	/**
	 * 
	 * Description:邮件发送类初始化
	 * Date:		2018年1月16日
	 * @author 		shaqf
	 * @email 		sqfsky@163.com
	 * @return
	 */
	private JavaMailSenderImpl getMailSender() {
		JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
		mailSender.setHost("smtp.exmail.izhichi.com");
		mailSender.setUsername("admin@izhichi.com");
		mailSender.setPassword("Admin@123456");
		mailSender.setProtocol("smtp");
		mailSender.setDefaultEncoding("UTF-8");
		Properties javaMailProperties = new Properties();
		javaMailProperties.setProperty("mail.smtp.auth", "true");
		javaMailProperties.setProperty("mail.smtp.from", "admin@izhichi.com");
		javaMailProperties.setProperty("mail.debug", "true");
		mailSender.setJavaMailProperties(javaMailProperties);
		return mailSender;
	}

	/**
	 * 
	 * Description:邮件模版初始化
	 * Date:		2018年1月16日
	 * @author 		shaqf
	 * @email 		sqfsky@163.com
	 * @return
	 */
	private Configuration getConfiguration() {
		try {
			FileTemplateLoader ftl1 = new FileTemplateLoader(new File(
					"E:\\zhuomian\\数据化运维平台\\智能运维平台\\svn\\disruptive\\manage\\src\\cn\\monitor\\bdweb\\email\\mailTemplate\\"));
			TemplateLoader[] loaders = new TemplateLoader[] { ftl1 };
			FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
			freeMarkerConfigurer.setPreTemplateLoaders(loaders);
			Properties settings = new Properties();
			settings.setProperty("template_update_delay", "1800");// 刷新模板的周期,单位为秒
			settings.setProperty("default_encoding", "UTF-8");// 模板的编码格式
			settings.setProperty("locale", "zh_CN"); // 本地化设置
			freeMarkerConfigurer.setFreemarkerSettings(settings);
			freeMarkerConfigurer.afterPropertiesSet();

			// 通过指定模板名获取FreeMarker模板实例
			Configuration configuration = freeMarkerConfigurer.getConfiguration();
			return configuration;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 
	 * Description:简单发送
	 * Date:		2018年1月16日
	 * @author 		shaqf
	 * @email 		sqfsky@163.com
	 * @param to	目标邮件地址
	 * @param title	邮件标题
	 * @param body	邮件内容
	 */
	public void sendSimpleMail(String to, String title, String body) {
		SimpleMailMessage smm = new SimpleMailMessage();
		smm.setFrom("admin@izhichi.com");
		smm.setTo(to);
		smm.setSubject(title);smm.setText(body);
		// 异步发送邮件
		executor.execute(new Runnable() {
			@Override
			public void run() {
				sender.send(smm);
			}
		});
	}
	
	/**
	 * 
	 * Description:通过模版发送数据
	 * Date:		2018年1月16日
	 * @author 		shaqf
	 * @email 		sqfsky@163.com
	 * @param to			目标邮件地址
	 * @param templateName	发送采用模版名称
	 * @param title			邮件标题
	 * @param templateData	用户动态数据
	 * @param fileName		附件完整名称(包含文件格式)
	 * @param file			附件封装File
	 */
	public void sendHtmlMail(String to, String templateName, String title, Map<String, ?> templateData, String fileName,
			File file) {
		try {
			// 使用JavaMail的MimeMessage,支付更加复杂的邮件格式和内容
			MimeMessage msg = sender.createMimeMessage();

			// 创建MimeMessageHelper对象,处理MimeMessage的辅助类
			MimeMessageHelper helper = new MimeMessageHelper(msg, true);

			// 使用辅助类MimeMessage设定参数
			helper.setFrom(sender.getUsername());
			helper.setTo(to);
			helper.setSubject(title);
			helper.setText(getMailText(templateName, templateData), true);

			// 加入附件
			if (file != null)
				helper.addAttachment(fileName, file);

			// 发送邮件
			executor.execute(new Runnable() {
				@Override
				public void run() {
					sender.send(msg);
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * Description:把动态数据注入到模版中
	 * Date:		2018年1月16日
	 * @author 		shaqf
	 * @email 		sqfsky@163.com
	 * @param templateName  指定模版
	 * @param templateData  用户数据
	 * @return
	 */
	private String getMailText(String templateName, Map<String, ?> templateData) {
		try {
			String htmlText = "";
			Template tpl = configuration.getTemplate(templateName);
			htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, templateData);
			return htmlText;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return templateData.toString();
	}

	private void sendHtmlMailTest() {
		Map<String, Object> templateData = new HashMap<>();
		templateData.put("email", "shaqf@izhichi.com");
		templateData.put("link", "http://www.izhichi.com");
		File file = new File("C:\\Users\\Administrator\\Desktop\\aa\\monitor-gateway.xls");
		MailSender.getInstance().sendHtmlMail("sqfsky@163.com", "testTemplate.ftl", "智能运维告警通知", templateData,
				"告警附件.xls", file);
	}

	public static void main(String[] args) {

		MailSender.getInstance().sendSimpleMail("shaqf@izhichi.com", "测试标题", "测试内容");

		// MailSender.getInstance().sendHtmlMailTest();
	}

}


模版testTemplate.ftl:

<html>
<head></head>
<body>
<table style="background:#ffffff" class="ecxbaidu_pass" bgcolor="" cellpadding="0" cellspacing="0" width="100%">
<tbody>
	<tr>
		<td>
		<table cellpadding="0" cellspacing="0" width="100%">
        <tbody>
		<tr>
			<td style="width:25px" width="25px;"></td>
			<td align="">
				<div style="line-height:40px;height:40px"></div>
				<p style="padding:0px"><strong style="font-size:14px;line-height:24px;color:#333333;font-family:arial,sans-serif">尊敬的${email}用户:</strong></p>
				<p style="padding:0px;line-height:24px;font-size:12px;color:#333333;font-family:'\005b8b\004f53',arial,sans-serif">您好!</p>
				<p style="padding:0px;line-height:24px;font-size:12px;color:#333333;font-family:'\005b8b\004f53',arial,sans-serif">您好!这是一封您订阅的告警邮件通知。</p>
				<p style="padding:0px;line-height:24px;font-size:12px;color:#333333;font-family:'\005b8b\004f53',arial,sans-serif">1、您可以通过***平台平台进行相关问题的处理。</p>
				<p style="padding:0px;line-height:24px;font-size:12px;color:#333333;font-family:'\005b8b\004f53',arial,sans-serif">2、您如果忘记密码,点击<a href="${link}" style="line-height:24px;font-size:12px;font-family:arial,sans-serif;color:#0000cc" target="_blank">「忘记密码」</a> 来找回密码。</p>
				<div style="line-height:80px;height:80px"></div>
				<p style="padding:0px;line-height:24px;font-size:12px;color:#333333;font-family:'\005b8b\004f53',arial,sans-serif">专注自动化运维服务的运维平台</p>
				<p style="padding:0px;line-height:24px;font-size:12px;color:#333333;font-family:'\005b8b\004f53',arial,sans-serif">Copyright disruptive Corporation. All rights reserved. 版权所有</p>
			</td>
		</tr>
		</tbody>
		</table>
		</td>
	</tr>
</tbody>
</table>
</body>
</html>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security中,通过配置访问控制列表(Access Control List,ACL)来实现授权规则。授权规则可以在Spring Security的XML配置文件中定义。 以下是一个示例配置文件,其中定义了两个授权规则: ``` <http auto-config="true"> <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="user" password="password" authorities="ROLE_USER" /> <user name="admin" password="password" authorities="ROLE_ADMIN" /> </user-service> </authentication-provider> </authentication-manager> ``` 上述配置文件中,`<http>` 标签用于配置访问控制规则,其中 `<intercept-url>` 标签用于定义 URL 匹配模式和对应的授权规则。此处定义了两个规则:对于 `/admin/**` 的请求,要求用户拥有 `ROLE_ADMIN` 角色;对于其他所有请求,要求用户拥有 `ROLE_USER` 角色。 `<authentication-manager>` 标签用于配置身份认证的方式,此处使用了内存中的用户信息进行认证。 如果要自定义授权规则,可以实现 `AccessDecisionVoter` 接口,并将自定义的投票器配置到 `<http>` 标签中: ``` <http auto-config="true"> <intercept-url pattern="/admin/**" access="ROLE_ADMIN" /> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login /> <access-decision-manager> <decision-voters> <bean class="com.example.CustomVoter" /> </decision-voters> </access-decision-manager> </http> ``` 以上配置文件中,`<access-decision-manager>` 标签用于配置访问决策管理器,其中 `<decision-voters>` 标签用于定义投票器列表。`<bean>` 标签用于定义自定义投票器的实现类。在自定义投票器中,可以编写自己的授权规则逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值