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

时间:2022-12-30 16:14:44

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

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

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>
模板在项目中的具体如图所示:

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

三创建一个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方法就可以发送邮件了