项目中很多地方都会用到发送邮件的情况,今天特地对整个流程进行梳理和总结,为了以后使用方便和为大家提供一个参考.
一,首先创建一个类,用来存储收件人的邮箱账号,邮件标题,邮件内容等信息,具体内容如下:
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方法就可以发送邮件了