| | |
| | | if (!empty($mailbcc)) { |
| | | $headers['Bcc'] = $mailbcc; |
| | | } |
| | | if (!empty($identity_arr['bcc']) && stripos($headers['Bcc'], $identity_arr['bcc']) === false) { |
| | | $headers['Bcc'] = ($headers['Bcc'] ? $headers['Bcc'].', ' : '') . $identity_arr['bcc']; |
| | | $RECIPIENT_COUNT ++; |
| | | } |
| | | |
| | | if (($max_recipients = (int) $RCMAIL->config->get('max_recipients')) > 0) { |
| | | if ($RECIPIENT_COUNT > $max_recipients) { |
| | |
| | | if (!empty($_POST['_replyto'])) { |
| | | $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'] = rcmail_email_input_format($identity_arr['reply-to'], false, true); |
| | | } |
| | | if (!empty($headers['Reply-To'])) { |
| | | $headers['Mail-Reply-To'] = $headers['Reply-To']; |
| | | } |
| | | if (!empty($_POST['_followupto'])) { |
| | | $headers['Mail-Followup-To'] = rcmail_email_input_format(get_input_value('_followupto', RCUBE_INPUT_POST, TRUE, $message_charset)); |
| | | } |
| | | if (!empty($COMPOSE['reply_msgid'])) { |
| | | $headers['In-Reply-To'] = $COMPOSE['reply_msgid']; |
| | | } |
| | | |
| | | // remember reply/forward UIDs in special headers |
| | |
| | | $headers['X-Draft-Info'] = array('type' => 'forward', 'uid' => $COMPOSE['forward_uid']); |
| | | } |
| | | |
| | | if (!empty($COMPOSE['reply_msgid'])) { |
| | | $headers['In-Reply-To'] = $COMPOSE['reply_msgid']; |
| | | } |
| | | if (!empty($COMPOSE['references'])) { |
| | | $headers['References'] = $COMPOSE['references']; |
| | | } |
| | |
| | | } |
| | | |
| | | // exec hook for header checking and manipulation |
| | | // Depracated: use message_before_send hook instead |
| | | $data = $RCMAIL->plugins->exec_hook('message_outgoing_headers', array('headers' => $headers)); |
| | | |
| | | // sending aborted by plugin |
| | |
| | | $message_body = get_input_value('_message', RCUBE_INPUT_POST, TRUE, $message_charset); |
| | | |
| | | if ($isHtml) { |
| | | $font = rcube_fontdefs($RCMAIL->config->get('default_font', 'Verdana')); |
| | | $bstyle = $font && is_string($font) ? " style='font-family: $font'" : ''; |
| | | $bstyle = array(); |
| | | |
| | | if ($font_size = $RCMAIL->config->get('default_font_size')) { |
| | | $bstyle[] = 'font-size: ' . $font_size; |
| | | } |
| | | if ($font_family = $RCMAIL->config->get('default_font')) { |
| | | $bstyle[] = 'font-family: ' . rcmail::font_defs($font_family); |
| | | } |
| | | |
| | | // append doctype and html/body wrappers |
| | | $message_body = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">' . |
| | | "\r\n<html><body$bstyle>\r\n" . $message_body; |
| | | $message_body = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">' |
| | | . "\r\n<html><body" . (!empty($bstyle) ? " style='" . implode($bstyle, '; ') . "'" : '') . ">\r\n" |
| | | . $message_body; |
| | | } |
| | | |
| | | if (!$savedraft) { |
| | |
| | | } |
| | | |
| | | // add stored attachments, if any |
| | | if (is_array($COMPOSE['attachments'])) |
| | | { |
| | | if (is_array($COMPOSE['attachments'])) { |
| | | foreach ($COMPOSE['attachments'] as $id => $attachment) { |
| | | // This hook retrieves the attachment contents from the file storage backend |
| | | $attachment = $RCMAIL->plugins->exec_hook('attachment_get', $attachment); |
| | | |
| | | $dispurl = '/\ssrc\s*=\s*[\'"]*\S+display-attachment\S+file=rcmfile' . preg_quote($attachment['id']) . '[\s\'"]*/'; |
| | | $message_body = $MAIL_MIME->getHTMLBody(); |
| | | if ($isHtml && (preg_match($dispurl, $message_body) > 0)) { |
| | | $message_body = preg_replace($dispurl, ' src="'.$attachment['name'].'" ', $message_body); |
| | | if ($isHtml) { |
| | | $dispurl = '/\ssrc\s*=\s*[\'"]*\S+display-attachment\S+file=rcmfile' . preg_quote($attachment['id']) . '[\s\'"]*/'; |
| | | $message_body = $MAIL_MIME->getHTMLBody(); |
| | | $is_inline = preg_match($dispurl, $message_body); |
| | | } |
| | | else { |
| | | $is_inline = false; |
| | | } |
| | | |
| | | // inline image |
| | | if ($is_inline) { |
| | | // Mail_Mime does not support many inline attachments with the same name (#1489406) |
| | | // we'll generate cid: urls here to workaround this |
| | | $cid = preg_replace('/[^0-9a-zA-Z]/', '', uniqid(time(), true)); |
| | | if (preg_match('#(@[0-9a-zA-Z\-\.]+)#', $from, $matches)) { |
| | | $cid .= $matches[1]; |
| | | } else { |
| | | $cid .= '@localhost'; |
| | | } |
| | | |
| | | $message_body = preg_replace($dispurl, ' src="cid:' . $cid . '" ', $message_body); |
| | | |
| | | $MAIL_MIME->setHTMLBody($message_body); |
| | | |
| | | if ($attachment['data']) |
| | | $MAIL_MIME->addHTMLImage($attachment['data'], $attachment['mimetype'], $attachment['name'], false); |
| | | $MAIL_MIME->addHTMLImage($attachment['data'], $attachment['mimetype'], $attachment['name'], false, $cid); |
| | | else |
| | | $MAIL_MIME->addHTMLImage($attachment['path'], $attachment['mimetype'], $attachment['name'], true); |
| | | $MAIL_MIME->addHTMLImage($attachment['path'], $attachment['mimetype'], $attachment['name'], true, $cid); |
| | | } |
| | | else { |
| | | $ctype = str_replace('image/pjpeg', 'image/jpeg', $attachment['mimetype']); // #1484914 |
| | |
| | | } |
| | | |
| | | // choose transfer encoding for plain/text body |
| | | if (preg_match('/[^\x00-\x7F]/', $MAIL_MIME->getTXTBody())) |
| | | if (preg_match('/[^\x00-\x7F]/', $MAIL_MIME->getTXTBody())) { |
| | | $text_charset = $message_charset; |
| | | $transfer_encoding = $RCMAIL->config->get('force_7bit') ? 'quoted-printable' : '8bit'; |
| | | else |
| | | } |
| | | else { |
| | | $text_charset = ''; |
| | | $transfer_encoding = '7bit'; |
| | | } |
| | | |
| | | if ($flowed) { |
| | | if (!$text_charset) { |
| | | $text_charset = 'US-ASCII'; |
| | | } |
| | | |
| | | $text_charset .= ";\r\n format=flowed"; |
| | | } |
| | | |
| | | // encoding settings for mail composing |
| | | $MAIL_MIME->setParam('text_encoding', $transfer_encoding); |
| | |
| | | $MAIL_MIME->setParam('head_encoding', 'quoted-printable'); |
| | | $MAIL_MIME->setParam('head_charset', $message_charset); |
| | | $MAIL_MIME->setParam('html_charset', $message_charset); |
| | | $MAIL_MIME->setParam('text_charset', $message_charset . ($flowed ? ";\r\n format=flowed" : '')); |
| | | $MAIL_MIME->setParam('text_charset', $text_charset); |
| | | |
| | | // encoding subject header with mb_encode provides better results with asian characters |
| | | if (function_exists('mb_encode_mimeheader')) { |
| | |
| | | |
| | | if (PEAR::isError($msg)) |
| | | raise_error(array('code' => 650, 'type' => 'php', |
| | | 'file' => __FILE__, 'line' => __LINE__, |
| | | 'file' => __FILE__, 'line' => __LINE__, |
| | | 'message' => "Could not create message: ".$msg->getMessage()), |
| | | TRUE, FALSE); |
| | | else { |
| | |
| | | |
| | | // start the auto-save timer again |
| | | $OUTPUT->command('auto_save_start'); |
| | | |
| | | $OUTPUT->send('iframe'); |
| | | } |
| | | else { |
| | | $folders = array(); |
| | | |
| | | if ($COMPOSE['mode'] == 'reply' || $COMPOSE['mode'] == 'forward') |
| | | $folders[] = $COMPOSE['mailbox']; |
| | | |
| | | rcmail_compose_cleanup($COMPOSE_ID); |
| | | $OUTPUT->command('remove_compose_data', $COMPOSE_ID); |
| | | |
| | | if ($store_folder && !$saved) |
| | | $OUTPUT->command('sent_successfully', 'error', rcube_label('errorsavingsent')); |
| | | else |
| | | $OUTPUT->command('sent_successfully', 'confirmation', rcube_label('messagesent'), $store_target); |
| | | $OUTPUT->send('iframe'); |
| | | $OUTPUT->command('sent_successfully', 'error', rcube_label('errorsavingsent'), $folders); |
| | | else { |
| | | if ($store_folder) { |
| | | $folders[] = $store_target; |
| | | } |
| | | |
| | | $OUTPUT->command('sent_successfully', 'confirmation', rcube_label('messagesent'), $folders); |
| | | } |
| | | } |
| | | |
| | | $OUTPUT->send('iframe'); |