* - Send mail
* - Save As Draft
*
- * @copyright © 1999-2006 The SquirrelMail Project Team
+ * @copyright © 1999-2007 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
require_once(SM_PATH . 'functions/imap_messages.php');
require_once(SM_PATH . 'functions/date.php');
require_once(SM_PATH . 'functions/mime.php');
+require_once(SM_PATH . 'functions/compose.php');
require_once(SM_PATH . 'class/deliver/Deliver.class.php');
require_once(SM_PATH . 'functions/addressbook.php');
require_once(SM_PATH . 'functions/forms.php');
$oErrorHandler->setDelayedErrors(true);
/** SESSION/POST/GET VARS */
-sqgetGlobalVar('session',$session);
-sqgetGlobalVar('mailbox',$mailbox);
-if(!sqgetGlobalVar('identity',$identity)) {
+sqgetGlobalVar('send', $send, SQ_POST);
+// Send can only be achieved by setting $_POST var. If Send = true then
+// retrieve other form fields from $_POST
+if (isset($send) && $send) {
+ $SQ_GLOBAL = SQ_POST;
+} else {
+ $SQ_GLOBAL = SQ_FORM;
+}
+sqgetGlobalVar('session',$session, $SQ_GLOBAL);
+sqgetGlobalVar('mailbox',$mailbox, $SQ_GLOBAL);
+if(!sqgetGlobalVar('identity',$identity, $SQ_GLOBAL)) {
$identity=0;
}
-sqgetGlobalVar('send_to',$send_to);
-sqgetGlobalVar('send_to_cc',$send_to_cc);
-sqgetGlobalVar('send_to_bcc',$send_to_bcc);
-sqgetGlobalVar('subject',$subject);
-sqgetGlobalVar('body',$body);
-sqgetGlobalVar('mailprio',$mailprio);
-sqgetGlobalVar('request_mdn',$request_mdn);
-sqgetGlobalVar('request_dr',$request_dr);
-sqgetGlobalVar('html_addr_search',$html_addr_search);
-sqgetGlobalVar('mail_sent',$mail_sent);
-sqgetGlobalVar('passed_id',$passed_id);
-sqgetGlobalVar('passed_ent_id',$passed_ent_id);
-sqgetGlobalVar('send',$send);
-
-sqgetGlobalVar('attach',$attach);
-
-sqgetGlobalVar('draft',$draft);
-sqgetGlobalVar('draft_id',$draft_id);
-sqgetGlobalVar('ent_num',$ent_num);
-sqgetGlobalVar('saved_draft',$saved_draft);
+sqgetGlobalVar('send_to',$send_to, $SQ_GLOBAL);
+sqgetGlobalVar('send_to_cc',$send_to_cc, $SQ_GLOBAL);
+sqgetGlobalVar('send_to_bcc',$send_to_bcc, $SQ_GLOBAL);
+sqgetGlobalVar('subject',$subject, $SQ_GLOBAL);
+sqgetGlobalVar('body',$body, $SQ_GLOBAL);
+sqgetGlobalVar('mailprio',$mailprio, $SQ_GLOBAL);
+sqgetGlobalVar('request_mdn',$request_mdn, $SQ_GLOBAL);
+sqgetGlobalVar('request_dr',$request_dr, $SQ_GLOBAL);
+sqgetGlobalVar('html_addr_search',$html_addr_search, $SQ_GLOBAL);
+sqgetGlobalVar('mail_sent',$mail_sent, $SQ_GLOBAL);
+sqgetGlobalVar('passed_id',$passed_id, $SQ_GLOBAL);
+sqgetGlobalVar('passed_ent_id',$passed_ent_id, $SQ_GLOBAL);
+
+sqgetGlobalVar('attach',$attach, SQ_POST);
+sqgetGlobalVar('draft',$draft, SQ_POST);
+sqgetGlobalVar('draft_id',$draft_id, $SQ_GLOBAL);
+sqgetGlobalVar('ent_num',$ent_num, $SQ_GLOBAL);
+sqgetGlobalVar('saved_draft',$saved_draft, SQ_FORM);
if ( sqgetGlobalVar('delete_draft',$delete_draft) ) {
$delete_draft = (int)$delete_draft;
'body' => 'body',
'subject' => 'subject');
$mtdata = unserialize($mailtodata);
-
+
foreach ($trtable as $f => $t) {
if ( !empty($mtdata[$f]) ) {
$$t = $mtdata[$f];
/**
* 1) Remove the addresses we'll be sending the message 'to'
*/
- if (isset($header->replyto)) {
- $excl_ar = $header->getAddr_a('replyto');
+ if (isset($header->reply_to)) {
+ $excl_ar = $header->getAddr_a('reply_to');
}
/**
* 2) Remove our identities from the CC list (they still can be in the
$bodyTop = sq_str_pad(' '._("Original Message").' ',$editor_size -2,'-',STR_PAD_BOTH,$default_charset) .
"\n". $display[_("Subject")] . $subject . "\n" .
$display[_("From")] . $from . "\n" .
- $display[_("Date")] . getLongDateString( $orig_header->date ). "\n" .
+ $display[_("Date")] . getLongDateString( $orig_header->date, $orig_header->date_unparsed ). "\n" .
$display[_("To")] . $to . "\n";
if ($orig_header->cc != array() && $orig_header->cc !='') {
$cc = decodeHeader($orig_header->getAddr_s('cc',"\n$indent"),false,false,true);
sqsession_unregister('session_expired_post');
session_write_close();
} else {
- // these are the vars that we can set from the expired composed session
+ // these are the vars that we can set from the expired composed session
$compo_var_list = array ( 'send_to', 'send_to_cc','body','startMessage',
'passed_body','use_signature','signature','attachments','subject','newmail',
'send_to_bcc', 'passed_id', 'mailbox', 'from_htmladdr_search', 'identity',
foreach ($compo_var_list as $var) {
if ( isset($session_expired_post[$var]) && !isset($$var) ) {
- $$var = $session_expired_post[$var];
+ $$var = $session_expired_post[$var];
}
}
$composeMessage=$compose_messages[$session];
}
-if (!isset($mailbox) || $mailbox == '' || ($mailbox == 'None')) {
+if (empty($mailbox)) {
$mailbox = 'INBOX';
}
}
sqimap_logout($imap_stream);
}
-
+
$oErrorHandler->saveDelayedErrors();
session_write_close();
if( $line <> '-- ' ) {
$line = rtrim($line);
}
- if (sq_strlen($line,$default_charset) <= $editor_size + 1) {
+ if (sq_strlen($line, $default_charset) <= $editor_size + 1) {
$newBody .= $line . "\n";
} else {
- sqWordWrap($line, $editor_size,$default_charset);
+ sqWordWrap($line, $editor_size, $default_charset);
$newBody .= $line . "\n";
}
$Result = deliverMessage($composeMessage);
- do_hook('compose_send_after', $Result, $composeMessage);
+ if ($Result)
+ $mail_sent = 'yes';
+ else
+ $mail_sent = 'no';
+
+ // NOTE: this hook changed in 1.5.2 from sending $Result and
+ // $composeMessage as args #2 and #3 to being in an array
+ // under arg #2
+ do_hook('compose_send_after', $temp=array(&$Result, &$composeMessage, &$mail_sent));
if (! $Result) {
showInputForm($session);
exit();
if ($compose_new_win == '1') {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
- Header("Location: $location/compose.php?mail_sent=yes");
+ Header("Location: $location/compose.php?mail_sent=$mail_sent");
} else {
echo ' <br><br><div style="text-align: center;"><a href="' . $location
- . '/compose.php?mail_sent=yes">'
+ . '/compose.php?mail_sent=$mail_sent">'
. _("Return") . '</a></div>';
}
exit();
} else {
if ( !isset($pageheader_sent) || !$pageheader_sent ) {
Header("Location: $location/right_main.php?mailbox=$urlMailbox".
- "&startMessage=$startMessage&mail_sent=yes");
+ "&startMessage=$startMessage&mail_sent=$mail_sent");
} else {
echo ' <br><br><div style="text-align: center;"><a href="' . $location
. "/right_main.php?mailbox=$urlMailbox"
- . "&startMessage=$startMessage&mail_sent=yes\">"
+ . "&startMessage=$startMessage&mail_sent=$mail_sent\">"
. _("Return") . '</a></div>';
}
exit();
$type1 = $msg->type1;
$unencoded_bodypart = mime_fetch_body($imapConnection, $passed_id, $ent);
$body_part_entity = $message->getEntity($ent);
- $bodypart = decodeBody($unencoded_bodypart,
+ $bodypart = decodeBody($unencoded_bodypart,
$body_part_entity->header->encoding);
if ($type1 == 'html') {
$bodypart = str_replace("\n", ' ', $bodypart);
}
}
$subject = decodeHeader($orig_header->subject,false,false,true);
-
+
// Remember the receipt settings
$request_mdn = $mdn_user_support && !empty($orig_header->dnt) ? '1' : '0';
$request_dr = $mdn_user_support && !empty($orig_header->drnt) ? '1' : '0';
-
+
/* remember the references and in-reply-to headers in case of an reply */
$composeMessage->rfc822_header->more_headers['References'] = $orig_header->references;
$composeMessage->rfc822_header->more_headers['In-Reply-To'] = $orig_header->in_reply_to;
}
/* this corrects some wrapping/quoting problems on replies */
$rewrap_body = explode("\n", $body);
- $from = (is_array($orig_header->from)) ? $orig_header->from[0] : $orig_header->from;
+ $from = (is_array($orig_header->from) && !empty($orig_header->from)) ? $orig_header->from[0] : $orig_header->from;
$body = '';
$strip_sigs = getPref($data_dir, $username, 'strip_sigs');
foreach ($rewrap_body as $line) {
* @return object
*/
function getAttachments($message, &$composeMessage, $passed_id, $entities, $imapConnection) {
- global $attachment_dir, $username, $data_dir, $squirrelmail_language, $languages;
- $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
+ global $squirrelmail_language, $languages;
+
if (!count($message->entities) ||
($message->type0 == 'message' && $message->type1 == 'rfc822')) {
if ( !in_array($message->entity_id, $entities) && $message->entity_id) {
function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
$filename = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $filename);
}
- $localfilename = GenerateRandomString(32, '', 7);
- $full_localfilename = "$hashed_attachment_dir/$localfilename";
- while (file_exists($full_localfilename)) {
- $localfilename = GenerateRandomString(32, '', 7);
- $full_localfilename = "$hashed_attachment_dir/$localfilename";
- }
- $message->att_local_name = $full_localfilename;
+ $localfilename = sq_get_attach_tempfile();
+ $message->att_local_name = $localfilename;
$composeMessage->initAttachment($message->type0.'/'.$message->type1,$filename,
- $full_localfilename);
+ $localfilename);
/* Write Attachment to file */
- $fp = fopen ("$hashed_attachment_dir/$localfilename", 'wb');
+ $fp = fopen ($localfilename, 'wb');
mime_print_body_lines ($imapConnection, $passed_id, $message->entity_id, $message->header->encoding, $fp);
fclose ($fp);
}
function getMessage_RFC822_Attachment($message, $composeMessage, $passed_id,
$passed_ent_id='', $imapConnection) {
- global $attachment_dir, $username, $data_dir;
- $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
if (!$passed_ent_id) {
$body_a = sqimap_run_command($imapConnection,
'FETCH '.$passed_id.' RFC822',
array_pop($body_a);
$body = implode('', $body_a) . "\r\n";
- $localfilename = GenerateRandomString(32, 'FILE', 7);
- $full_localfilename = "$hashed_attachment_dir/$localfilename";
-
- $fp = fopen($full_localfilename, 'w');
+ $localfilename = sq_get_attach_tempfile();
+ $fp = fopen($localfilename, 'wb');
fwrite ($fp, $body);
fclose($fp);
$composeMessage->initAttachment('message/rfc822',$subject.'.msg',
- $full_localfilename);
+ $localfilename);
}
return $composeMessage;
}
'enctype="multipart/form-data"';
$compose_onsubmit = array();
- do_hook('compose_form');
+ global $null;
+ do_hook('compose_form', $null);
// Plugins that use compose_form hook can add an array entry
// to the globally scoped $compose_onsubmit; we add them up
}
if ($saved_draft == 'yes') {
- $oTemplate->assign('note', _("Draft Saved"));
+ $oTemplate->assign('note', _("Your draft has been saved."));
$oTemplate->display('note.tpl');
}
if ($mail_sent == 'yes') {
- $oTemplate->assign('note', _("Your message has been sent."));
+ $oTemplate->assign('note', _("Your mail has been sent."));
$oTemplate->display('note.tpl');
}
if ($compose_new_win == '1') {
$oTemplate->display('compose_newwin_close.tpl');
}
-
+
if ($location_of_buttons == 'top') {
showComposeButtonRow();
}
$identities[$id] = $data['full_name'].' <'.$data['email_address'].'>';
}
}
-
+
$oTemplate->assign('identities', $identities);
$oTemplate->assign('identity_def', $identity);
$oTemplate->assign('input_onfocus', 'onfocus="'.join(' ', $onfocus_array).'"');
-
+
$oTemplate->assign('to', htmlspecialchars($send_to));
$oTemplate->assign('cc', htmlspecialchars($send_to_cc));
$oTemplate->assign('bcc', htmlspecialchars($send_to_bcc));
$oTemplate->assign('subject', htmlspecialchars($subject));
-
+
$oTemplate->display('compose_header.tpl');
if ($location_of_buttons == 'between') {
$oTemplate->assign('input_onfocus', 'onfocus="'.join(' ', $onfocus_array).'"');
$oTemplate->assign('body', $body_str);
$oTemplate->assign('show_bottom_send', $location_of_buttons!='bottom');
-
+
$oTemplate->display ('compose_body.tpl');
-
+
if ($location_of_buttons == 'bottom') {
showComposeButtonRow();
}
$attached_filename = decodeHeader($attachment->mime_header->getParameter('name'));
$type = $attachment->mime_header->type0.'/'.
$attachment->mime_header->type1;
-
+
$a = array();
$a['Key'] = $key;
$a['FileName'] = $attached_filename;
}
}
}
-
+
$max = min($sizes);
$oTemplate->assign('max_file_size', empty($max) ? -1 : $max);
$oTemplate->assign('attachments', $attach);
-
+
$oTemplate->display('compose_attachments.tpl');
} // End of file_uploads if-block
/* End of attachment code */
+//FIXME: no direct echoing to browser, no HTML output in core!
echo addHidden('username', $username).
addHidden('smaction', $action).
addHidden('mailbox', $mailbox);
so we can restore them in case of a session timeout.
*/
sqgetGlobalVar('QUERY_STRING', $queryString, SQ_SERVER);
- echo addHidden('restoremessages', serialize($compose_messages)).
+//FIXME: no direct echoing to browser, no HTML output in core!
+ echo addHidden('restoremessages', urlencode(serialize($compose_messages))).
addHidden('composesession', $composesession).
addHidden('querystring', $queryString).
"</form>\n";
if (!(bool) ini_get('file_uploads')) {
/* File uploads are off, so we didn't show that part of the form.
To avoid bogus bug reports, tell the user why. */
+//FIXME: no direct echoing to browser, no HTML output in core!
echo '<p style="text-align:center">'
. _("Because PHP file uploads are turned off, you can not attach files to this message. Please see your system administrator for details.")
. "</p>\r\n";
}
- do_hook('compose_bottom');
-
if ($compose_new_win=='1') {
$oTemplate->display('compose_newwin_close.tpl');
}
-
+
+ do_hook('compose_bottom', $null);
+
$oErrorHandler->setDelayedErrors(false);
$oTemplate->display('footer.tpl');
}
$data_dir, $username;
global $oTemplate, $buffer_hook;
-
- if ($default_use_priority) {
+
+ if ($default_use_priority) {
$priorities = array('1'=>_("High"), '3'=>_("Normal"), '5'=>_("Low"));
$priority = isset($mailprio) ? $mailprio : 3;
} else {
$priorities = array();
$priority = NULL;
}
-
+
$mdn_user_support=getPref($data_dir, $username, 'mdn_user_support',$default_use_mdn);
- if ($use_javascript_addr_book) {
- $addr_book = " <script type=\"text/javascript\"><!--\n document.write(\"".
- " <input type=button value=\\\""._("Addresses").
- "\\\" onclick=\\\"javascript:open_abook();\\\" />\");".
- " // --></script><noscript>\n".
- ' <input type="submit" name="html_addr_search" value="'.
- _("Addresses").'" />'.
- " </noscript>\n";
+ if ($use_javascript_addr_book && checkForJavascript()) {
+ $addr_book = addButton(_("Addresses"), null, array('onclick' => 'javascript:open_abook();'));
} else {
- $addr_book = ' <input type="submit" name="html_addr_search" value="'.
- _("Addresses").'" />' . "\n";
+ $addr_book = addSubmit(_("Addresses"), 'html_addr_search');
}
$oTemplate->assign('allow_priority', $default_use_priority==1);
$oTemplate->assign('priority_list', $priorities);
$oTemplate->assign('current_priority', $priority);
-
+
$oTemplate->assign('notifications_enabled', $mdn_user_support==1);
$oTemplate->assign('read_receipt', $request_mdn=='1');
$oTemplate->assign('delivery_receipt', $request_dr=='1');
-
+
$oTemplate->assign('drafts_enabled', $save_as_draft);
$oTemplate->assign('address_book_button', $addr_book);
/* True if FAILURE */
function saveAttachedFiles($session) {
- global $_FILES, $attachment_dir, $username,
- $data_dir, $compose_messages;
+ global $compose_messages;
/* get out of here if no file was attached at all */
if (! is_uploaded_file($_FILES['attachfile']['tmp_name']) ) {
return true;
}
- $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
- $localfilename = GenerateRandomString(32, '', 7);
- $full_localfilename = "$hashed_attachment_dir/$localfilename";
- while (file_exists($full_localfilename)) {
- $localfilename = GenerateRandomString(32, '', 7);
- $full_localfilename = "$hashed_attachment_dir/$localfilename";
- }
+ $localfilename = sq_get_attach_tempfile();
// m_u_f works better with restricted PHP installs (safe_mode, open_basedir),
// if that doesn't work, try a simple rename.
- if (!@move_uploaded_file($_FILES['attachfile']['tmp_name'],$full_localfilename)) {
- if (!@rename($_FILES['attachfile']['tmp_name'], $full_localfilename)) {
+ if (!@move_uploaded_file($_FILES['attachfile']['tmp_name'],$localfilename)) {
+ if (!@rename($_FILES['attachfile']['tmp_name'], $localfilename)) {
return true;
}
}
$message = $compose_messages[$session];
$type = strtolower($_FILES['attachfile']['type']);
$name = $_FILES['attachfile']['name'];
- $message->initAttachment($type, $name, $full_localfilename);
+ $message->initAttachment($type, $name, $localfilename);
$compose_messages[$session] = $message;
sqsession_register($compose_messages , 'compose_messages');
}
} elseif (isset($rfc822_header->dnt)) {
unset($rfc822_header->dnt);
}
-
+
/* Receipt: On Delivery */
if (isset($request_dr) && $request_dr) {
$rfc822_header->more_headers['Return-Receipt-To'] = $from_mail;
$rfc822_header->content_type = $content_type;
$composeMessage->rfc822_header = $rfc822_header;
-
+
/* Here you can modify the message structure just before we hand
- it over to deliver */
- $hookReturn = do_hook('compose_send', $composeMessage);
- /* Get any changes made by plugins to $composeMessage. */
- if ( is_object($hookReturn[1]) ) {
- $composeMessage = $hookReturn[1];
- }
+ it over to deliver; plugin authors note that $composeMessage
+ is sent and modified by reference since 1.5.2 */
+ do_hook('compose_send', $composeMessage);
if (!$useSendmail && !$draft) {
require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
}
if (!$success) {
// $deliver->dlv_server_msg is not always server's reply
- $msg = $deliver->dlv_msg;
+ $msg = _("Message not sent.") . "<br />\n" .
+ $deliver->dlv_msg;
if (!empty($deliver->dlv_server_msg)) {
// add 'server replied' part only when it is not empty.
// Delivery error can be generated by delivery class itself
case 'forward':
case 'forward_as_attachment':
// check if we are allowed to set the $Forwarded flag (RFC 4550 paragraph 2.8)
- if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) ||
+ if (in_array('$forwarded',$aMailbox['PERMANENTFLAGS'], true) ||
in_array('\\*',$aMailbox['PERMANENTFLAGS'])) {
$aUpdatedMsgs = sqimap_toggle_flag($imap_stream, array($passed_id), '$Forwarded', true, false);
}
return $success;
}
-?>
\ No newline at end of file
+?>