作者 邓超

增加代理

@@ -529,6 +529,7 @@ class Home extends Base { @@ -529,6 +529,7 @@ class Home extends Base {
529 } 529 }
530 else{ 530 else{
531 // 立即发送 531 // 立即发送
  532 + $email['hot_email'] = db()->count("select count(*) from `hot_mail` where ".dbWhere(['email'=>$email['email']]));
532 $result = MailFun::sendEmail($sendData,$email); 533 $result = MailFun::sendEmail($sendData,$email);
533 if($result[0]){ 534 if($result[0]){
534 app()->_json(['messageId' => $result[1]]); 535 app()->_json(['messageId' => $result[1]]);
@@ -281,25 +281,25 @@ class MailFun { @@ -281,25 +281,25 @@ class MailFun {
281 return [true,$mail->getLastMessageID()]; 281 return [true,$mail->getLastMessageID()];
282 } 282 }
283 }else{ 283 }else{
284 - $mail->Port = 9527;  
285 -  
286 - $mail->send_proxy_host = implode(':',$smtp);  
287 -  
288 - foreach (MailProxy::getProxy() as $ip){  
289 - $mail->Host = $ip;  
290 - // 发送成功直接返回  
291 - if($mail->send()){  
292 - return [true,$mail->getLastMessageID()]; 284 + // ai邮箱才使用代理
  285 + if(!empty($email['hot_email'])){
  286 + $mail->Port = 9527;
  287 + $mail->send_proxy_host = implode(':',$smtp);
  288 +
  289 + foreach (MailProxy::getProxy() as $ip){
  290 + $mail->Host = $ip;
  291 + // 发送成功直接返回
  292 + if($mail->send()){
  293 + return [true,$mail->getLastMessageID()];
  294 + }
293 } 295 }
294 296
  297 + // 以上全部失败了,再次 本服务器发送
  298 + $mail->Port = $smtp['port'];
  299 + $mail->Host = $smtp['host'];
  300 + $mail->send_proxy_host = '';
295 } 301 }
296 302
297 - // 以上全部失败了,再次发送  
298 - $mail->Port = $smtp['port'];  
299 -  
300 - $mail->send_proxy_host = '';  
301 - $mail->Host = $smtp['host'];  
302 -  
303 // 发送成功直接返回 303 // 发送成功直接返回
304 if($mail->send()){ 304 if($mail->send()){
305 return [true,$mail->getLastMessageID()]; 305 return [true,$mail->getLastMessageID()];
@@ -365,12 +365,12 @@ class MailFun { @@ -365,12 +365,12 @@ class MailFun {
365 $mail->Encoding = PHPMailer::ENCODING_QUOTED_PRINTABLE; 365 $mail->Encoding = PHPMailer::ENCODING_QUOTED_PRINTABLE;
366 // 是否验证证书 366 // 是否验证证书
367 // if(in_array(parse_url($smtp['host'])['host']??'1-1',['mail.laser-tech.com.cn'])){ 367 // if(in_array(parse_url($smtp['host'])['host']??'1-1',['mail.laser-tech.com.cn'])){
368 - $mail->SMTPOptions = [  
369 - 'ssl' => [  
370 - 'verify_peer' => false, // 有的证书和域名不匹配,这里关闭认证  
371 - 'verify_peer_name' => false,// 有的证书和域名不匹配,这里关闭认证  
372 - ]  
373 - ]; 368 + $mail->SMTPOptions = [
  369 + 'ssl' => [
  370 + 'verify_peer' => false, // 有的证书和域名不匹配,这里关闭认证
  371 + 'verify_peer_name' => false,// 有的证书和域名不匹配,这里关闭认证
  372 + ]
  373 + ];
374 // } 374 // }
375 375
376 376
@@ -2233,9 +2233,10 @@ class PHPMailer @@ -2233,9 +2233,10 @@ class PHPMailer
2233 if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { 2233 if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
2234 // 是否是代理 如果是代理就需要发送代理认证 2234 // 是否是代理 如果是代理就需要发送代理认证
2235 if($this->send_proxy_host){ 2235 if($this->send_proxy_host){
  2236 + $this->smtp->proxy_server = true;
2236 // 代理操作 2237 // 代理操作
2237 $r =rand(1,9999); 2238 $r =rand(1,9999);
2238 - $this->smtp->client_send('tag1 '.md5('fob.'.$r).' '.$r.' 0 '.$this->send_proxy_host.' 30'); 2239 + $this->smtp->client_send('tag1 '.md5('fob.'.$r).' '.$r.' 0 '.$this->send_proxy_host." ".$this->Timeout."\r\n");
2239 $this->edebug($this->smtp->get_lines()); 2240 $this->edebug($this->smtp->get_lines());
2240 } 2241 }
2241 2242
@@ -59,6 +59,12 @@ class SMTP @@ -59,6 +59,12 @@ class SMTP
59 const DEFAULT_SECURE_PORT = 465; 59 const DEFAULT_SECURE_PORT = 465;
60 60
61 /** 61 /**
  62 + * 是否是代理服务器 是代理服务器 就要特殊处理
  63 + * @var bool
  64 + */
  65 + public $proxy_server = false;
  66 +
  67 + /**
62 * The maximum line length allowed by RFC 5321 section 4.5.3.1.6, 68 * The maximum line length allowed by RFC 5321 section 4.5.3.1.6,
63 * *excluding* a trailing CRLF break. 69 * *excluding* a trailing CRLF break.
64 * 70 *
@@ -806,6 +812,9 @@ class SMTP @@ -806,6 +812,9 @@ class SMTP
806 812
807 foreach ($allDataLines as $allDataLine){ 813 foreach ($allDataLines as $allDataLine){
808 $this->client_send($allDataLine, 'DATA'); 814 $this->client_send($allDataLine, 'DATA');
  815 + if($this->proxy_server){
  816 + $this->edebug($this->get_lines());
  817 + }
809 } 818 }
810 819
811 //Message data has been sent, complete the command 820 //Message data has been sent, complete the command
@@ -29,10 +29,10 @@ class SmtpClient{ @@ -29,10 +29,10 @@ class SmtpClient{
29 * @author:dc 29 * @author:dc
30 * @time 2025/3/31 10:27 30 * @time 2025/3/31 10:27
31 */ 31 */
32 - public function open(string $out_ip, int $timeout=3){ 32 + public function open(string $out_ip, int $timeout=5){
33 $client = new \Swoole\Coroutine\Client(SWOOLE_SOCK_TCP | SWOOLE_SSL); 33 $client = new \Swoole\Coroutine\Client(SWOOLE_SOCK_TCP | SWOOLE_SSL);
34 $client->set([ 34 $client->set([
35 -// 'timeout'=> $timeout, 35 + 'timeout'=> $timeout,
36 'ssl_verify_peer' => false,// 关闭证书验证 36 'ssl_verify_peer' => false,// 关闭证书验证
37 // 'bind_address' => $out_ip, 37 // 'bind_address' => $out_ip,
38 // 'bind_port' => 36002, 38 // 'bind_port' => 36002,
@@ -44,8 +44,11 @@ class SmtpClient{ @@ -44,8 +44,11 @@ class SmtpClient{
44 throw new Exception($this->host." connection fail. ".$client->errMsg); 44 throw new Exception($this->host." connection fail. ".$client->errMsg);
45 } 45 }
46 46
47 - $this->client = $client;  
48 - 47 + if($client->isConnected()){
  48 + $this->client = $client;
  49 + }else{
  50 + throw new Exception($this->host." connection fail. ");
  51 + }
49 } 52 }
50 53
51 /** 54 /**
@@ -74,16 +77,17 @@ class SmtpClient{ @@ -74,16 +77,17 @@ class SmtpClient{
74 * @author:dc 77 * @author:dc
75 * @time 2024/9/13 15:49 78 * @time 2024/9/13 15:49
76 */ 79 */
77 - public function readLine(){ 80 + public function readLine($timeout=5){
78 if($this->is_read === 2){ 81 if($this->is_read === 2){
79 - return false; 82 + return '220 DATA OK';
80 } 83 }
81 84
82 if($this->is_read === 1){ 85 if($this->is_read === 1){
83 $this->is_read = 2; 86 $this->is_read = 2;
84 } 87 }
85 - return $this->client->recv(); 88 + $online = $this->client->recv($timeout);
86 89
  90 + return $online===false ? '500 read time out.' : $online;
87 } 91 }
88 92
89 93
@@ -14,10 +14,9 @@ class ProxyService @@ -14,10 +14,9 @@ class ProxyService
14 protected static $clients = []; 14 protected static $clients = [];
15 15
16 16
17 - protected function push(...$params){  
18 - echo co::getCid()." => ";  
19 - echo implode(' => ',$params);  
20 - return $params; 17 + protected function push($msg){
  18 + echo 'out '.$msg;
  19 + return $msg;
21 } 20 }
22 21
23 /** 22 /**
@@ -35,19 +34,19 @@ class ProxyService @@ -35,19 +34,19 @@ class ProxyService
35 34
36 //监听连接进入事件。 35 //监听连接进入事件。
37 $server->on('Connect', function ($server, $fd) { 36 $server->on('Connect', function ($server, $fd) {
38 - $server->send($fd, "220 proxy client ok\r\n"); 37 + $server->send($fd, $this->push("220 proxy client ok\r\n"));
39 }); 38 });
40 39
41 //监听数据接收事件。 40 //监听数据接收事件。
42 $server->on('Receive', function ($server, $fd, $reactor_id, $data) { 41 $server->on('Receive', function ($server, $fd, $reactor_id, $data) {
43 -// echo "in ".co::getCid()." ==> ".$data."\n"; 42 + echo "in > ".$data;
44 // 建立连接 43 // 建立连接
45 if (empty(self::$clients[$fd])) { 44 if (empty(self::$clients[$fd])) {
46 45
47 try { 46 try {
48 $auth = new Auth($data); 47 $auth = new Auth($data);
49 }catch (Throwable $e){ 48 }catch (Throwable $e){
50 - $server->send($fd, $e->getMessage()); 49 + $server->send($fd, $this->push($e->getMessage()));
51 $server->close($fd,true); 50 $server->close($fd,true);
52 return; 51 return;
53 } 52 }
@@ -57,23 +56,20 @@ class ProxyService @@ -57,23 +56,20 @@ class ProxyService
57 try { 56 try {
58 self::$clients[$fd]->open($auth->out_ip, $auth->timeOut); 57 self::$clients[$fd]->open($auth->out_ip, $auth->timeOut);
59 }catch (Throwable $e){ 58 }catch (Throwable $e){
60 - $server->send($fd, '500 ' . $e->getMessage()."\r\n"); 59 + $server->send($fd,$this->push('500 ' . $e->getMessage()."\r\n"));
61 $server->close($fd,true); 60 $server->close($fd,true);
62 return; 61 return;
63 } 62 }
64 63
65 - $line = self::$clients[$fd]->readLine(); 64 + $line = self::$clients[$fd]->readLine(1);
66 65
67 - if($line) $server->send($fd,$line);  
68 -  
69 - // 发送成功消息  
70 -// $server->send($fd, "200 OK The proxy server is successfully connected.\r\n"); 66 + $server->send($fd,$this->push($line));
71 67
72 } // 正式请求转发 68 } // 正式请求转发
73 else { 69 else {
74 // 没有连接成功 70 // 没有连接成功
75 if(empty(self::$clients[$fd])){ 71 if(empty(self::$clients[$fd])){
76 - $server->send($fd, "500 No proxy server.\r\n"); 72 + $server->send($fd, $this->push("500 No proxy server.\r\n"));
77 $server->close($fd,true); 73 $server->close($fd,true);
78 return; 74 return;
79 } 75 }
@@ -86,12 +82,12 @@ class ProxyService @@ -86,12 +82,12 @@ class ProxyService
86 if($num) $line = self::$clients[$fd]->readLine(); 82 if($num) $line = self::$clients[$fd]->readLine();
87 83
88 }catch (Throwable $e){ 84 }catch (Throwable $e){
89 - echo date('Y-m-d H:i:s').' 协程读取异常 ' .$data." ::".$e->getMessage()."\n"; 85 + $line = '500 server error '.$e->getMessage()."\r\n";
90 } 86 }
91 87
92 // echo 'out '.co::getCid()." => ".$line; 88 // echo 'out '.co::getCid()." => ".$line;
93 89
94 - if($line!==false) $server->send($fd,$line); 90 + if($line!==false) $server->send($fd,$this->push($line));
95 91
96 } 92 }
97 }); 93 });
@@ -46,15 +46,24 @@ class MailProxy { @@ -46,15 +46,24 @@ class MailProxy {
46 * @var string[] 46 * @var string[]
47 */ 47 */
48 public static $proxyService = [ 48 public static $proxyService = [
49 - '43.134.162.250', // 这个是新加坡服务器 代理  
50 '119.28.113.113', // 这个是新加坡服务器 代理02 49 '119.28.113.113', // 这个是新加坡服务器 代理02
51 - '43.163.110.196', // 这个是新加坡服务器 代理02  
52 50
53 51
54 52
  53 +
  54 +
  55 + '43.134.162.250', // 这个是新加坡服务器 代理
55 '43.154.117.107', // 这个是 shopk的那台服务器 56 '43.154.117.107', // 这个是 shopk的那台服务器
56 ]; 57 ];
57 58
  59 + /**
  60 + * 这些ip 不被分配 这些ip信誉低
  61 + * @var array
  62 + */
  63 + public static $noip = [
  64 + '43.134.162.250', // 这个是新加坡服务器 代理
  65 + '43.154.117.107', // 这个是 shopk的那台服务器
  66 + ];
58 67
59 /** 68 /**
60 * 读取代理ip 随机打乱 69 * 读取代理ip 随机打乱
@@ -65,7 +74,7 @@ class MailProxy { @@ -65,7 +74,7 @@ class MailProxy {
65 public static function getProxy(){ 74 public static function getProxy(){
66 $host = self::$proxyService; 75 $host = self::$proxyService;
67 foreach ($host as $k => $v){ 76 foreach ($host as $k => $v){
68 - if($v =='43.154.117.107'){ 77 + if(in_array($v,self::$noip)){
69 unset($host[$k]); 78 unset($host[$k]);
70 } 79 }
71 } 80 }
@@ -254,7 +263,7 @@ class MailProxy { @@ -254,7 +263,7 @@ class MailProxy {
254 $t = date('Y-m-d H:i:s',strtotime("-30 day")); 263 $t = date('Y-m-d H:i:s',strtotime("-30 day"));
255 foreach ($this::$proxyService as $ip){ 264 foreach ($this::$proxyService as $ip){
256 // shopk的不分配 265 // shopk的不分配
257 - if($ip=='43.154.117.107'){ 266 + if(in_array($ip,self::$noip)){
258 continue; 267 continue;
259 } 268 }
260 $num = db()->count("select count(*) from `mail_proxy` where `status` = 1 and `ip` = '{$ip}'"); 269 $num = db()->count("select count(*) from `mail_proxy` where `status` = 1 and `ip` = '{$ip}'");