文章转载自:http://www.cnblogs.com/luguo3000/p/3940197.html
一、邮件功能实现
项目中在任务完成时需要触发给用户发送带附件的邮件事件,这里发送邮件碰到了一个难题,如何把附件添加到附件中去?(附件格式:map类型 => key为带扩展名的附件名称,value为附件的二进制数组格式——转换为二进制字节流「也不知道是不是这样,反正邮件功能可用,可能是代码中对之前的格式进行了一些封装」)。
代码如下:
class Mail{ const API_URL = "http://xxxxx.xxxxxx.com/api/v1/mail"; //mail 配置,勿动 public static $mailConf = array( 'templateCode' => "XXXXXX-AUTO-TEST", 'subject' =>'数据监控发现异常', 'accessId' => "xxxxxxx", 'accessToken' =>"15fe916cdf53428585951d91xxxxxxx", 'templateParam' =>array( 'content' =>'<body>', ), ); /** * SendMail function * 发送邮件 * @param [array] $arrUid 收件人列表 * @param [string] $content 邮件正文内容 * @param [string] $ccId 邮件抄送人,分号隔离多个用户 * @param [string] $subject 邮件主题内容 * @param [string] $attachments 附件 * @param [date] $expectedTime 定时发送时间 * @return bool */ public static function sendMail($arrUid, $content, $subject=null, $attachments=null, $ccId=null, $expectedTime=null) {
$arrMail = self::$mailConf; $arrMail['ccId'] = $ccId; foreach($arrUid as $key => $user) { $arrMail['userId'] = $user; $arrMail['subject'] = $subject ?? self::$mailConf['subject']; $arrMail['expectedTime'] = $expectedTime ?? date('Y-m-d H:i:s',time()); //没有设置定时发送时间,则立即发送,发送时间为当前时间 if (!empty($attachments) && is_array($attachments)) { $arrMail['attachments'] = []; // 附件 foreach ($attachments as $name => $path) { // name表示附件名称,path表示附件路径 if(file_exists($path)) { $string = fread(fopen($path,'rb'),filesize($path)); $arrMail['attachments'][$name] = base64_encode($string); fclose($path); } // throw new \Exception("文件%s不存在", $path); } } $arrMail['templateParam']['content'] .= $content.'</body>'; $arrRes = self::CurlPost(self::API_URL, json_encode($arrMail), true); if(!$arrRes){ Log::warning('Send Mail failed ! maybe network is error!\n'); return false; } $arrRes = json_decode($arrRes, true); if($arrRes['success'] != 'true' ) { Log::warning('Send Mail failed ! please check config!\n'); return false; } } return true; } /** * @function 封装好的post请求类,可以直接调用,如果后期文件比较大,可以考虑单独写个文件 * @param $url 请求的URL, $file_data 上传的文件/数据 * @return 执行结果,空为false */ public static function CurlPost($url, $file_data, $json = false) { $ch = curl_init(); $timeout = 10; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); //curl_setopt($ch, CURLOPT_COOKIE, self::$cookie); curl_setopt($ch, CURLOPT_POST, 1); |