<?php
/**
  * @method 邮件发送
  * @author soul
  * @copyright 2016/3/31
  */
require_once(mvc::$cfg['AUTOLOAD']['Send']['path'].'lib/email/class.phpmailer.php');
include_once mvc::$cfg['AUTOLOAD']['Send']['path'].'lib/aliyun-php-sdk-dm/aliyun-php-sdk-core/Config.php';
use Dm\Request\V20151123 as Dm;
class SendEmail extends SendBase
{
	
	/**
	  * @method 发送邮件
	  * @param  $dataArr
	  * @author soul
	  * @copyright 2017/4/14
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> ID ["code"]=> int(0) } 
	  */
	public function send($dataArr)
	{
		$mustArr = ['ema_type', 'ema_from', 'ema_to_email', 'ema_title', 'ema_text'];
		foreach($mustArr as $filed)
		{
			if(empty($dataArr[$filed]))
			{
				return LibFc::ReturnData(false, $filed.'参数必填');
			}
		}
		$dataArr['ema_add_time'] = time();
		$dataArr['ema_expire_time'] = (int) $dataArr['ema_expire_time'];
		$dataArr['ema_from_name'] = empty($dataArr['ema_from_name'])? '宜配网': $dataArr['ema_from_name'];

		$Res = $this->GetEnum('sc_email', 'ema_type');
		if(!in_array($dataArr['ema_type'], $Res['data']))
			return LibFc::ReturnData(false, '提供的ema_type参数值不存在');
		
		//是否2分钟内重复提交
		$Where = sprintf(" AND ema_type='%s' AND ema_from='%s' AND ema_to_email='%s' AND ema_title='%s' AND ema_add_time >=%d ORDER BY ema_id DESC LIMIT 1", 
			LibFc::Escape($dataArr['ema_type']), LibFc::Escape($dataArr['ema_from']), LibFc::Escape($dataArr['ema_to_email']), LibFc::Escape($dataArr['ema_title']), time()-60);
		$Res = $this->Get('sc_email', ['ema_id'], $Where, true);
		if(!empty($Res['data']['ema_id']))
			return LibFc::ReturnData(false, '该信息1分钟内已经提交过，请勿重复提交！');
		$Res = $this->Add('sc_email', $dataArr);
		return $this->SendByIds([$Res['data']]);
	}

	
	/**
	  * @method 根据ID发送邮件
	  * @param  $IdsArr array 一维数组
	  * @author soul
	  * @copyright 2017/4/14
	  * @return array(3) { ["status"]=> bool(true) ["data"]=> ID ["code"]=> int(0) } 
	  */
	public function SendByIds($IdsArr)
	{
		$Arr = [];
		if(!empty($IdsArr) && is_array($IdsArr))
		{
			$EmailIdArr = [];
			foreach($IdsArr as $V)
			{
				$EmailIdArr[] = (int) $V;
			}
			$Res = $this->Get('sc_email', ['*'], sprintf(" AND ema_id IN (%s)", implode(',', $EmailIdArr)));
			$EmailResArr = $Res['data'];
			$Arr = [];
			foreach($EmailResArr as $SV)
			{
				$Arr[$SV['ema_id']] = $SV;
				//未成功在有效期内的重发
				if($SV['ema_status'] != 'OK' && ( empty($SV['ema_expire_time']) || $SV['ema_expire_time'] >= time() ) )
				{
					$SetArr = [];

					//需要设置对应的region名称，如华东1（杭州）设为cn-hangzhou，新加坡Region设为ap-southeast-1，澳洲Region设为ap-southeast-2。
					$iClientProfile = DefaultProfile::getProfile("cn-hangzhou", mvc::$cfg['SMS']['ali']['keyid'], mvc::$cfg['SMS']['ali']['keysecret']);        
					$client = new DefaultAcsClient($iClientProfile);    
					$request = new Dm\SingleSendMailRequest();     
					$request->setAccountName('admin@alimail.yiparts.com');
					$request->setFromAlias($SV['ema_from_name']);
					$request->setAddressType(1);
					//$request->setTagName("控制台创建的标签");
					$request->setReplyToAddress(false);
					$request->setToAddress($SV['ema_to_email']);
					//可以给多个收件人发送邮件，收件人之间用逗号分开,若调用模板批量发信建议使用BatchSendMailRequest方式
					//$request->setToAddress("邮箱1,邮箱2");
					$request->setSubject($SV['ema_title']);
					$SV['ema_text'] = strtr($SV['ema_text'], ['&lt;'=>'<', '&gt;'=>'>']);
					$request->setHtmlBody($SV['ema_text']);        
					try {
						$response = $client->getAcsResponse($request);
						$SetArr['ema_status'] = 'ok';
						$SetArr['ema_error_msg'] = '';
					}
					catch (ClientException  $e) {
						$SetArr['ema_status'] = 'error';
						$SetArr['ema_error_count']++;
						$SetArr['ema_error_msg'] = $e->getErrorMessage();
					}
					catch (ServerException  $e) {    
						$SetArr['ema_status'] = 'error';
						$SetArr['ema_error_count']++;
						$SetArr['ema_error_msg'] = $e->getErrorMessage();
					}
					$SetArr['ema_last_time'] = time();
					$SV = array_merge($SV, $SetArr);
					$this->Set('sc_email', $SetArr, sprintf(" AND ema_id = %d", $SV['ema_id']));
				}
				$Arr[$SV['ema_id']] = $SV;
			}
		}
		
		$ResArr = [];
		$ReturnKey = ['ema_id', 'ema_status', 'ema_error_msg', 'ema_last_time'];
		foreach($Arr as $K=>$V)
		{
			foreach($ReturnKey as $VV)
			{
				$ResArr[$K][$VV] = $V[$VV];
			}
		}
		return LibFc::ReturnData(true, $ResArr);
	}
}