* This file is used for reading the msgs array and displaying
* the resulting emails in the right frame.
*
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright 1999-2020 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
* and sorted msgs array and return the index of the next message
*
* @param int $passed_id The current message UID
- * @return the index of the next valid message from the array
+ * @return the index of the next valid message from the array or -1 if there is no next message
*/
function findNextMessage($uidset,$passed_id='backwards') {
if (!is_array($uidset)) {
* and sorted msgs array and return the index of the previous message
*
* @param int $passed_id The current message UID
- * @return the index of the next valid message from the array
+ * @return the index of the previous valid message from the array or -1 if there is no previous message
*/
function findPreviousMessage($uidset, $passed_id) {
if ($special_encoding) {
$mime_header->encoding = $special_encoding;
} else {
- $mime_header->encoding = 'us-ascii';
+ $mime_header->encoding = '7bit';
}
if ($default_charset) {
$mime_header->parameters['charset'] = $default_charset;
$mime_header = new MessageHeader;
$mime_header->type0 = 'message';
$mime_header->type1 = 'disposition-notification';
- $mime_header->encoding = 'us-ascii';
+ $mime_header->encoding = '7bit';
$part2->mime_header = $mime_header;
$composeMessage = new Message();
} else {
require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
$deliver = new Deliver_SMTP();
- global $smtpServerAddress, $smtpPort, $pop_before_smtp;
+ global $smtpServerAddress, $smtpPort, $pop_before_smtp, $pop_before_smtp_host;
$authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
+ if (empty($pop_before_smtp_host)) $pop_before_smtp_host = $smtpServerAddress;
get_smtp_user($user, $pass);
$stream = $deliver->initStream($composeMessage,$domain,0,
- $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
+ $smtpServerAddress, $smtpPort, $user, $pass, $authPop, $pop_before_smtp_host);
}
$success = false;
if ($stream) {
$success = $deliver->finalizeStream($stream);
}
if (!$success) {
- $msg = _("Message not sent.") . "<br />\n" .
+ $msg = _("Message not sent.") . "\n" .
$deliver->dlv_msg;
if (! empty($deliver->dlv_server_msg)) {
- $msg.= '<br />' .
+ $msg.= "\n" .
_("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
- nl2br(htmlspecialchars($deliver->dlv_server_msg));
+ nl2br(sm_encode_html_special_chars($deliver->dlv_server_msg));
}
plain_error_message($msg);
} else {
}
require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
$imap_deliver = new Deliver_IMAP();
- $imap_deliver->mail($composeMessage, $imapConnection, 0, 0, $sent_folder);
+ $imap_deliver->mail($composeMessage, $imapConnection, 0, 0, $imapConnection, $sent_folder);
unset ($imap_deliver);
}
}
$a = array();
foreach ($recipients as $r) {
$a[] = array(
- 'Name' => htmlspecialchars($r->getAddress(false)),
- 'Email' => htmlspecialchars($r->getEmail()),
- 'Full' => htmlspecialchars($r->getAddress(true))
+ // note: decodeHeader is htmlsafe by default
+ 'Name' => decodeHeader($r->getAddress(false)),
+ 'Email' => sm_encode_html_special_chars($r->getEmail()),
+ 'Full' => decodeHeader($r->getAddress(true))
);
}
/**
* Format message toolbar
*
- * @param array $aMailbox Current mailbox information array
- * @param int $passed_id UID of current message
- * @param int $passed_ent_id Id of entity within message
- * @param object $message Current message object
- * @param object $mbx_response
+ * @param array $aMailbox Current mailbox information array
+ * @param int $passed_id UID of current message
+ * @param int $passed_ent_id Id of entity within message
+ * @param object $message Current message object
+ * @param void $removedVar This parameter is no longer used, but remains
+ * so as not to break this function's prototype
+ * (OPTIONAL)
+ * @param boolean $nav_on_top When TRUE, the menubar is being constructed
+ * for use at the top of the page, otherwise it
+ * will be used for page bottom (OPTIONAL;
+ * default = TRUE)
*/
-function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
+function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message,
+ $removedVar=FALSE, $nav_on_top=TRUE) {
+
global $base_uri, $draft_folder, $where, $what, $sort,
$startMessage, $PHP_SELF, $save_as_draft,
$enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
$delete_prev_next_display, $show_copy_buttons,
$compose_new_win, $compose_width, $compose_height,
- $oTemplate;
+ $oTemplate, $return_to_message_list_after_move;
//FIXME cleanup argument list, use $aMailbox where possible
$mailbox = $aMailbox['NAME'];
'&mailbox='.$urlMailbox.'&sort='.$sort.
'&startMessage='.$startMessage.'&show_more=0'.
"&where=$where&what=$what" .
- '&delete_id='.$passed_id;
+ '&delete_id='.$passed_id .
+ '&smtoken='.sm_generate_security_token();
}
if ($next >= 0) {
'&mailbox='.$urlMailbox.'&sort='.$sort.
'&startMessage='.$startMessage.'&show_more=0'.
"&where=$where&what=$what" .
- '&delete_id='.$passed_id;
+ '&delete_id='.$passed_id .
+ '&smtoken='.sm_generate_security_token();
}
}
}
// If Draft folder - create Resume link
$resume_draft = $edit_as_new = false;
- if (($mailbox == $draft_folder) && ($save_as_draft)) {
- $resume_draft = true; 'smaction_draft';
+ if (isDraftMailbox($mailbox) && ($save_as_draft)) {
+ $resume_draft = true;
} else if (handleAsSent($mailbox)) {
$edit_as_new = true;
}
$oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
- $delete_url = $base_uri . "src/$where";
$oTemplate->assign('can_be_deleted', true);
- $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
+ // force return-to-message-list if this is the only message in the folder
+ if ($return_to_message_list_after_move || ($next < 0 && $prev < 0))
+ $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
+ else
+ $oTemplate->assign('move_delete_form_action', $base_uri.'src/read_body.php');
$oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
addHidden('msg[0]', $passed_id)."\n" .
addHidden('startMessage', $startMessage)."\n" );
if (!(isset($passed_ent_id) && $passed_ent_id)) {
$oTemplate->assign('can_be_moved', true);
$oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
- addHidden('msg[0]', $passed_id)."\n" );
+ addHidden('msg[0]', $passed_id)."\n" .
+ // only need when $return_to_message_list_after_move is off
+ addHidden('passed_id', ($next >= 0 ? $next : $prev))."\n" .
+ addHidden('startMessage', $startMessage)."\n" );
$oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
$oTemplate->assign('can_be_copied', $show_copy_buttons==1);
} else {
$oTemplate->assign('can_be_copied', false);
}
+ // access keys... only add to the top menubar, because adding
+ // them twice makes them less functional (press access key, *then*
+ // press <enter> to make it work)
+ //
+ if ($nav_on_top) {
+ global $accesskey_read_msg_reply, $accesskey_read_msg_reply_all,
+ $accesskey_read_msg_forward, $accesskey_read_msg_as_attach,
+ $accesskey_read_msg_delete, $accesskey_read_msg_bypass_trash,
+ $accesskey_read_msg_move, $accesskey_read_msg_move_to,
+ $accesskey_read_msg_copy;
+ } else {
+ $accesskey_read_msg_reply = $accesskey_read_msg_reply_all =
+ $accesskey_read_msg_forward = $accesskey_read_msg_as_attach =
+ $accesskey_read_msg_delete = $accesskey_read_msg_bypass_trash =
+ $accesskey_read_msg_move = $accesskey_read_msg_move_to =
+ $accesskey_read_msg_copy = 'NONE';
+ }
+ $oTemplate->assign('accesskey_read_msg_reply', $accesskey_read_msg_reply);
+ $oTemplate->assign('accesskey_read_msg_reply_all', $accesskey_read_msg_reply_all);
+ $oTemplate->assign('accesskey_read_msg_forward', $accesskey_read_msg_forward);
+ $oTemplate->assign('accesskey_read_msg_as_attach', $accesskey_read_msg_as_attach);
+ $oTemplate->assign('accesskey_read_msg_delete', $accesskey_read_msg_delete);
+ $oTemplate->assign('accesskey_read_msg_bypass_trash', $accesskey_read_msg_bypass_trash);
+ $oTemplate->assign('accesskey_read_msg_move_to', $accesskey_read_msg_move_to);
+ $oTemplate->assign('accesskey_read_msg_move', $accesskey_read_msg_move);
+ $oTemplate->assign('accesskey_read_msg_copy', $accesskey_read_msg_copy);
+
global $null;
do_hook('read_body_menu', $null);
function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
global $base_uri, $where, $what, $show_html_default,
- $oTemplate, $download_href,
+ $oTemplate, $download_href, $PHP_SELF,
$unsafe_image_toggle_href, $unsafe_image_toggle_text;
$urlMailbox = urlencode($mailbox);
}
$url = $base_uri.'src/view_header.php?'.$query_string;
-
- // Build the printer friend link
- /* hackydiehack */
-
- // If there's no "view_unsafe_images" setting in the user's preferences,
- // turn unsafe images off by default.
- // FIXME: Check if the UIR plugin is enabled. If it's not, no unsafe images should be displayed regardless of the user's preferences. This test is done in several places in the code and they should all be fixed in the same way.
- if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
- $view_unsafe_images = false;
- } else {
- // FIXME: Do we really want to display the unsafe images regardless of the user's preferences?
- $view_unsafe_images = true;
- }
-
- $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
- '&mailbox=' . $urlMailbox .
- '&passed_id=' . $urlPassed_id .
- '&view_unsafe_images='. (bool) $view_unsafe_images .
- '&show_html_default=' . $show_html_default;
-
$links = array();
$links[] = array (
'URL' => $url,
'Text' => _("View Full Header")
);
- $links[] = array (
- 'URL' => $pf_params,
- 'Text' => _("View Printable Version")
+
+ if ( checkForJavaScript() ) {
+ $links[] = array (
+ 'URL' => 'javascript:printThis();',
+ 'Text' => _("Print"),
);
+ } else {
+ $links[] = array (
+ 'URL' => set_url_var($PHP_SELF, 'print', '1'),
+ 'Text' => _("Print"),
+ 'Target' => '_blank'
+ );
+ }
+
$links[] = array (
'URL' => $download_href,
'Text' => _("Download this as a file")
}
/** GET/POST VARS */
+sqgetGlobalVar('passed_id', $passed_id, SQ_INORDER, NULL, SQ_TYPE_BIGINT);
sqgetGlobalVar('passed_ent_id', $passed_ent_id);
sqgetGlobalVar('mailbox', $mailbox);
-if ( sqgetGlobalVar('passed_id', $temp) ) {
- $passed_id = (int) $temp;
-}
if ( sqgetGlobalVar('sort', $temp) ) {
$sort = (int) $temp;
}
} else {
$view_unsafe_images = 0;
}
+
/**
* Retrieve mailbox cache
*/
handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
}
+/**
+ * or move button... why is handleMessageListForm (per above) conditional anway?
+ */
+if ( sqgetGlobalVar('moveButton', $ignore, SQ_POST) ) {
+ $sError = handleMessageListForm($imapConnection,$aMailbox);
+ sqgetGlobalVar('targetMailbox', $lastTargetMailbox, SQ_POST);
+}
+
/**
* $message contains all information about the message
* including header and body
}
$header = $message->header;
+// gmail does not mark messages as read when retrieving the message body
+// even though RFC 3501, section 6.4.5 (FETCH Command) says:
+// "The \Seen flag is implicitly set; if this causes the flags to change,
+// they SHOULD be included as part of the FETCH responses."
+//
+if ($imap_server_type == 'gmail') {
+ sqimap_toggle_flag($imapConnection, $passed_id, '\\Seen', true, true);
+}
/****************************************/
/* Block for handling incoming url vars */
/* End of block for handling incoming url vars */
/***********************************************/
+$oTemplate->assign('aAttribs', array('class' => 'entity_sep'));
+$hr = $oTemplate->fetch('horizontal_rule.tpl');
$messagebody = '';
do_hook('read_body_top', $null);
if ($show_html_default == 1) {
for ($i = 0; $i < $cnt; $i++) {
$messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
if ($i != $cnt-1) {
- $messagebody .= '<hr />';
+ $messagebody .= $hr;
}
}
$oTemplate->assign('message_list_href', get_message_list_uri($aMailbox['NAME'], $startMessage, $what));
displayPageHeader($color, $mailbox,'','');
-formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message,false);
+
+/* this is the non-javascript version of printer friendly */
+if ( sqgetGlobalVar('print', $print, SQ_GET) ) {
+ $oTemplate->display('read_message_print.tpl');
+} else {
+ formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message,false);
+}
formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
$oTemplate->assign('message_body', $messagebody);