| 1: | <?php |
| 2: | |
| 3: | |
| 4: | if (!defined('DEBUG_MODE')) { die(); } |
| 5: | |
| 6: | if (!hm_exists('connect_to_smtp_server')) { |
| 7: | function connect_to_smtp_server($address, $name, $port, $user, $pass, $tls, $type, $server_id = false) { |
| 8: | $smtp_list = array( |
| 9: | 'name' => $name, |
| 10: | 'server' => $address, |
| 11: | 'type' => $type, |
| 12: | 'hide' => false, |
| 13: | 'port' => $port, |
| 14: | 'user' => $user, |
| 15: | 'tls' => $tls); |
| 16: | |
| 17: | if (!$server_id || ($server_id && $pass)) { |
| 18: | $smtp_list['pass'] = $pass; |
| 19: | } |
| 20: | |
| 21: | if ($server_id) { |
| 22: | if (Hm_SMTP_List::edit($server_id, $smtp_list)) { |
| 23: | $smtp_server_id = $server_id; |
| 24: | } else { |
| 25: | return; |
| 26: | } |
| 27: | } else { |
| 28: | $smtp_server_id = Hm_SMTP_List::add($smtp_list); |
| 29: | if ($type != 'ews' && ! can_save_last_added_server('Hm_SMTP_List', $user)) { |
| 30: | return; |
| 31: | } |
| 32: | } |
| 33: | |
| 34: | $mailbox = Hm_SMTP_List::connect($smtp_server_id, false); |
| 35: | if ($mailbox->authed()) { |
| 36: | return $smtp_server_id; |
| 37: | } |
| 38: | else { |
| 39: | Hm_SMTP_List::del($smtp_server_id); |
| 40: | Hm_Msgs::add('Authentication failed', 'danger'); |
| 41: | return null; |
| 42: | } |
| 43: | } |
| 44: | } |
| 45: | |
| 46: | if (!hm_exists('delete_smtp_server')) { |
| 47: | function delete_smtp_server($smtp_server_id) { |
| 48: | Hm_SMTP_List::del($smtp_server_id); |
| 49: | } |
| 50: | } |
| 51: | |
| 52: | if (!hm_exists('get_reply_type')) { |
| 53: | function get_reply_type($request) { |
| 54: | if (array_key_exists('reply', $request) && $request['reply']) { |
| 55: | return 'reply'; |
| 56: | } elseif (array_key_exists('reply_all', $request) && $request['reply_all']) { |
| 57: | return 'reply_all'; |
| 58: | } elseif (array_key_exists('forward', $request) && $request['forward']) { |
| 59: | return 'forward'; |
| 60: | } |
| 61: | return false; |
| 62: | } |
| 63: | } |
| 64: | |
| 65: | |
| 66: | |
| 67: | |
| 68: | if (!hm_exists('send_scheduled_message')) { |
| 69: | function send_scheduled_message($handler, $imapMailbox, $folder, $msg_id, $send_now = false) { |
| 70: | $msg_headers = $imapMailbox->get_message_headers($folder, $msg_id); |
| 71: | $mailbox_details = $imapMailbox->get_config(); |
| 72: | try { |
| 73: | if (empty($msg_headers['X-Schedule']) || empty($msg_headers['X-Profile-ID'])) { |
| 74: | return false; |
| 75: | } |
| 76: | |
| 77: | if (new DateTime($msg_headers['X-Schedule']) <= new DateTime() || $send_now) { |
| 78: | $profile = Hm_Profiles::get($msg_headers['X-Profile-ID']); |
| 79: | if (!$profile) { |
| 80: | $profiles = Hm_Profiles::search('server', $mailbox_details['server']); |
| 81: | |
| 82: | if (!$profiles) { |
| 83: | Hm_Debug::add(sprintf('ERRCannot find profiles corresponding with MAILBOX server: %s', $mailbox_details['server'])); |
| 84: | return false; |
| 85: | } |
| 86: | $profile = $profiles[0]; |
| 87: | } |
| 88: | $smtpMailbox = Hm_SMTP_List::connect($profile['smtp_id'], false); |
| 89: | if (! $smtpMailbox || ! $smtpMailbox->authed()) { |
| 90: | Hm_Msgs::add("ERRFailed to authenticate to the SMTP server"); |
| 91: | return; |
| 92: | } |
| 93: | |
| 94: | $delivery_receipt = isset($msg_headers['X-Delivery']); |
| 95: | |
| 96: | $recipients = []; |
| 97: | foreach (['To', 'Cc', 'Bcc'] as $fld) { |
| 98: | if (array_key_exists($fld, $msg_headers)) { |
| 99: | $recipients = array_merge($recipients, Hm_MIME_Msg::find_addresses($msg_headers[$fld])); |
| 100: | } |
| 101: | } |
| 102: | |
| 103: | $msg_content = $imapMailbox->get_message_content($folder, $msg_id, 0); |
| 104: | $from = process_address_fld($msg_headers['From']); |
| 105: | |
| 106: | $err_msg = $smtpMailbox->send_message($from[0]['email'], $recipients, $msg_content, $delivery_receipt); |
| 107: | if (!$err_msg) { |
| 108: | $imapMailbox->delete_message($folder, $msg_id, false); |
| 109: | save_sent_msg($handler, $imapMailbox->get_config()['id'], $imapMailbox, $mailbox_details, $msg_content, $msg_id, false); |
| 110: | return true; |
| 111: | } |
| 112: | } |
| 113: | } catch (Exception $e) { |
| 114: | Hm_Debug::add(sprintf('ERRCannot send message: %s', $msg_headers['subject'])); |
| 115: | } |
| 116: | return false; |
| 117: | }} |
| 118: | |
| 119: | |
| 120: | |
| 121: | |
| 122: | if (!hm_exists('reschedule_message_sending')) { |
| 123: | function reschedule_message_sending($handler, $mailbox, $msg_id, $folder, $new_date) { |
| 124: | if ($new_date == 'now') { |
| 125: | return send_scheduled_message($handler, $mailbox, $folder, $msg_id, true); |
| 126: | } |
| 127: | $msg = $mailbox->get_message_content($folder, $msg_id, 0); |
| 128: | $new_date = get_scheduled_date($new_date); |
| 129: | preg_match("/^X-Schedule:.*(\r?\n[ \t]+.*)*\r?\n?/im", $msg, $matches); |
| 130: | |
| 131: | if (count($matches)) { |
| 132: | $msg = str_replace($matches[0], "X-Schedule: {$new_date}\n", $msg); |
| 133: | } else { |
| 134: | return; |
| 135: | } |
| 136: | $msg = str_replace("\r\n", "\n", $msg); |
| 137: | $msg = str_replace("\n", "\r\n", $msg); |
| 138: | $msg = rtrim($msg)."\r\n"; |
| 139: | |
| 140: | $schedule_folder = 'Scheduled'; |
| 141: | if ($mailbox->folder_exists($schedule_folder)) { |
| 142: | return; |
| 143: | } |
| 144: | $res = false; |
| 145: | if ($mailbox->store_message($schedule_folder, $msg)) { |
| 146: | if ($mailbox->delete_message($folder, $msg_id, false)) { |
| 147: | $res = true; |
| 148: | } |
| 149: | } |
| 150: | return $res; |
| 151: | }} |
| 152: | |