项目中很多地方都会用到发送邮件的情况,今天特地对整个流程进行梳理和总结,为了以后使用方便和为大家提供一个参考.
一,首先创建一个类,用来存储收件人的邮箱账号,邮件标题,邮件内容等信息,具体内容如下:
public class MailConfig { /** * 普通收件人,必填 */ private String normalReceiver; /** * 收件人列表,非必填 */ private String[] to; /** * 邮件标题,可选 */ private String subject; /** * 邮件正文文本,可选 */ private String content; /** * 邮件中的附件,可选 */ private File[] attach; /** * 邮件中附件的下载地址,可选 */ private String attachUrl; //get和set方法省略 }
二,发送邮件的模板,一般发送邮件都会把邮件内容先制作成模板,然后用程序将相关的数据填充到模板里即可,例如将模板命名为:assignee.ftl,以下是模板的具体内容:
<table> <thead> <tr><td colspan="2">事件单${incNo!""}已指派给您,请处理</td></tr> </thead> <tbody> <tr><td align="right">事件单号:</td><td><a href="http://m-kf.jcloud.com/#event&view&eventId=${(id?c)!""}">${incNo!""}</a></td></tr> <tr><td align="right">状态:</td><td>${issueShowStatus!""}</td></tr> <tr><td align="right">提交时间:</td><td>${(createdTime?string("yyyy-MM-dd HH:mm:ss"))!} </td></tr> <tr><td align="right">优先级:</td><td>${priority!""}</td></tr> <tr><td align="right">标题:</td><td>${title!""}</td></tr> <tr><td align="right">详细描述:</td><td>${issueDesc!""}</td></tr> <tr><td colspan="2">注意:此邮件为系统自动发送,请勿直接回复!</td></tr> </tbody> </table>模板在项目中的具体如图所示:
三创建一个javaBean,用来存储需要发送的内容,包括:事件单号,事件状态,用户名,创建时间等
public class SysIssueVo { // 事件单号 private String incNo; // 客户姓名 private String customerName; //客户邮箱 private String email; //标题 private String title; // 问题描述 private String issueDesc; // 处理状态:1-已指派,2-处理中,3-待解决,4-已解决,5-已关闭,6-已取消 private Integer issueStatus; // 创建时间 private Date createdTime; //set和get方法 }
四,创建发送邮件的接口和实现类
public interface SysMailReplyService { //根据邮件内容和模板进行发送邮件 void sendIssueMailByType(SysIssueVo issueVo, String templateName); }
@Service public class SysMailReplyServiceImpl implements SysMailReplyService { //需要在配置文件中配置发件箱的用户名 @Value("${mail.send.username}") private String senderUser; //需要在配置文件中配置发件箱的密码 @Value("${mail.send.password}") private String senderPassword; @Override public void sendIssueMailByType(SysIssueVo issueVo, String templateName){ final MailConfig config = new MailConfig(); config.setSubject(issueVo.getTitle);//邮件标题 config.setEmail(issueVo.getEmail);//收件人邮箱 //将邮件内容填充到模板里 config.setContent(getMailContent(issueVo, templateName)); //发送邮件 sendMailViaEWS(config,senderUser,senderPassword); } /** * 将邮件内容填充到模板里 */ public String getMailContent(SysIssueVo issueVo, String templateName){ String content = ""; StringWriter writer = null; try { Configuration cfg = new Configuration(Configuration.VERSION_2_3_23); cfg.setTemplateLoader(new ClassTemplateLoader(this.getClass(), "/template")); cfg.setEncoding(Locale.CHINA, "UTF-8"); Template template = cfg.getTemplate(templateName+".ftl"); writer = new StringWriter(); template.process(issueVo, writer); content = writer.toString(); } catch (Exception e) { logger.error("getMailContent error!", e); } return content; } /** * 发送邮件 */ public Boolean sendMailViaEWS(MailConfig config, String username,String password){ logger.debug("sendMailViaEWS start, userName =" + username); try { AccessInfo accessInfo = new AccessInfo(username,password); ExchangeService service = accessInfo.getExchangeService(); //创建邮件 EmailMessage msg = new EmailMessage(service); // 设置主题 msg.setSubject(config.getSubject()); // 邮件内容 MessageBody body = MessageBody.getMessageBodyFromText(config.getContent()); body.setBodyType(BodyType.HTML); msg.setBody(body); msg.getToRecipients().add(config.getEmail()); msg.send(); logger.debug("sendMailViaEWS end, userName =" + username); return true; } catch (Exception e) { logger.error("sendMailViaEWS - error", e); return false; } } }
五,调用方法
首先从数据库中查询出需要发送的数据,然后选择需要的模板,最后调用sendIssueMailByType方法就可以发送邮件了