正在显示
13 个修改的文件
包含
216 行增加
和
71 行删除
@@ -115,20 +115,14 @@ function sync($email_id,$worker_id){ | @@ -115,20 +115,14 @@ function sync($email_id,$worker_id){ | ||
115 | return 1; | 115 | return 1; |
116 | } | 116 | } |
117 | 117 | ||
118 | - $mailServer = new Lib\Mail\Mail(); | 118 | + $mailServer = new Lib\Mail\Mail($email['email'],base64_decode($email['password']),$email['imap']); |
119 | 119 | ||
120 | - try { | ||
121 | // 登录服务器 | 120 | // 登录服务器 |
122 | - $mailServer->login($email['email'],base64_decode($email['password']),$email['imap']); | ||
123 | - }catch (Throwable $e){ | ||
124 | - if($e->getCode() == 403){ | ||
125 | - // 登录失败了 , | ||
126 | - db()->update(\Model\emailSql::$table,['pwd_error'=>1],dbWhere(['id'=>$email_id])); | ||
127 | - } | ||
128 | - | 121 | + if(!$mailServer->login()){ |
129 | return 2; | 122 | return 2; |
130 | } | 123 | } |
131 | 124 | ||
125 | + | ||
132 | // 同步文件夹 | 126 | // 同步文件夹 |
133 | $mailServer->syncFolder($email_id,db()); | 127 | $mailServer->syncFolder($email_id,db()); |
134 | 128 |
@@ -239,21 +239,13 @@ function sync($worker_id=0){ | @@ -239,21 +239,13 @@ function sync($worker_id=0){ | ||
239 | return 1; | 239 | return 1; |
240 | } | 240 | } |
241 | 241 | ||
242 | - $mailServer = new Lib\Mail\Mail(); | ||
243 | - | ||
244 | - try { | ||
245 | - // 登录服务器 | ||
246 | - $mailServer->login($email['email'],base64_decode($email['password']),$email['imap']); | ||
247 | - }catch (Throwable $e){ | ||
248 | - if($e->getCode() == 403){ | ||
249 | - // 登录失败了 , | ||
250 | - db()->update(\Model\emailSql::$table,['pwd_error'=>1],dbWhere(['id'=>$id])); | ||
251 | - } | 242 | + $mailServer = new Lib\Mail\Mail($email['email'],base64_decode($email['password']),$email['imap']); |
252 | 243 | ||
244 | + // 登录服务器 | ||
245 | + if(!$mailServer->login()){ | ||
253 | return 2; | 246 | return 2; |
254 | } | 247 | } |
255 | 248 | ||
256 | - | ||
257 | // 文件夹间隔1天同步一次 | 249 | // 文件夹间隔1天同步一次 |
258 | if(empty($email['last_sync_time']) || time() > $email['last_sync_time']+86400){ | 250 | if(empty($email['last_sync_time']) || time() > $email['last_sync_time']+86400){ |
259 | // 同步文件夹 | 251 | // 同步文件夹 |
@@ -7,6 +7,8 @@ | @@ -7,6 +7,8 @@ | ||
7 | "php": "^8.0.2", | 7 | "php": "^8.0.2", |
8 | "ext-pdo": "*", | 8 | "ext-pdo": "*", |
9 | "ext-redis": "*", | 9 | "ext-redis": "*", |
10 | + "ext-mbstring": "*", | ||
11 | + "ext-json": "*", | ||
10 | "phpmailer/phpmailer": "^6.7" | 12 | "phpmailer/phpmailer": "^6.7" |
11 | }, | 13 | }, |
12 | "require-dev": { | 14 | "require-dev": { |
@@ -46,15 +46,17 @@ class Folder extends Base { | @@ -46,15 +46,17 @@ class Folder extends Base { | ||
46 | * @time 2023/2/18 17:56 | 46 | * @time 2023/2/18 17:56 |
47 | */ | 47 | */ |
48 | public function create(){ | 48 | public function create(){ |
49 | + $email = $this->getEmail('id'); | ||
50 | + | ||
49 | $formData = app()->request(['pid','folder']); | 51 | $formData = app()->request(['pid','folder']); |
50 | // 验证目录 可以输入中文英文数字 | 52 | // 验证目录 可以输入中文英文数字 |
51 | - if(empty($formData['folder']) || !preg_match("/^[\u4E00-\u9FA5A-Za-z0-9_]+$/",$formData['folder'])){ | 53 | + if(empty($formData['folder'])){ |
52 | app()->e('folder_create_name_error'); | 54 | app()->e('folder_create_name_error'); |
53 | } | 55 | } |
54 | // 不为空上级 | 56 | // 不为空上级 |
55 | if(!empty($formData['pid'])){ | 57 | if(!empty($formData['pid'])){ |
56 | $parent = db()->first(folderSql::first(['id'=>$formData['pid']])); | 58 | $parent = db()->first(folderSql::first(['id'=>$formData['pid']])); |
57 | - if(!$parent || $parent['email_id'] != $this->login_email['id']){ | 59 | + if(!$parent || $parent['email_id'] != $email['id']){ |
58 | app()->e('folder_parent_not_fount'); | 60 | app()->e('folder_parent_not_fount'); |
59 | } | 61 | } |
60 | if($parent['pid']){ | 62 | if($parent['pid']){ |
@@ -63,11 +65,13 @@ class Folder extends Base { | @@ -63,11 +65,13 @@ class Folder extends Base { | ||
63 | 65 | ||
64 | } | 66 | } |
65 | 67 | ||
68 | + $formData['folder'] = str_replace(["'",'"','/','\\','&','*','(',')'],'',$formData['folder']); | ||
69 | + | ||
66 | // 判断文件夹是否存在 | 70 | // 判断文件夹是否存在 |
67 | $has = db()->count(folderSql::has( | 71 | $has = db()->count(folderSql::has( |
68 | [ | 72 | [ |
69 | - 'email_id' => $this->login_email['id'], | ||
70 | - 'origin_folder' => $formData['folder'] | 73 | + 'email_id' => $email['id'], |
74 | + 'origin_folder' => MailFun::folderEncoding($formData['folder']) | ||
71 | ] | 75 | ] |
72 | )); | 76 | )); |
73 | 77 | ||
@@ -76,8 +80,19 @@ class Folder extends Base { | @@ -76,8 +80,19 @@ class Folder extends Base { | ||
76 | } | 80 | } |
77 | 81 | ||
78 | // 远程创建 | 82 | // 远程创建 |
79 | - $mail = new Mail(); | ||
80 | - $mail->login($this->login_email['email'],$this->login_email['password'],$this->login_email['imap']); | 83 | + $mail = new Mail( |
84 | + $email['email'], | ||
85 | + $email['password'], | ||
86 | + $email['imap'] | ||
87 | + ); | ||
88 | + | ||
89 | + if(!$mail->login()){ | ||
90 | + app()->e('login_error_imap'); | ||
91 | + } | ||
92 | + | ||
93 | + | ||
94 | + | ||
95 | + | ||
81 | $folder = $mail->client->folderCreate($formData['folder']); | 96 | $folder = $mail->client->folderCreate($formData['folder']); |
82 | 97 | ||
83 | 98 |
@@ -44,14 +44,14 @@ class Login { | @@ -44,14 +44,14 @@ class Login { | ||
44 | } | 44 | } |
45 | 45 | ||
46 | // 进行远程登录,验证 | 46 | // 进行远程登录,验证 |
47 | - try{ | ||
48 | - (new Mail())->login($formData['email'],$formData['password'],$formData['imap']); | ||
49 | - }catch (\Exception $e){ | ||
50 | - if($e->getCode()==403){ | ||
51 | - app()->e('login_error_imap'); | ||
52 | - } | 47 | + $login = (new Mail($formData['email'],$formData['password'],$formData['imap']))->login(false); |
48 | + if( $login === 0){ | ||
49 | + app()->e('login_error_imap'); | ||
50 | + }elseif ($login === -1){ | ||
51 | + app()->e('server_error'); | ||
53 | } | 52 | } |
54 | 53 | ||
54 | + | ||
55 | // 是否存在 | 55 | // 是否存在 |
56 | $id = db()->value(emailSql::hasEmail($formData['email'])); | 56 | $id = db()->value(emailSql::hasEmail($formData['email'])); |
57 | 57 |
@@ -50,16 +50,7 @@ function db():\Lib\DbPool{ | @@ -50,16 +50,7 @@ function db():\Lib\DbPool{ | ||
50 | */ | 50 | */ |
51 | function logs($message,$filename=null){ | 51 | function logs($message,$filename=null){ |
52 | 52 | ||
53 | - $filename = $filename ? $filename : LOG_PATH.'/error.log'; | ||
54 | - if(!is_dir(dirname($filename))){ | ||
55 | - @mkdir(dirname($filename),0755,true); | ||
56 | - } | ||
57 | - | ||
58 | - @file_put_contents( | ||
59 | - $filename, | ||
60 | - date('Y-m-d H:i:s ').print_r($message,true).PHP_EOL, | ||
61 | - FILE_APPEND | ||
62 | - ); | 53 | + \Lib\Log::append($message, $filename); |
63 | 54 | ||
64 | } | 55 | } |
65 | 56 |
@@ -299,19 +299,12 @@ class App { | @@ -299,19 +299,12 @@ class App { | ||
299 | */ | 299 | */ |
300 | public static function end() | 300 | public static function end() |
301 | { | 301 | { |
302 | - // 这里可以做其他事 | ||
303 | - $app = self::instance(); | ||
304 | - | ||
305 | - /** | ||
306 | - * 这里写 | ||
307 | - */ | ||
308 | 302 | ||
309 | - // end code | 303 | + $app = self::instance(); |
310 | 304 | ||
311 | // 记录日志 | 305 | // 记录日志 |
312 | - $filename = LOG_PATH.'/'.$app->nowDate().'.log'; | ||
313 | if($last_error = error_get_last()){ | 306 | if($last_error = error_get_last()){ |
314 | - logs(print_r($last_error,true), $filename); | 307 | + logs(print_r($last_error,true)); |
315 | 308 | ||
316 | $data['error_message'] = $last_error['message']; | 309 | $data['error_message'] = $last_error['message']; |
317 | $data['status'] = 502; | 310 | $data['status'] = 502; |
@@ -321,15 +314,15 @@ class App { | @@ -321,15 +314,15 @@ class App { | ||
321 | }else{ | 314 | }else{ |
322 | if($app->getError()){ | 315 | if($app->getError()){ |
323 | logs( | 316 | logs( |
324 | - is_string($app->getError()) ? $app->getError() : implode(PHP_EOL,$app->getError()), | ||
325 | - $filename | 317 | + is_string($app->getError()) ? $app->getError() : implode(PHP_EOL,$app->getError()) |
326 | ); | 318 | ); |
327 | } | 319 | } |
328 | 320 | ||
329 | self::echo($app->data); | 321 | self::echo($app->data); |
330 | } | 322 | } |
331 | 323 | ||
332 | - | 324 | + // 日志记录 |
325 | + Log::getInstance()->write(); | ||
333 | 326 | ||
334 | // header("Content-Type:text/event-stream;Charset=UTF-8;"); | 327 | // header("Content-Type:text/event-stream;Charset=UTF-8;"); |
335 | 328 |
@@ -67,11 +67,14 @@ class DbPool { | @@ -67,11 +67,14 @@ class DbPool { | ||
67 | } | 67 | } |
68 | $query = $this->client->prepare($sql); | 68 | $query = $this->client->prepare($sql); |
69 | 69 | ||
70 | - // todo:: 记录日志,生产请注释 | ||
71 | - logs( | ||
72 | - $params ? [$sql,$params] : $sql, | ||
73 | - LOG_PATH.'/sql.log' | ||
74 | - ); | 70 | + if(APP_DEBUG){ |
71 | + // todo:: 记录日志,生产请注释 | ||
72 | + logs( | ||
73 | + $params ? [$sql,$params] : $sql, | ||
74 | + LOG_PATH.'/sql.log' | ||
75 | + ); | ||
76 | + } | ||
77 | + | ||
75 | 78 | ||
76 | if($query->execute($params)){ | 79 | if($query->execute($params)){ |
77 | return $query; | 80 | return $query; |
lib/Log.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +namespace Lib; | ||
4 | + | ||
5 | + | ||
6 | +/** | ||
7 | + * 日志文件 | ||
8 | + * @author:dc | ||
9 | + * @time 2023/3/14 10:26 | ||
10 | + * Class Log | ||
11 | + * @package Lib | ||
12 | + */ | ||
13 | +class Log { | ||
14 | + | ||
15 | + | ||
16 | + /** | ||
17 | + * @var array | ||
18 | + */ | ||
19 | + public array $filename = []; | ||
20 | + | ||
21 | + /** | ||
22 | + * @var array | ||
23 | + */ | ||
24 | + public array $message = []; | ||
25 | + | ||
26 | + /** | ||
27 | + * @var self | ||
28 | + */ | ||
29 | + private static self $instance; | ||
30 | + | ||
31 | + /** | ||
32 | + * Log constructor. | ||
33 | + */ | ||
34 | + public function __construct() | ||
35 | + { | ||
36 | + $this->filename['default'] = LOG_PATH.'/'.app()->nowDate().'.error.log'; | ||
37 | + } | ||
38 | + | ||
39 | + /** | ||
40 | + * 追加日志内容 | ||
41 | + * @param string $message | ||
42 | + * @author:dc | ||
43 | + * @time 2023/3/14 10:45 | ||
44 | + */ | ||
45 | + public static function append(string $message, $filename = null){ | ||
46 | + | ||
47 | + if($filename){ | ||
48 | + self::getInstance()->setFilename($filename); | ||
49 | + } | ||
50 | + | ||
51 | + self::getInstance()->message[md5($filename)][] = $message; | ||
52 | + | ||
53 | + } | ||
54 | + | ||
55 | + | ||
56 | + /** | ||
57 | + * @return Log | ||
58 | + */ | ||
59 | + public static function getInstance(): Log | ||
60 | + { | ||
61 | + if (empty(static::$instance)){ | ||
62 | + static::$instance = new Log(); | ||
63 | + } | ||
64 | + | ||
65 | + return self::$instance; | ||
66 | + } | ||
67 | + | ||
68 | + /** | ||
69 | + * 设置日志文件 | ||
70 | + * @param $filename | ||
71 | + * @author:dc | ||
72 | + * @time 2023/3/14 11:11 | ||
73 | + */ | ||
74 | + private function setFilename($filename){ | ||
75 | + | ||
76 | + // 创建目录 | ||
77 | + if(!is_dir(dirname($filename))){ | ||
78 | + @mkdir(dirname($filename),0755,true); | ||
79 | + } | ||
80 | + | ||
81 | + $this->filename[md5($filename)] = $filename; | ||
82 | + | ||
83 | + | ||
84 | + } | ||
85 | + | ||
86 | + /** | ||
87 | + * 写入日志 | ||
88 | + * @author:dc | ||
89 | + * @time 2023/3/14 10:45 | ||
90 | + */ | ||
91 | + public function write(){ | ||
92 | + | ||
93 | + foreach ($this->filename as $key=>$fn){ | ||
94 | + if(!empty($this->message[$key])){ | ||
95 | + | ||
96 | + array_unshift($this->message[$key],app()->nowDateTime()); | ||
97 | + $this->message[$key][] = PHP_EOL; | ||
98 | + | ||
99 | + @file_put_contents( | ||
100 | + $fn, | ||
101 | + implode(PHP_EOL."\t",$this->message[$key]), | ||
102 | + FILE_APPEND | ||
103 | + ); | ||
104 | + $this->message[$key] = []; | ||
105 | + } | ||
106 | + | ||
107 | + } | ||
108 | + | ||
109 | + } | ||
110 | + | ||
111 | +} |
@@ -437,10 +437,10 @@ class Imap { | @@ -437,10 +437,10 @@ class Imap { | ||
437 | */ | 437 | */ |
438 | public function folderCreate(string $folder):string { | 438 | public function folderCreate(string $folder):string { |
439 | // 需要转码 | 439 | // 需要转码 |
440 | - $folder = mb_convert_encoding($folder,'UTF7-IMAP','UTF-8'); | 440 | + $folder = MailFun::folderEncoding($folder); |
441 | // A003 CREATE owatagusiam 顶级 | 441 | // A003 CREATE owatagusiam 顶级 |
442 | // A003 CREATE owatagusiam/owatagusiam2 有上下级关系的文件夹 | 442 | // A003 CREATE owatagusiam/owatagusiam2 有上下级关系的文件夹 |
443 | - $res = $this->request('CREATE '.$folder); | 443 | + $res = $this->request("CREATE \"{$folder}\""); |
444 | 444 | ||
445 | if ($res[0] == 'ok'){ | 445 | if ($res[0] == 'ok'){ |
446 | return $folder; | 446 | return $folder; |
@@ -21,23 +21,60 @@ class Mail { | @@ -21,23 +21,60 @@ class Mail { | ||
21 | */ | 21 | */ |
22 | public Imap $client; | 22 | public Imap $client; |
23 | 23 | ||
24 | + /** | ||
25 | + * @var string | ||
26 | + */ | ||
27 | + private string $username; | ||
24 | 28 | ||
25 | /** | 29 | /** |
26 | - * 登录imap服务器 | 30 | + * @var string |
31 | + */ | ||
32 | + private string $password; | ||
33 | + | ||
34 | + /** | ||
35 | + * @var string | ||
36 | + */ | ||
37 | + private string $server; | ||
38 | + | ||
39 | + /** | ||
40 | + * Mail constructor. | ||
27 | * @param string $email | 41 | * @param string $email |
28 | * @param string $password | 42 | * @param string $password |
29 | * @param string $imap | 43 | * @param string $imap |
44 | + */ | ||
45 | + public function __construct(string $email,string $password,string $imap) | ||
46 | + { | ||
47 | + $this->username = $email; | ||
48 | + $this->password = $password; | ||
49 | + $this->server = $imap; | ||
50 | + } | ||
51 | + | ||
52 | + /** | ||
53 | + * 登录imap服务器 | ||
54 | + * @param bool $pass_err | ||
55 | + * @return int | ||
30 | * @author:dc | 56 | * @author:dc |
31 | - * @time 2023/2/5 10:46 | 57 | + * @time 2023/3/14 10:03 |
32 | */ | 58 | */ |
33 | - public function login(string $email,string $password,string $imap) { | 59 | + public function login($pass_err=true):int { |
34 | 60 | ||
35 | $this->client = new Imap(); | 61 | $this->client = new Imap(); |
36 | 62 | ||
37 | - // 是否初始成功 | ||
38 | - $this->client->login("ssl://{$imap}:993",$email,$password); | 63 | + try { |
64 | + // 是否初始成功 | ||
65 | + $this->client->login("ssl://{$this->server}:993",$this->username,$this->password); | ||
66 | + }catch (\Throwable $e){ | ||
67 | + if($pass_err && $e->getCode() == 403){ | ||
68 | + // 登录失败了 , | ||
69 | + db()->update(\Model\emailSql::$table,['pwd_error'=>1],dbWhere(['email'=>$this->username])); | ||
70 | + }else{ | ||
71 | + logs($e->getMessage()); | ||
72 | + } | ||
39 | 73 | ||
40 | - return true; | 74 | + return $e->getCode() == 403 ? 0 : -1; |
75 | + | ||
76 | + } | ||
77 | + return 1; | ||
41 | } | 78 | } |
42 | 79 | ||
43 | 80 |
@@ -201,5 +201,15 @@ class MailFun { | @@ -201,5 +201,15 @@ class MailFun { | ||
201 | 201 | ||
202 | } | 202 | } |
203 | 203 | ||
204 | + /** | ||
205 | + * 文件夹名 编译 | ||
206 | + * @param $folder | ||
207 | + * @return string | ||
208 | + * @author:dc | ||
209 | + * @time 2023/3/14 9:37 | ||
210 | + */ | ||
211 | + public static function folderEncoding($folder):string { | ||
212 | + return mb_convert_encoding($folder,'UTF7-IMAP','UTF-8'); | ||
213 | + } | ||
204 | 214 | ||
205 | } | 215 | } |
-
请 注册 或 登录 后发表评论