<?php
require_once (APP_PATH . "/application/library/PhpMailer/PHPMailer.php");
use PhpMailer\PHPMailer;

class MailModel extends Publicapi
{

	/**
	 * 初始化
	 *
	 * @return void
	 *
	 */
	public function init()
	{
		parent::init();
	}

	/**
	 * 发送邮件
	 */
	public function mailSend($mail, $content)
	{
		$keyName = $this->_config->v . "PARAMETERS";
		$arrParameters = $this->_memcache->get($keyName);
		
		if ($arrParameters === false) {
			// 设置参数设置
			$arrParameters = $this->memcacheParameters();
		}
		
		// smtp ip
		$smtp_ip = isset($arrParameters['smtp_ip']) ? $arrParameters['smtp_ip'] : '';
		// 端口
		$smtp_port = isset($arrParameters['smtp_port']) ? $arrParameters['smtp_port'] : '';
		// 用户名
		$smtp_username = isset($arrParameters['smtp_username']) ? $arrParameters['smtp_username'] : '';
		// 密码
		$smtp_password = isset($arrParameters['smtp_password']) ? $arrParameters['smtp_password'] : '';
		// 邮件标题
		$alarm_mail_title = isset($arrParameters['alarm_mail_title']) ? $arrParameters['alarm_mail_title'] : '标题';
		// 网络代理
		$smtp_NetworkAgent = isset($arrParameters['smtp_NetworkAgent']) ? $arrParameters['smtp_NetworkAgent'] : '';
		// 网络代理IP
		$smtp_NetworkAgentIp = isset($arrParameters['smtp_NetworkAgentIp']) ? $arrParameters['smtp_NetworkAgentIp'] : '';
		// 网络代理端口
		$smtp_NetworkAgentPort = isset($arrParameters['smtp_NetworkAgentPort']) ? $arrParameters['smtp_NetworkAgentPort'] : '';
		// 网络代理认证用户名
		$smtp_NetworkAgentUsername = isset($arrParameters['smtp_NetworkAgentUsername']) ? $arrParameters['smtp_NetworkAgentUsername'] : '';
		// 网络代理认证密码
		$smtp_NetworkAgentPassword = isset($arrParameters['smtp_NetworkAgentPassword']) ? $arrParameters['smtp_NetworkAgentPassword'] : '';
		
		return $this->send_mail($mail, $smtp_username, $smtp_password, $smtp_ip, $smtp_port, $content, $alarm_mail_title, $smtp_NetworkAgent, $smtp_NetworkAgentIp, $smtp_NetworkAgentPort, $smtp_NetworkAgentUsername, $smtp_NetworkAgentPassword);
	}

	/**
	 * 发送
	 *
	 * @param string $AddAddress
	 *        	对方邮箱
	 * @param string $username
	 *        	用户名
	 * @param string $password
	 *        	密码
	 * @param string $smtp
	 *        	IP地址
	 * @param string $port
	 *        	端口号
	 * @param string $content
	 *        	内容
	 * @param string $alarm_mail_title
	 *        	标题
	 * @return string
	 */
	public function send_mail($AddAddress, $username, $password, $smtp, $port, $content, $alarm_mail_title, $smtp_NetworkAgent = '', $smtp_NetworkAgentIp = '', $smtp_NetworkAgentPort = '', $smtp_NetworkAgentUsername = '', $smtp_NetworkAgentPassword = '')
	{
		$pattern = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
		$domain_name = preg_replace($pattern, "$2", $username);
		$FromName = preg_replace($pattern, "$1", $username); // 发件人
		
		$Subject = $alarm_mail_title; // 标题
		$Subject = "=?utf-8?B?" . base64_encode($Subject) . "?=";
		
		$body = $content;
		;
		$body = preg_replace('/\\\/', '', $body);
		
		$mail = new PHPMailer();
		
		// 设置smtp参数
		$mail->IsSMTP();
		$mail->SMTPAuth = true;
		$mail->SMTPKeepAlive = true;
		$mail->Host = $smtp;
		$mail->Port = $port;
		$mail->CharSet = "UTF-8";
		if ($port == 465) {
			$mail->SMTPSecure = 'ssl';
		} else if ($port == 25) {
			$mail->SMTPAutoTLS = false;
			$mail->SMTPSecure = false;
			$mail->SMTPAuth = false;
			$mail->SMTPOptions = array(
				'ssl' => array(
					'verify_peer' => false,
					'verify_peer_name' => false,
					'allow_self_signed' => true,
				)
			);
		}
		// 填写你的gmail账号和密码
		$mail->Username = $username;
		$mail->Password = $password;
		
		// 设置发送方，最好不要伪造地址
		$mail->From = $username;
		$mail->FromName = $FromName;
		$mail->Subject = $Subject;
		$mail->AltBody = $body;
		$mail->WordWrap = 50; // 设置每行字符串的长度
		$mail->MsgHTML($body);
		
		// 设置回复地址
		$mail->AddReplyTo($username, $FromName);
		
		// 设置邮件接收方的邮箱和姓名
		$mail->AddAddress($AddAddress, $AddAddress);
		
		// 使用HTML格式发送邮件
		$mail->IsHTML(true);
		
		if ($smtp_NetworkAgent) {
			if (empty($smtp_NetworkAgentUsername)) {
				// 不需要认证的不需要配置 proxyUsername和proxyPassowrd
				$mail->proxy = array(
					'proxyHost' => $smtp_NetworkAgentIp,
					'proxyPort' => $smtp_NetworkAgentPort
				);
			} else {
				// 配置代理信息proxy为空时不使用代理 如果socks 不需要认证 socks服务器会返回 0x05 0x00 需要密码 0x05 0x02
				$mail->proxy = array(
					'proxyHost' => $smtp_NetworkAgentIp,
					'proxyPort' => $smtp_NetworkAgentPort,
					'proxyUsername' => $smtp_NetworkAgentUsername,
					'proxyPassword' => $smtp_NetworkAgentPassword
				);
			}
		}
		
		// 通过Send方法发送邮件
		$str = '';
		if (! $mail->Send()) { // 发送邮件
			$str = $mail->ErrorInfo;
		}
		
		return $str;
	}
}