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: * @subpackage smtp/functions
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: * @subpackage smtp/functions
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: