| | |
| | | |
| | | /****** message sending functions ********/ |
| | | |
| | | // encrypt parts of the header |
| | | function rcmail_encrypt_header($what) |
| | | { |
| | | global $CONFIG, $RCMAIL; |
| | | if (!$CONFIG['http_received_header_encrypt']) |
| | | { |
| | | return $what; |
| | | } |
| | | return $RCMAIL->encrypt($what); |
| | | } |
| | | |
| | | // get identity record |
| | | function rcmail_get_identity($id) |
| | | { |
| | |
| | | } |
| | | |
| | | // parse email address input |
| | | function rcmail_mailto_format($mailto) |
| | | function rcmail_email_input_format($mailto) |
| | | { |
| | | global $EMAIL_FORMAT_ERROR; |
| | | |
| | | $regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m', '/;/', '/(\S{1})(<\S+@\S+>)/U'); |
| | | $replace = array(', ', ', ', '', ',', '\\1 \\2'); |
| | | |
| | |
| | | $address = '<'.$address.'>'; |
| | | |
| | | $result[] = $name.' '.$address; |
| | | $item = $address; |
| | | } else if (trim($item)) { |
| | | // @TODO: handle errors |
| | | continue; |
| | | } |
| | | |
| | | // check address format |
| | | $item = trim($item, '<>'); |
| | | if ($item && !check_email($item)) { |
| | | $EMAIL_FORMAT_ERROR = $item; |
| | | return; |
| | | } |
| | | } |
| | | |
| | |
| | | if (strlen($_POST['_draft_saveid']) > 3) |
| | | $olddraftmessageid = get_input_value('_draft_saveid', RCUBE_INPUT_POST); |
| | | |
| | | $message_id = sprintf('<%s@%s>', md5(uniqid('rcmail'.rand(),true)), $RCMAIL->config->mail_domain($_SESSION['imap_host'])); |
| | | $message_id = sprintf('<%s@%s>', md5(uniqid('rcmail'.mt_rand(),true)), $RCMAIL->config->mail_domain($_SESSION['imap_host'])); |
| | | |
| | | // set default charset |
| | | $input_charset = $OUTPUT->get_charset(); |
| | | $message_charset = isset($_POST['_charset']) ? $_POST['_charset'] : $input_charset; |
| | | |
| | | $mailto = rcmail_mailto_format(get_input_value('_to', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | $mailcc = rcmail_mailto_format(get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | $mailbcc = rcmail_mailto_format(get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | $EMAIL_FORMAT_ERROR = NULL; |
| | | |
| | | $mailto = rcmail_email_input_format(get_input_value('_to', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | $mailcc = rcmail_email_input_format(get_input_value('_cc', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | $mailbcc = rcmail_email_input_format(get_input_value('_bcc', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | |
| | | if ($EMAIL_FORMAT_ERROR) { |
| | | $OUTPUT->show_message('emailformaterror', 'error', array('email' => $EMAIL_FORMAT_ERROR)); |
| | | $OUTPUT->send('iframe'); |
| | | } |
| | | |
| | | if (empty($mailto) && !empty($mailcc)) { |
| | | $mailto = $mailcc; |
| | |
| | | $mailto = 'undisclosed-recipients:;'; |
| | | |
| | | // get sender name and address |
| | | $from = get_input_value('_from', RCUBE_INPUT_POST); |
| | | $from = get_input_value('_from', RCUBE_INPUT_POST, true, $message_charset); |
| | | $identity_arr = rcmail_get_identity($from); |
| | | |
| | | if ($identity_arr) |
| | | if (!$identity_arr && ($from = rcmail_email_input_format($from))) { |
| | | if (preg_match('/(\S+@\S+)/', $from, $m)) |
| | | $identity_arr['mailto'] = $m[1]; |
| | | } else |
| | | $from = $identity_arr['mailto']; |
| | | |
| | | if (empty($identity_arr['string'])) |
| | | $identity_arr['string'] = $from; |
| | | |
| | | // compose headers array |
| | | $headers = array('Date' => date('r'), |
| | | 'From' => rcube_charset_convert($identity_arr['string'], RCMAIL_CHARSET, $message_charset), |
| | | 'To' => $mailto); |
| | | $headers = array(); |
| | | |
| | | // if configured, the Received headers goes to top, for good measure |
| | | if ($CONFIG['http_received_header']) |
| | | { |
| | | $nldlm = $RCMAIL->config->header_delimiter() . "\t"; |
| | | // FROM/VIA |
| | | $http_header = 'from '; |
| | | if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { |
| | | $host = $_SERVER['HTTP_X_FORWARDED_FOR']; |
| | | $hostname = gethostbyaddr($host); |
| | | if ($CONFIG['http_received_header_encrypt']) { |
| | | $http_header .= rcmail_encrypt_header($hostname); |
| | | if ($host != $hostname) |
| | | $http_header .= ' ('. rcmail_encrypt_header($host) . ')'; |
| | | } else { |
| | | $http_header .= (($host != $hostname) ? $hostname : '[' . $host . ']'); |
| | | $http_header .= ' ('. ($host == $hostname ? '' : $hostname . ' ') . |
| | | '[' . $host .'])'; |
| | | } |
| | | $http_header .= $nldlm . ' via '; |
| | | } |
| | | $host = $_SERVER['REMOTE_ADDR']; |
| | | $hostname = gethostbyaddr($host); |
| | | if ($CONFIG['http_received_header_encrypt']) { |
| | | $http_header .= rcmail_encrypt_header($hostname); |
| | | if ($host != $hostname) |
| | | $http_header .= ' ('. rcmail_encrypt_header($host) . ')'; |
| | | } else { |
| | | $http_header .= (($host != $hostname) ? $hostname : '[' . $host . ']'); |
| | | $http_header .= ' ('. ($host == $hostname ? '' : $hostname . ' ') . |
| | | '[' . $host .'])'; |
| | | } |
| | | // BY |
| | | $http_header .= $nldlm . 'by ' . $_SERVER['HTTP_HOST']; |
| | | // WITH |
| | | $http_header .= $nldlm . 'with ' . $_SERVER['SERVER_PROTOCOL'] . |
| | | ' ('.$_SERVER['REQUEST_METHOD'] . '); ' . date('r'); |
| | | $http_header = wordwrap($http_header, 69, $nldlm); |
| | | |
| | | $headers['Received'] = $http_header; |
| | | } |
| | | |
| | | $headers['Date'] = date('r'); |
| | | $headers['From'] = rcube_charset_convert($identity_arr['string'], RCMAIL_CHARSET, $message_charset); |
| | | $headers['To'] = $mailto; |
| | | |
| | | // additional recipients |
| | | if (!empty($mailcc)) |
| | |
| | | $headers['Bcc'] = ($headers['Bcc'] ? $headers['Bcc'].', ' : '') . $identity_arr['bcc']; |
| | | |
| | | // add subject |
| | | $headers['Subject'] = trim(get_input_value('_subject', RCUBE_INPUT_POST, FALSE, $message_charset)); |
| | | $headers['Subject'] = trim(get_input_value('_subject', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | |
| | | if (!empty($identity_arr['organization'])) |
| | | $headers['Organization'] = $identity_arr['organization']; |
| | | |
| | | if (!empty($_POST['_replyto'])) |
| | | $headers['Reply-To'] = rcmail_mailto_format(get_input_value('_replyto', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | $headers['Reply-To'] = rcmail_email_input_format(get_input_value('_replyto', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | else if (!empty($identity_arr['reply-to'])) |
| | | $headers['Reply-To'] = $identity_arr['reply-to']; |
| | | |
| | |
| | | } |
| | | |
| | | // additional headers |
| | | if ($CONFIG['http_received_header']) |
| | | { |
| | | $nldlm = $RCMAIL->config->header_delimiter() . "\t"; |
| | | $headers['Received'] = wordwrap('from ' . (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? |
| | | gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']).' ['.$_SERVER['HTTP_X_FORWARDED_FOR'].']'.$nldlm.' via ' : '') . |
| | | gethostbyaddr($_SERVER['REMOTE_ADDR']).' ['.$_SERVER['REMOTE_ADDR'].']'.$nldlm.'with ' . |
| | | $_SERVER['SERVER_PROTOCOL'].' ('.$_SERVER['REQUEST_METHOD'].'); ' . date('r'), |
| | | 69, $nldlm); |
| | | } |
| | | |
| | | $headers['Message-ID'] = $message_id; |
| | | $headers['X-Sender'] = $from; |
| | | |
| | |
| | | // generic footer for all messages |
| | | if (!empty($CONFIG['generic_message_footer'])) { |
| | | $footer = file_get_contents(realpath($CONFIG['generic_message_footer'])); |
| | | $footer = rcube_charset_convert($footer, 'UTF-8', $message_charset); |
| | | $footer = rcube_charset_convert($footer, RCMAIL_CHARSET, $message_charset); |
| | | } |
| | | } |
| | | |
| | |
| | | $headers = $data['headers']; |
| | | |
| | | // encoding subject header with mb_encode provides better results with asian characters |
| | | if (function_exists("mb_encode_mimeheader")) |
| | | if (function_exists('mb_encode_mimeheader')) |
| | | { |
| | | mb_internal_encoding($message_charset); |
| | | $headers['Subject'] = mb_encode_mimeheader($headers['Subject'], $message_charset, 'Q'); |
| | | $headers['Subject'] = mb_encode_mimeheader($headers['Subject'], |
| | | $message_charset, 'Q', $RCMAIL->config->header_delimiter(), 8); |
| | | mb_internal_encoding(RCMAIL_CHARSET); |
| | | } |
| | | |
| | |
| | | $OUTPUT->send('iframe'); |
| | | } |
| | | |
| | | $sent = rcmail_deliver_message($MAIL_MIME, $from, $mailto); |
| | | $sent = rcmail_deliver_message($MAIL_MIME, $from, $mailto, $smtp_error); |
| | | |
| | | // return to compose page if sending failed |
| | | if (!$sent) |
| | | { |
| | | $OUTPUT->show_message("sendingfailed", 'error'); |
| | | if ($smtp_error) |
| | | $OUTPUT->show_message($smtp_error['label'], 'error', $smtp_error['vars']); |
| | | else |
| | | $OUTPUT->show_message('sendingfailed', 'error'); |
| | | $OUTPUT->send('iframe'); |
| | | } |
| | | |
| | |
| | | |
| | | // set replied/forwarded flag |
| | | if ($_SESSION['compose']['reply_uid']) |
| | | $IMAP->set_flag($_SESSION['compose']['reply_uid'], 'ANSWERED'); |
| | | $IMAP->set_flag($_SESSION['compose']['reply_uid'], 'ANSWERED', $_SESSION['compose']['mailbox']); |
| | | else if ($_SESSION['compose']['forward_uid']) |
| | | $IMAP->set_flag($_SESSION['compose']['forward_uid'], 'FORWARDED'); |
| | | $IMAP->set_flag($_SESSION['compose']['forward_uid'], 'FORWARDED', $_SESSION['compose']['mailbox']); |
| | | |
| | | } // End of SMTP Delivery Block |
| | | |
| | |
| | | // raise error if saving failed |
| | | if (!$saved) |
| | | { |
| | | raise_error(array('code' => 800, 'type' => 'imap', 'file' => __FILE__, |
| | | 'message' => "Could not save message in $store_target"), TRUE, FALSE); |
| | | raise_error(array('code' => 800, 'type' => 'imap', |
| | | 'file' => __FILE__, 'line' => __LINE__, |
| | | 'message' => "Could not save message in $store_target"), TRUE, FALSE); |
| | | |
| | | if ($savedraft) { |
| | | $OUTPUT->show_message('errorsaving', 'error'); |
| | |
| | | |
| | | // raise error if deletion of old draft failed |
| | | if (!$deleted) |
| | | raise_error(array('code' => 800, 'type' => 'imap', 'file' => __FILE__, |
| | | 'message' => "Could not delete message from ".$CONFIG['drafts_mbox']), TRUE, FALSE); |
| | | raise_error(array('code' => 800, 'type' => 'imap', |
| | | 'file' => __FILE__, 'line' => __LINE__, |
| | | 'message' => "Could not delete message from ".$CONFIG['drafts_mbox']), TRUE, FALSE); |
| | | } |
| | | } |
| | | |