java项目中发送邮件的整体流程

来源:互联网 发布:南瑞科技 知乎 编辑:程序博客网 时间:2024/05/18 02:31

项目中很多地方都会用到发送邮件的情况,今天特地对整个流程进行梳理和总结,为了以后使用方便和为大家提供一个参考.

一,首先创建一个类,用来存储收件人的邮箱账号,邮件标题,邮件内容等信息,具体内容如下:

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);}

@Servicepublic class SysMailReplyServiceImpl implements SysMailReplyService {//需要在配置文件中配置发件箱的用户名@Value("${mail.send.username}")private String senderUser;//需要在配置文件中配置发件箱的密码@Value("${mail.send.password}")private String senderPassword;@Overridepublic 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方法就可以发送邮件了

原创粉丝点击