package com.cloudcross.ssp.base.service;

import com.cloudcross.ssp.base.utils.concurrent.async.AsyncToken;
import com.cloudcross.ssp.base.utils.concurrent.async.IResponder;
import com.cloudcross.ssp.common.error.AppException;

/**
 * 邮件发送服务接口定义。
 * 
 * <pre>
 * Mail使用方法:
 * 1. 组合mail服务类如下代码所示：
 *    <code>
 * 	   ＠Autowired
 *     private IMailService mailService;
 * 	  </code>
 * 2. 调用发送邮件方法
 *    mailService.sendMessage(...) 或者 mailService.sendMessageAsHTML(...)
 * </pre>
 * 
 * @author qaohao
 */
public interface IMailService {
	/**
	 * 发送邮件给<code>to</code>。
	 * 
	 * @param <T>
	 * @param subject
	 *            邮件主题
	 * @param mailTemplatePath
	 *            邮件模板路径
	 * @param data
	 *            模板内容
	 * @param to
	 *            收件人
	 * @return {@link AsyncToken}
	 * @throws AppException
	 */
	<T> AsyncToken sendMessage(String subject, String mailTemplatePath,
			Object data, String to) throws AppException;

	/**
	 * 发送邮件给<code>to</code>。
	 * 
	 * @param <T>
	 * @param subject
	 *            邮件主题
	 * @param mailTemplatePath
	 *            邮件模板路径
	 * @param data
	 *            模板内容
	 * @param to
	 *            收件人
	 * @param responder
	 *            结果处理。
	 * @return {@link AsyncToken}
	 * @throws AppException
	 */
	<T> AsyncToken sendMessage(String subject, String mailTemplatePath,
			Object data, String to, IResponder<T> responder)
			throws AppException;

	/**
	 * 以HTML格式发送邮件给<code>to</code>。
	 * 
	 * @param subject
	 *            邮件主题
	 * @param mailTemplatePath
	 *            邮件模板路径
	 * @param data
	 *            模板内容
	 * @param to
	 *            收件人
	 * @return {@link AsyncToken}
	 * @throws AppException
	 */
	AsyncToken sendMessageAsHTML(String subject, String mailTemplatePath,
			Object data, String to) throws AppException;

	/**
	 * 以HTML格式发送邮件给<code>to</code>。
	 * 
	 * @param subject
	 *            邮件主题
	 * @param mailTemplatePath
	 *            邮件模板路径
	 * @param data
	 *            模板内容
	 * @param to
	 *            收件人
	 * @param responder
	 *            结果处理。
	 * @return {@link AsyncToken}
	 * @throws AppException
	 */
	<T> AsyncToken sendMessageAsHTML(String subject, String mailTemplatePath,
			Object data, String to, IResponder<T> responder)
			throws AppException;
}
