正在显示
6 个修改的文件
包含
175 行增加
和
64 行删除
| @@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
| 10 | ], | 10 | ], |
| 11 | "require": { | 11 | "require": { |
| 12 | "php": ">=5.5.0", | 12 | "php": ">=5.5.0", |
| 13 | + "ext-mbstring": "*", | ||
| 13 | "pear/pear-core-minimal": "~1.10.1", | 14 | "pear/pear-core-minimal": "~1.10.1", |
| 14 | "pear/auth_sasl": "~1.1.0", | 15 | "pear/auth_sasl": "~1.1.0", |
| 15 | "pear/mail_mime": "~1.10.0", | 16 | "pear/mail_mime": "~1.10.0", |
| @@ -160,6 +160,18 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') { | @@ -160,6 +160,18 @@ if ($RCMAIL->task == 'login' && $RCMAIL->action == 'login') { | ||
| 160 | // Login | 160 | // Login |
| 161 | $is_login = $auth['valid'] && !$auth['abort'] && $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'], $auth['cookiecheck']); | 161 | $is_login = $auth['valid'] && !$auth['abort'] && $RCMAIL->login($auth['user'], $auth['pass'], $auth['host'], $auth['cookiecheck']); |
| 162 | if($is_login){ | 162 | if($is_login){ |
| 163 | + | ||
| 164 | + $_host = parse_url($auth['host'])['host']; | ||
| 165 | + // 登录成功,验证是否有smtp服务器,没有就说明是新增的,需要保存邮件服务器 | ||
| 166 | + if(!isset($RCMAIL->config->get('smtp_server')[$_host])){ | ||
| 167 | + rcube_email_server_address::insert( | ||
| 168 | + explode('@',$auth['user'])[1], | ||
| 169 | + $_host, | ||
| 170 | + str_replace('ssl://imap.','smtp.',$auth['host']) | ||
| 171 | + ); | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + | ||
| 163 | // 登录成功,创建绑定关系 | 175 | // 登录成功,创建绑定关系 |
| 164 | $platform_user = (new rcube_platform_users())->create($_COOKIE['platform_id'],$RCMAIL->user->ID,$_COOKIE['platform_user_id']); | 176 | $platform_user = (new rcube_platform_users())->create($_COOKIE['platform_id'],$RCMAIL->user->ID,$_COOKIE['platform_user_id']); |
| 165 | // 创建成功 | 177 | // 创建成功 |
| 1 | <?php | 1 | <?php |
| 2 | 2 | ||
| 3 | /** | 3 | /** |
| 4 | - +-----------------------------------------------------------------------+ | ||
| 5 | - | This file is part of the Roundcube Webmail client | | ||
| 6 | - | | | ||
| 7 | - | Copyright (C) The Roundcube Dev Team | | ||
| 8 | - | Copyright (C) Kolab Systems AG | | ||
| 9 | - | | | ||
| 10 | - | Licensed under the GNU General Public License version 3 or | | ||
| 11 | - | any later version with exceptions for skins & plugins. | | ||
| 12 | - | See the README file for a full license statement. | | ||
| 13 | - | | | ||
| 14 | - | PURPOSE: | | ||
| 15 | - | Application class providing core functions and holding | | ||
| 16 | - | instances of all 'global' objects like db- and imap-connections | | ||
| 17 | - +-----------------------------------------------------------------------+ | ||
| 18 | - | Author: Thomas Bruederli <roundcube@gmail.com> | | ||
| 19 | - | Author: Aleksander Machniak <alec@alec.pl> | | ||
| 20 | - +-----------------------------------------------------------------------+ | ||
| 21 | -*/ | 4 | ++-----------------------------------------------------------------------+ |
| 5 | +| This file is part of the Roundcube Webmail client | | ||
| 6 | +| | | ||
| 7 | +| Copyright (C) The Roundcube Dev Team | | ||
| 8 | +| Copyright (C) Kolab Systems AG | | ||
| 9 | +| | | ||
| 10 | +| Licensed under the GNU General Public License version 3 or | | ||
| 11 | +| any later version with exceptions for skins & plugins. | | ||
| 12 | +| See the README file for a full license statement. | | ||
| 13 | +| | | ||
| 14 | +| PURPOSE: | | ||
| 15 | +| Application class providing core functions and holding | | ||
| 16 | +| instances of all 'global' objects like db- and imap-connections | | ||
| 17 | ++-----------------------------------------------------------------------+ | ||
| 18 | +| Author: Thomas Bruederli <roundcube@gmail.com> | | ||
| 19 | +| Author: Aleksander Machniak <alec@alec.pl> | | ||
| 20 | ++-----------------------------------------------------------------------+ | ||
| 21 | + */ | ||
| 22 | 22 | ||
| 23 | /** | 23 | /** |
| 24 | * Application class of Roundcube Webmail | 24 | * Application class of Roundcube Webmail |
| @@ -384,11 +384,11 @@ class rcmail extends rcube | @@ -384,11 +384,11 @@ class rcmail extends rcube | ||
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | self::raise_error([ | 386 | self::raise_error([ |
| 387 | - 'code' => 700, | ||
| 388 | - 'file' => __FILE__, | ||
| 389 | - 'line' => __LINE__, | ||
| 390 | - 'message' => "Addressbook source ($id) not found!" | ||
| 391 | - ], | 387 | + 'code' => 700, |
| 388 | + 'file' => __FILE__, | ||
| 389 | + 'line' => __LINE__, | ||
| 390 | + 'message' => "Addressbook source ($id) not found!" | ||
| 391 | + ], | ||
| 392 | true, true); | 392 | true, true); |
| 393 | } | 393 | } |
| 394 | 394 | ||
| @@ -553,9 +553,9 @@ class rcmail extends rcube | @@ -553,9 +553,9 @@ class rcmail extends rcube | ||
| 553 | $responses = array_values($responses); | 553 | $responses = array_values($responses); |
| 554 | 554 | ||
| 555 | $hook = $this->plugins->exec_hook('get_compose_responses', [ | 555 | $hook = $this->plugins->exec_hook('get_compose_responses', [ |
| 556 | - 'list' => $responses, | ||
| 557 | - 'sorted' => $sorted, | ||
| 558 | - 'user_only' => $user_only, | 556 | + 'list' => $responses, |
| 557 | + 'sorted' => $sorted, | ||
| 558 | + 'user_only' => $user_only, | ||
| 559 | ]); | 559 | ]); |
| 560 | 560 | ||
| 561 | return $hook['list']; | 561 | return $hook['list']; |
| @@ -807,22 +807,22 @@ class rcmail extends rcube | @@ -807,22 +807,22 @@ class rcmail extends rcube | ||
| 807 | 807 | ||
| 808 | if (!$user) { | 808 | if (!$user) { |
| 809 | self::raise_error([ | 809 | self::raise_error([ |
| 810 | - 'code' => 620, | ||
| 811 | - 'file' => __FILE__, | ||
| 812 | - 'line' => __LINE__, | ||
| 813 | - 'message' => "Failed to create a user record. Maybe aborted by a plugin?" | ||
| 814 | - ], | 810 | + 'code' => 620, |
| 811 | + 'file' => __FILE__, | ||
| 812 | + 'line' => __LINE__, | ||
| 813 | + 'message' => "Failed to create a user record. Maybe aborted by a plugin?" | ||
| 814 | + ], | ||
| 815 | true, false | 815 | true, false |
| 816 | ); | 816 | ); |
| 817 | } | 817 | } |
| 818 | } | 818 | } |
| 819 | else { | 819 | else { |
| 820 | self::raise_error([ | 820 | self::raise_error([ |
| 821 | - 'code' => 621, | ||
| 822 | - 'file' => __FILE__, | ||
| 823 | - 'line' => __LINE__, | ||
| 824 | - 'message' => "Access denied for new user $username. 'auto_create_user' is disabled" | ||
| 825 | - ], | 821 | + 'code' => 621, |
| 822 | + 'file' => __FILE__, | ||
| 823 | + 'line' => __LINE__, | ||
| 824 | + 'message' => "Access denied for new user $username. 'auto_create_user' is disabled" | ||
| 825 | + ], | ||
| 826 | true, false | 826 | true, false |
| 827 | ); | 827 | ); |
| 828 | } | 828 | } |
| @@ -989,6 +989,16 @@ class rcmail extends rcube | @@ -989,6 +989,16 @@ class rcmail extends rcube | ||
| 989 | $key = key($default_host); | 989 | $key = key($default_host); |
| 990 | $host = is_numeric($key) ? $default_host[$key] : $key; | 990 | $host = is_numeric($key) ? $default_host[$key] : $key; |
| 991 | } | 991 | } |
| 992 | + | ||
| 993 | + // host再次为空,说明数据库里面没有这个服务器信息 | ||
| 994 | + if(empty($host)){ | ||
| 995 | + $post_host = parse_url($post_host); | ||
| 996 | + $host = 'ssl://'.($post_host['host']??$post_host['path']??''); | ||
| 997 | + // 手动填写的imap服务器 | ||
| 998 | + $default_host[$host] = $host; | ||
| 999 | + $this->config->set('default_host',$default_host); | ||
| 1000 | + } | ||
| 1001 | + | ||
| 992 | } | 1002 | } |
| 993 | else if (empty($default_host)) { | 1003 | else if (empty($default_host)) { |
| 994 | $host = rcube_utils::get_input_value('_host', rcube_utils::INPUT_POST); | 1004 | $host = rcube_utils::get_input_value('_host', rcube_utils::INPUT_POST); |
| @@ -1340,8 +1350,8 @@ class rcmail extends rcube | @@ -1340,8 +1350,8 @@ class rcmail extends rcube | ||
| 1340 | } | 1350 | } |
| 1341 | 1351 | ||
| 1342 | $plugin = $this->plugins->exec_hook('contact_create', [ | 1352 | $plugin = $this->plugins->exec_hook('contact_create', [ |
| 1343 | - 'record' => $contact, | ||
| 1344 | - 'source' => $this->get_address_book_id($source), | 1353 | + 'record' => $contact, |
| 1354 | + 'source' => $this->get_address_book_id($source), | ||
| 1345 | ]); | 1355 | ]); |
| 1346 | 1356 | ||
| 1347 | $contact = $plugin['record']; | 1357 | $contact = $plugin['record']; |
| @@ -1404,9 +1414,9 @@ class rcmail extends rcube | @@ -1404,9 +1414,9 @@ class rcmail extends rcube | ||
| 1404 | } | 1414 | } |
| 1405 | 1415 | ||
| 1406 | $plugin = $this->plugins->exec_hook('contact_exists', [ | 1416 | $plugin = $this->plugins->exec_hook('contact_exists', [ |
| 1407 | - 'email' => $email, | ||
| 1408 | - 'type' => $type, | ||
| 1409 | - 'sources' => $sources, | 1417 | + 'email' => $email, |
| 1418 | + 'type' => $type, | ||
| 1419 | + 'sources' => $sources, | ||
| 1410 | ]); | 1420 | ]); |
| 1411 | 1421 | ||
| 1412 | if (!empty($plugin['abort'])) { | 1422 | if (!empty($plugin['abort'])) { |
| @@ -2342,28 +2342,49 @@ EOF; | @@ -2342,28 +2342,49 @@ EOF; | ||
| 2342 | $input_host = null; | 2342 | $input_host = null; |
| 2343 | $hide_host = false; | 2343 | $hide_host = false; |
| 2344 | 2344 | ||
| 2345 | - if (is_array($default_host) && count($default_host) > 1) { | ||
| 2346 | - $input_host = new html_select(['name' => '_host', 'id' => 'rcmloginhost', 'class' => 'custom-select']); | ||
| 2347 | - | ||
| 2348 | - foreach ($default_host as $key => $value) { | ||
| 2349 | - if (!is_array($value)) { | ||
| 2350 | - $input_host->add($value, (is_numeric($key) ? $value : $key)); | ||
| 2351 | - } | ||
| 2352 | - else { | ||
| 2353 | - $input_host = null; | ||
| 2354 | - break; | ||
| 2355 | - } | ||
| 2356 | - } | ||
| 2357 | - } | ||
| 2358 | - else if (is_array($default_host) && ($host = key($default_host)) !== null) { | ||
| 2359 | - $hide_host = true; | ||
| 2360 | - $input_host = new html_hiddenfield([ | ||
| 2361 | - 'name' => '_host', 'id' => 'rcmloginhost', 'value' => is_numeric($host) ? $default_host[$host] : $host] + $attrib); | ||
| 2362 | - } | ||
| 2363 | - else if (empty($default_host)) { | 2345 | + // 调整为手动输入模式 |
| 2346 | +// if (is_array($default_host) && count($default_host) > 1) { | ||
| 2347 | +// $input_host = new html_select(['name' => '_host', 'id' => 'rcmloginhost', 'class' => 'custom-select']); | ||
| 2348 | +// | ||
| 2349 | +// foreach ($default_host as $key => $value) { | ||
| 2350 | +// if (!is_array($value)) { | ||
| 2351 | +// $input_host->add($value, (is_numeric($key) ? $value : $key)); | ||
| 2352 | +// } | ||
| 2353 | +// else { | ||
| 2354 | +// $input_host = null; | ||
| 2355 | +// break; | ||
| 2356 | +// } | ||
| 2357 | +// } | ||
| 2358 | +// } | ||
| 2359 | +// else if (is_array($default_host) && ($host = key($default_host)) !== null) { | ||
| 2360 | +// $hide_host = true; | ||
| 2361 | +// $input_host = new html_hiddenfield([ | ||
| 2362 | +// 'name' => '_host', 'id' => 'rcmloginhost', 'value' => is_numeric($host) ? $default_host[$host] : $host] + $attrib); | ||
| 2363 | +// } | ||
| 2364 | +// else if (empty($default_host)) { | ||
| 2364 | $input_host = new html_inputfield(['name' => '_host', 'id' => 'rcmloginhost', 'class' => 'form-control'] | 2365 | $input_host = new html_inputfield(['name' => '_host', 'id' => 'rcmloginhost', 'class' => 'form-control'] |
| 2365 | + $attrib + $host_attrib); | 2366 | + $attrib + $host_attrib); |
| 2367 | +// } | ||
| 2368 | + // 加入js来控制 | ||
| 2369 | + $js_default_host = rcube_email_server_address::getKeyValue(); | ||
| 2370 | + $_script = "<script> | ||
| 2371 | +var _default_hosts = ".json_encode($js_default_host,JSON_UNESCAPED_UNICODE)."; | ||
| 2372 | +$(\"#rcmloginuser\").change(function() { | ||
| 2373 | + auto_host($(this).val()); | ||
| 2374 | +}); | ||
| 2375 | +$(\"#rcmloginuser\").keyup(function() { | ||
| 2376 | + auto_host($(this).val()); | ||
| 2377 | +}); | ||
| 2378 | +function auto_host(_user){ | ||
| 2379 | + _user = _user.split('@'); | ||
| 2380 | + if(_user[1]){ | ||
| 2381 | + if(_default_hosts[_user[1]]){ | ||
| 2382 | + $(\"#rcmloginhost\").val(_default_hosts[_user[1]]); | ||
| 2366 | } | 2383 | } |
| 2384 | + } | ||
| 2385 | +} | ||
| 2386 | +</script>"; | ||
| 2387 | + $this->add_script(mb_substr($_script,8,-9),'foot'); | ||
| 2367 | 2388 | ||
| 2368 | $this->add_gui_object('loginform', $form_name); | 2389 | $this->add_gui_object('loginform', $form_name); |
| 2369 | 2390 | ||
| @@ -2378,7 +2399,7 @@ EOF; | @@ -2378,7 +2399,7 @@ EOF; | ||
| 2378 | 2399 | ||
| 2379 | // add host selection row | 2400 | // add host selection row |
| 2380 | if (is_object($input_host) && !$hide_host) { | 2401 | if (is_object($input_host) && !$hide_host) { |
| 2381 | - $table->add('title', html::label('rcmloginhost', html::quote($this->app->gettext('server')))); | 2402 | + $table->add('title', html::label('rcmloginhost', html::quote('imap '.$this->app->gettext('server')))); |
| 2382 | $table->add('input', $input_host->show(rcube_utils::get_input_value('_host', rcube_utils::INPUT_GPC))); | 2403 | $table->add('input', $input_host->show(rcube_utils::get_input_value('_host', rcube_utils::INPUT_GPC))); |
| 2383 | } | 2404 | } |
| 2384 | 2405 |
| @@ -426,9 +426,10 @@ class rcube_config | @@ -426,9 +426,10 @@ class rcube_config | ||
| 426 | $rows = rcube_email_server_address::all($rcube->get_dbh()); | 426 | $rows = rcube_email_server_address::all($rcube->get_dbh()); |
| 427 | 427 | ||
| 428 | foreach ($rows as $row){ | 428 | foreach ($rows as $row){ |
| 429 | - $result['imaps'][$row['imap']] = $row['name']; | ||
| 430 | - | ||
| 431 | - $result['stmps'][parse_url($row['imap'])['host']] = $row['smtp']; | 429 | + // imap 配置 |
| 430 | + $result['imaps']['ssl://'.$row['imap']] = $row['name'] ? $row['name'] : $row['imap']; | ||
| 431 | + // smtp_server | ||
| 432 | + $result['stmps'][$row['imap']] = $row['smtp']; | ||
| 432 | } | 433 | } |
| 433 | 434 | ||
| 434 | $this->set('default_host',$result['imaps']??[]); | 435 | $this->set('default_host',$result['imaps']??[]); |
| @@ -82,6 +82,29 @@ class rcube_email_server_address{ | @@ -82,6 +82,29 @@ class rcube_email_server_address{ | ||
| 82 | // | 82 | // |
| 83 | // } | 83 | // } |
| 84 | 84 | ||
| 85 | + /** | ||
| 86 | + * 获取key=>val数据, | ||
| 87 | + * @param string $key | ||
| 88 | + * @param string $value | ||
| 89 | + * @return array | ||
| 90 | + * @author:dc | ||
| 91 | + * @time 2022/7/25 14:12 | ||
| 92 | + */ | ||
| 93 | + public static function getKeyValue($key='mail_suffix',$value='imap'){ | ||
| 94 | + | ||
| 95 | + $db = rcube::get_instance()->get_dbh(); | ||
| 96 | + | ||
| 97 | + $result = $db->query("select `{$key}`,`{$value}` from ".$db->table_name('email_server_address',true)); | ||
| 98 | + | ||
| 99 | + $key_value = []; | ||
| 100 | + | ||
| 101 | + foreach ($result->fetchAll(PDO::FETCH_ASSOC) as $row){ | ||
| 102 | + $key_value[$row[$key]] = $row[$value]; | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + return $key_value; | ||
| 106 | + } | ||
| 107 | + | ||
| 85 | 108 | ||
| 86 | public static function all($db = null) | 109 | public static function all($db = null) |
| 87 | { | 110 | { |
| @@ -105,7 +128,50 @@ class rcube_email_server_address{ | @@ -105,7 +128,50 @@ class rcube_email_server_address{ | ||
| 105 | return $rows; | 128 | return $rows; |
| 106 | } | 129 | } |
| 107 | 130 | ||
| 131 | + /** | ||
| 132 | + * 通过前缀获取 | ||
| 133 | + * @param $mail_suffix | ||
| 134 | + * @param string $field | ||
| 135 | + * @author:dc | ||
| 136 | + * @time 2022/7/25 11:14 | ||
| 137 | + * @return array|bool | ||
| 138 | + */ | ||
| 139 | + public static function firstBySuffix($mail_suffix,$field='`imap`,`smtp`'){ | ||
| 140 | + $db = rcube::get_instance()->get_dbh(); | ||
| 141 | + // 查询 | ||
| 142 | + $result = $db->query("select {$field} from ".$db->table_name('email_server_address',true)." where `mail_suffix` = ? limit 1",$mail_suffix); | ||
| 108 | 143 | ||
| 144 | + // 返回结果 | ||
| 145 | + return $db->fetch_assoc($result); | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + | ||
| 149 | + /** | ||
| 150 | + * 新增数据 | ||
| 151 | + * @param $mail_suffix | ||
| 152 | + * @param $imap | ||
| 153 | + * @param $smtp | ||
| 154 | + * @param string $name | ||
| 155 | + * @return false|int|mixed | ||
| 156 | + * @author:dc | ||
| 157 | + * @time 2022/7/25 11:38 | ||
| 158 | + */ | ||
| 159 | + public static function insert($mail_suffix,$imap,$smtp,$name=' '){ | ||
| 160 | + | ||
| 161 | + $db = rcube::get_instance()->get_dbh(); | ||
| 162 | + | ||
| 163 | + $table = $db->table_name('email_server_address',true); | ||
| 164 | + | ||
| 165 | + // 插入 | ||
| 166 | + $result = $db->query("insert into {$table} set `mail_suffix`=?,`imap`=?,`smtp`=?,`service_provider`=?",$mail_suffix,$imap,$smtp,$name); | ||
| 167 | + | ||
| 168 | + // 返回结果 | ||
| 169 | + if($result && $db->affected_rows($result) && ($id = $db->insert_id($result))){ | ||
| 170 | + return $id; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + return 0; | ||
| 174 | + } | ||
| 109 | 175 | ||
| 110 | 176 | ||
| 111 | 177 |
-
请 注册 或 登录 后发表评论