正在显示
5 个修改的文件
包含
90 行增加
和
69 行删除
| @@ -13,6 +13,7 @@ use Model\listsSql; | @@ -13,6 +13,7 @@ use Model\listsSql; | ||
| 13 | use Model\sendJobsSql; | 13 | use Model\sendJobsSql; |
| 14 | use PHPMailer\PHPMailer\PHPMailer; | 14 | use PHPMailer\PHPMailer\PHPMailer; |
| 15 | use PHPMailer\PHPMailer\SMTP; | 15 | use PHPMailer\PHPMailer\SMTP; |
| 16 | +use Service\SyncMail; | ||
| 16 | use function Swoole\Coroutine\Http\request; | 17 | use function Swoole\Coroutine\Http\request; |
| 17 | 18 | ||
| 18 | 19 | ||
| @@ -858,23 +859,10 @@ class Home extends Base { | @@ -858,23 +859,10 @@ class Home extends Base { | ||
| 858 | 859 | ||
| 859 | // 是否再次 重新获取 | 860 | // 是否再次 重新获取 |
| 860 | $reload = app()->request('reload',0,'intval'); | 861 | $reload = app()->request('reload',0,'intval'); |
| 861 | - if($reload){ | ||
| 862 | - // 删除原有数据 | ||
| 863 | - db()->delete(bodySql::$table,['lists_id'=>$id]); | ||
| 864 | - //同步基础信息 | ||
| 865 | - $mail = new Mail($email['email'],base64_decode($email['password']),$email['imap']); | ||
| 866 | - if($mail->login()==1){ | ||
| 867 | - $folder = db()->value(folderSql::first(['id'=>$data['folder_id']],'origin_folder')); | ||
| 868 | - if($folder){ | ||
| 869 | - $mail->client->selectFolder($folder); | ||
| 870 | - $mail->syncUidEmail([$data['uid']],$email['id'],$folder,$data['folder_id'],[],[],db()); | ||
| 871 | - } | ||
| 872 | - } | ||
| 873 | - } | ||
| 874 | 862 | ||
| 875 | HOME_INFO_BODY: | 863 | HOME_INFO_BODY: |
| 876 | $body = db()->first(bodySql::first($id)); | 864 | $body = db()->first(bodySql::first($id)); |
| 877 | - if($body){ | 865 | + if($body && !$reload){ |
| 878 | $data['body'] = json_decode($body['text_html'],true); | 866 | $data['body'] = json_decode($body['text_html'],true); |
| 879 | 867 | ||
| 880 | $charset = 'utf-8'; | 868 | $charset = 'utf-8'; |
| @@ -897,8 +885,8 @@ class Home extends Base { | @@ -897,8 +885,8 @@ class Home extends Base { | ||
| 897 | 885 | ||
| 898 | if(!empty($bd['path'])){ | 886 | if(!empty($bd['path'])){ |
| 899 | 887 | ||
| 900 | - $data['body'][$bdk]['name'] = @base64_decode($bd['name']); | ||
| 901 | - $data['body'][$bdk]['filename'] = @base64_decode($bd['filename']); | 888 | + $data['body'][$bdk]['name'] = MailFun::isBase64($bd['name']) ? @base64_decode($bd['name']) : $bd['name']; |
| 889 | + $data['body'][$bdk]['filename'] = MailFun::isBase64($bd['filename']) ? @base64_decode($bd['filename']) : $bd['filename']; | ||
| 902 | // 进行编码转换 会出现未知bug | 890 | // 进行编码转换 会出现未知bug |
| 903 | // if($charset && strtolower($charset) != 'utf-8' && strtolower($charset) != 'utf8'){ | 891 | // if($charset && strtolower($charset) != 'utf-8' && strtolower($charset) != 'utf8'){ |
| 904 | // $data['body'][$bdk]['name'] = @iconv($charset,'utf-8',$data['body'][$bdk]['name']); | 892 | // $data['body'][$bdk]['name'] = @iconv($charset,'utf-8',$data['body'][$bdk]['name']); |
| @@ -945,31 +933,17 @@ class Home extends Base { | @@ -945,31 +933,17 @@ class Home extends Base { | ||
| 945 | 'data' => $data | 933 | 'data' => $data |
| 946 | ]; | 934 | ]; |
| 947 | } | 935 | } |
| 936 | + | ||
| 948 | // 循环几次 | 937 | // 循环几次 |
| 949 | if($data['uid']&&$sync_num < 1){ | 938 | if($data['uid']&&$sync_num < 1){ |
| 950 | - $mail = new Mail($email['email'],base64_decode($email['password']),$email['imap']); | ||
| 951 | - | ||
| 952 | - if($mail->login()==1){ | ||
| 953 | - | ||
| 954 | - $folder = db()->value(folderSql::first(['id'=>$data['folder_id']],'origin_folder')); | ||
| 955 | - if($folder){ | ||
| 956 | - $ret = $mail->syncBody($folder,$data['uid'],$id); | ||
| 957 | - $sync_num++; | ||
| 958 | - if($ret){ | ||
| 959 | - goto HOME_INFO_BODY; | ||
| 960 | - } | ||
| 961 | - } | ||
| 962 | - | ||
| 963 | - } | 939 | + $folder = db()->value(folderSql::first(['id'=>$data['folder_id']],'origin_folder')); |
| 940 | + (new SyncMail($data['email_id']))->mail($folder,[$data['uid']],true); | ||
| 941 | + $sync_num++; | ||
| 942 | + $reload = 0; | ||
| 943 | + goto HOME_INFO_BODY; | ||
| 964 | } | 944 | } |
| 965 | logs('超过读取body次数 '.$data['id']); | 945 | logs('超过读取body次数 '.$data['id']); |
| 966 | 946 | ||
| 967 | - if(isset($mail)){ | ||
| 968 | - if(!$mail->client->hasMail($data['uid'])){ | ||
| 969 | - app()->e('mail_not'); | ||
| 970 | - } | ||
| 971 | - } | ||
| 972 | - | ||
| 973 | }else{ | 947 | }else{ |
| 974 | logs('读取body 没有查询到数据 '.$id.'-'.($email['email']??'')); | 948 | logs('读取body 没有查询到数据 '.$id.'-'.($email['email']??'')); |
| 975 | } | 949 | } |
| @@ -98,19 +98,25 @@ class Attachment { | @@ -98,19 +98,25 @@ class Attachment { | ||
| 98 | 98 | ||
| 99 | /** | 99 | /** |
| 100 | * 保存 文件到目录 | 100 | * 保存 文件到目录 |
| 101 | - * @param string $filename 绝对路径的目录 文件名 | ||
| 102 | - * @return bool | 101 | + * @param string $path 绝对路径的目录 |
| 102 | + * @param string $filename 文件名 | ||
| 103 | + * @return bool|string | ||
| 103 | * @author:dc | 104 | * @author:dc |
| 104 | * @time 2024/9/21 17:10 | 105 | * @time 2024/9/21 17:10 |
| 105 | */ | 106 | */ |
| 106 | - public function save(string $filename):bool { | ||
| 107 | - $path = dirname($filename); | 107 | + public function save(string $path, string $filename = ''):bool|string { |
| 108 | + | ||
| 109 | + $filename = $filename ? : (md5($this->getContent()).'.'.$this->getExtension()); | ||
| 110 | + | ||
| 108 | if(!is_dir($path)){ | 111 | if(!is_dir($path)){ |
| 109 | @mkdir($path,0775,true); | 112 | @mkdir($path,0775,true); |
| 110 | } | 113 | } |
| 114 | + | ||
| 115 | + $path = rtrim($path,'/').'/'; | ||
| 116 | + | ||
| 111 | // 保存文件 | 117 | // 保存文件 |
| 112 | - if(@file_put_contents($filename,$this->getContent())){ | ||
| 113 | - return true; | 118 | + if(@file_put_contents($path.$filename,$this->getContent())){ |
| 119 | + return $path.$filename; | ||
| 114 | } | 120 | } |
| 115 | 121 | ||
| 116 | return false; | 122 | return false; |
| @@ -244,6 +244,8 @@ class Body { | @@ -244,6 +244,8 @@ class Body { | ||
| 244 | 244 | ||
| 245 | // 默认编码 | 245 | // 默认编码 |
| 246 | if(!$data->Charset) $data->Charset = 'utf-8'; | 246 | if(!$data->Charset) $data->Charset = 'utf-8'; |
| 247 | + // 处理content id中意外的字符串 | ||
| 248 | + $data->set('Content-ID',trim(str_replace(['"','<','>'],'',$data->get('Content-ID')))); | ||
| 247 | 249 | ||
| 248 | return $data; | 250 | return $data; |
| 249 | } | 251 | } |
| @@ -319,17 +321,24 @@ class Body { | @@ -319,17 +321,24 @@ class Body { | ||
| 319 | * 读取附件 目前有2中 | 321 | * 读取附件 目前有2中 |
| 320 | * 1是 attachment 附件 就是文件 | 322 | * 1是 attachment 附件 就是文件 |
| 321 | * 2是 inline 是嵌套在html代码中的,一半情况只有图片才会这样做 | 323 | * 2是 inline 是嵌套在html代码中的,一半情况只有图片才会这样做 |
| 322 | - * @param bool $inline 是否是读取嵌入html中的图片或者其他,一半情况 图片路径以 cid:xxx | 324 | + * @param bool|null $inline 是否是读取嵌入html中的图片或者其他,一半情况 图片路径以 cid:xxx |
| 323 | * @return Attachment[] | 325 | * @return Attachment[] |
| 324 | * @author:dc | 326 | * @author:dc |
| 325 | * @time 2024/9/23 10:23 | 327 | * @time 2024/9/23 10:23 |
| 326 | */ | 328 | */ |
| 327 | - public function getAttachment(bool $inline = false):array { | 329 | + public function getAttachment(bool|null $inline = null):array { |
| 328 | $attachment = []; | 330 | $attachment = []; |
| 329 | foreach ($this->items as $item){ | 331 | foreach ($this->items as $item){ |
| 330 | // 有的邮箱服务器 不带inline,就只有通过content-id来识别了 | 332 | // 有的邮箱服务器 不带inline,就只有通过content-id来识别了 |
| 331 | - if((!$inline && $item->eq('Content-Disposition','attachment')) || ($inline && $item->get('Content-ID'))){ | ||
| 332 | - $attachment[] = new Attachment($item); | 333 | + $isAttachment = $item->eq('Content-Disposition','attachment'); |
| 334 | + if($inline === null){ | ||
| 335 | + if($isAttachment || $item->get('Content-ID')){ | ||
| 336 | + $attachment[] = new Attachment($item); | ||
| 337 | + } | ||
| 338 | + }else{ | ||
| 339 | + if((!$inline && $isAttachment) || ($inline && $item->get('Content-ID'))){ | ||
| 340 | + $attachment[] = new Attachment($item); | ||
| 341 | + } | ||
| 333 | } | 342 | } |
| 334 | } | 343 | } |
| 335 | 344 |
| @@ -134,10 +134,13 @@ class Header{ | @@ -134,10 +134,13 @@ class Header{ | ||
| 134 | */ | 134 | */ |
| 135 | private function parseAddress(string $address, $isArray = false){ | 135 | private function parseAddress(string $address, $isArray = false){ |
| 136 | $arr = []; | 136 | $arr = []; |
| 137 | - foreach (explode(',',$address) as $k=>$str){ | ||
| 138 | - $arr[$k] = Address::make($str); | ||
| 139 | - if($isArray) $arr[$k] = $arr[$k]->toArray(); | 137 | + if($address){ |
| 138 | + foreach (explode(',',$address) as $k=>$str){ | ||
| 139 | + $arr[$k] = Address::make($str); | ||
| 140 | + if($isArray) $arr[$k] = $arr[$k]->toArray(); | ||
| 141 | + } | ||
| 140 | } | 142 | } |
| 143 | + | ||
| 141 | return $arr; | 144 | return $arr; |
| 142 | } | 145 | } |
| 143 | 146 |
| @@ -201,7 +201,7 @@ class SyncMail { | @@ -201,7 +201,7 @@ class SyncMail { | ||
| 201 | */ | 201 | */ |
| 202 | public function mail(string|\Lib\Imap\Request\Folder $folder, array $uids = [],$isBody = false){ | 202 | public function mail(string|\Lib\Imap\Request\Folder $folder, array $uids = [],$isBody = false){ |
| 203 | if(is_string($folder)){ | 203 | if(is_string($folder)){ |
| 204 | - $folder = $this->imap->folder($folder); | 204 | + $folder = $this->imap->folder($folder)->exec(); |
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | $folder_id = $this->db->value(folderSql::first([ | 207 | $folder_id = $this->db->value(folderSql::first([ |
| @@ -298,25 +298,54 @@ class SyncMail { | @@ -298,25 +298,54 @@ class SyncMail { | ||
| 298 | // 是否同步body内容 | 298 | // 是否同步body内容 |
| 299 | if($isBody){ | 299 | if($isBody){ |
| 300 | 300 | ||
| 301 | -// $body = [ | ||
| 302 | -// 'lists_id' => $id, | ||
| 303 | -// 'text_html' => [] | ||
| 304 | -// ]; | ||
| 305 | -// | ||
| 306 | -// foreach ($item->getBody()->getItems() as $item){ | ||
| 307 | -// $body['text_html'][] = [ | ||
| 308 | -// 'body' => $item->body, | ||
| 309 | -// 'content-type' => $item->get('content-type'), | ||
| 310 | -// 'content-id' => $item->get('content-id'), | ||
| 311 | -// 'charset' => $item->get('charset') | ||
| 312 | -// ]; | ||
| 313 | -// } | ||
| 314 | -// | ||
| 315 | -// if($this->db->count(bodySql::has($id))){ | ||
| 316 | -// $this->db->update(bodySql::$table,$body,'`lists_id` = '.$id,false); | ||
| 317 | -// }else{ | ||
| 318 | -// $this->db->insert(bodySql::$table,$body,false); | ||
| 319 | -// } | 301 | + $body = [ |
| 302 | + 'lists_id' => $id, | ||
| 303 | + 'text_html' => [] | ||
| 304 | + ]; | ||
| 305 | + | ||
| 306 | + | ||
| 307 | + $body['text_html'][] = [ | ||
| 308 | + 'body' => base64_encode($item->getBody()->getHtml() ? : $item->getBody()->getText()), | ||
| 309 | + 'type' => 'text/html', | ||
| 310 | + 'charset' => 'utf-8', | ||
| 311 | + 'encode' => 'base64', | ||
| 312 | + ]; | ||
| 313 | + | ||
| 314 | + // 处理附件 | ||
| 315 | + foreach ($item->getBody()->getAttachment() as $itemBody){ | ||
| 316 | + $tmp = [ | ||
| 317 | + 'body' => '', | ||
| 318 | + 'type' => $itemBody->getFileType(), | ||
| 319 | + 'charset' => 'binary', | ||
| 320 | + 'encode' => $itemBody->data->get('content-transfer-encoding'), | ||
| 321 | + 'name' => $itemBody->getFilename(), | ||
| 322 | + 'filename' => $itemBody->getFilename(), | ||
| 323 | + 'path' => $itemBody->save(MAIL_ATTACHMENT_PATH) | ||
| 324 | + ]; | ||
| 325 | + if(!$tmp){ | ||
| 326 | + throw new \Exception('请检查附件是否有写入权限'); | ||
| 327 | + } | ||
| 328 | + if($itemBody->getContentId()){ | ||
| 329 | + $tmp['content-id'] = $itemBody->getContentId(); | ||
| 330 | + } | ||
| 331 | + if($itemBody->data->get('Content-Disposition')){ | ||
| 332 | + $tmp['content-disposition'] = $itemBody->data->get('Content-Disposition'); | ||
| 333 | + } | ||
| 334 | + $tmp['signName'] = explode('/',$tmp['path']); | ||
| 335 | + $tmp['signName'] = end($tmp['signName']); | ||
| 336 | + | ||
| 337 | + $body['text_html'][] = $tmp; | ||
| 338 | + | ||
| 339 | + } | ||
| 340 | + | ||
| 341 | + if($this->db->count(bodySql::has($id))){ | ||
| 342 | + $this->db->update(bodySql::$table,$body,'`lists_id` = '.$id,false); | ||
| 343 | + }else{ | ||
| 344 | + $this->db->insert(bodySql::$table,$body,false); | ||
| 345 | + } | ||
| 346 | + | ||
| 347 | + // 更新描述 | ||
| 348 | + $this->db->update(listsSql::$table,['description'=>mb_substr($item->getBody()->getText(),0,150)],dbWhere(['id'=> $id])); | ||
| 320 | 349 | ||
| 321 | } | 350 | } |
| 322 | 351 |
-
请 注册 或 登录 后发表评论