Source for file compose.php
Documentation is available at compose.php
* This code sends a mail.
* There are 4 modes of operation:
* @copyright © 1999-2006 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id: compose.php,v 1.319.2.70 2006/08/03 14:48:09 kink Exp $
* Path for SquirrelMail required files.
/* SquirrelMail required files. */
require_once(SM_PATH .
'include/validate.php');
require_once(SM_PATH .
'functions/global.php');
require_once(SM_PATH .
'functions/imap.php');
require_once(SM_PATH .
'functions/date.php');
require_once(SM_PATH .
'functions/mime.php');
require_once(SM_PATH .
'functions/plugin.php');
require_once(SM_PATH .
'functions/display_messages.php');
require_once(SM_PATH .
'class/deliver/Deliver.class.php');
require_once(SM_PATH .
'functions/addressbook.php');
require_once(SM_PATH .
'functions/forms.php');
require_once(SM_PATH .
'functions/identity.php');
/* --------------------- Get globals ------------------------------------- */
/** SESSION/POST/GET VARS */
$startMessage = (int)
$startMessage;
$html_addr_search_done =
'Use Addresses';
/* Location (For HTTP 1.1 Header("Location: ...") redirects) */
/* --------------------- Specific Functions ------------------------------ */
global $include_self_reply_all, $username, $data_dir;
* 1) Remove the addresses we'll be sending the message 'to'
$url_replytoall_avoid_addrs =
'';
if (isset
($header->replyto)) {
$excl_ar =
$header->getAddr_a('replyto');
* 2) Remove our identities from the CC list (they still can be in the
* TO list) only if $include_self_reply_all is turned off
if (!$include_self_reply_all) {
$url_replytoall_ar =
$header->getAddr_a(array('to','cc'), $excl_ar);
* 4) generate the string.
foreach( $url_replytoall_ar as $email =>
$personal) {
// if personal name contains address separator then surround
// the personal name with double quotes.
if (strpos($personal,',') !==
false) {
$personal =
'"'.
$personal.
'"';
$url_replytoallcc .=
", $personal <$email>";
$url_replytoallcc .=
', '.
$email;
$url_replytoallcc =
substr($url_replytoallcc,2);
return $url_replytoallcc;
global $reply_citation_style, $reply_citation_start, $reply_citation_end;
// FIXME: why object is rewritten with string.
$orig_from =
decodeHeader($orig_from->getAddress(false),false,false,true);
/* First, return an empty string when no citation style selected. */
if (($reply_citation_style ==
'') ||
($reply_citation_style ==
'none')) {
/* Make sure our final value isn't an empty string. */
/* Otherwise, try to select the desired citation style. */
switch ($reply_citation_style) {
* To translators: %s is for author's name
$full_reply_citation =
sprintf(_("%s wrote:"),$orig_from);
$start =
'<' .
_("quote") .
' ' .
_("who") .
'="';
$full_reply_citation =
$start .
$orig_from .
$end;
* first %s is for date string, second %s is for author's name. Date uses
* formating from "D, F j, Y g:i a" and "D, F j, Y H:i" translations.
* "On Sat, December 24, 2004 23:59, Santa wrote:"
* If you have to put author's name in front of date string, check comments about
* argument swapping at http://www.php.net/sprintf
$start =
$reply_citation_start .
($reply_citation_start ==
'' ?
'' :
' ');
$end =
$reply_citation_end;
$full_reply_citation =
$start .
$orig_from .
$end;
/* Add line feed and return the citation string. */
return ($full_reply_citation .
"\n");
$display =
array( _("Subject") =>
strlen(_("Subject")),
$maxsize =
max($display);
foreach($display as $key =>
$val) {
$display[$key] =
$key .
': '.
str_pad('', $maxsize -
$val);
$from =
decodeHeader($orig_header->getAddr_s('from',"\n$indent"),false,false,true);
$to =
decodeHeader($orig_header->getAddr_s('to',"\n$indent"),false,false,true);
$subject =
decodeHeader($orig_header->subject,false,false,true);
$bodyTop =
str_pad(' '.
_("Original Message").
' ',$editor_size -
2,'-',STR_PAD_BOTH) .
"\n".
$display[_("Subject")] .
$subject .
"\n" .
$display[_("From")] .
$from .
"\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);
$bodyTop .=
$display[_("Cc")] .
$cc .
"\n";
$bodyTop .=
str_pad('', $editor_size -
2 , '-') .
/* ----------------------------------------------------------------------- */
* If the session is expired during a post this restores the compose session
* extra check for username so we don't display previous post data from
* another user during this session.
if ($session_expired_post['username'] !=
$username) {
unset
($session_expired_post);
// 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',
'draft_id', 'delete_draft', 'mailprio', 'edit_as_new', 'compose_messsages',
'composesession', 'request_mdn', 'request_dr');
foreach ($compo_var_list as $var) {
if ( isset
($session_expired_post[$var]) &&
!isset
($
$var) ) {
$
$var =
$session_expired_post[$var];
unset
($session_expired_post);
if ($compose_new_win ==
'1') {
if (!isset
($composesession)) {
if (!isset
($session) ||
(isset
($newmessage) &&
$newmessage)) {
$session =
"$composesession" +
1;
$composesession =
$session;
if (!isset
($compose_messages)) {
$compose_messages =
array();
if (!isset
($compose_messages[$session]) ||
($compose_messages[$session] ==
NULL)) {
/* if (!array_key_exists($session, $compose_messages)) { /* We can only do this in PHP >= 4.1 */
$composeMessage->rfc822_header =
$rfc822_header;
$composeMessage->reply_rfc822_header =
'';
$compose_messages[$session] =
$composeMessage;
$composeMessage=
$compose_messages[$session];
if (!isset
($mailbox) ||
$mailbox ==
'' ||
($mailbox ==
'None')) {
* Set $default_charset to correspond with the user's selection
$composeMessage=
$compose_messages[$session];
unset
($compose_messages[$session]);
$draft_message =
_("Draft Email Saved");
/* If this is a resumed draft, then delete the original */
if(isset
($delete_draft)) {
if ( !isset
($pageheader_sent) ||
!$pageheader_sent ) {
Header("Location: $location/delete_message.php?mailbox=" .
urlencode($draft_folder) .
"&message=$delete_draft&sort=$sort&startMessage=1&saved_draft=yes");
echo
' <br><br><center><a href="' .
$location
.
"/delete_message.php?mailbox=" .
urlencode($draft_folder)
.
"&message=$delete_draft&sort=$sort&startMessage=1&saved_draft=yes\">"
.
_("Return") .
'</a></center>';
if ($compose_new_win ==
'1') {
if ( !isset
($pageheader_sent) ||
!$pageheader_sent ) {
Header("Location: $location/compose.php?saved_draft=yes&session=$composesession");
echo
' <br><br><center><a href="' .
$location
.
"/compose.php?saved_draft=yes&session=$composesession\">"
.
_("Return") .
'</a></center>';
if ( !isset
($pageheader_sent) ||
!$pageheader_sent ) {
Header("Location: $location/right_main.php?mailbox=" .
urlencode($draft_folder) .
"&sort=$sort&startMessage=1¬e=".
urlencode($draft_message));
echo
' <br><br><center><a href="' .
$location
.
"/right_main.php?mailbox=" .
urlencode($draft_folder)
.
"&sort=$sort&startMessage=1¬e=".
urlencode($draft_message)
.
"\">" .
_("Return") .
'</a></center>';
if (isset
($_FILES['attachfile']) &&
$_FILES['attachfile']['tmp_name'] &&
$_FILES['attachfile']['tmp_name'] !=
'none') {
if (checkInput(false) &&
!isset
($AttachFailure)) {
if ($mailbox ==
"All Folders") {
/* We entered compose via the search results page */
$mailbox=
"INBOX"; /* Send 'em to INBOX, that's safe enough */
if (! isset
($passed_id)) {
* Set $default_charset to correspond with the user's selection
* This is to change all newlines to \n
* We'll change them to \r\n later (in the sendMessage function)
* Rewrap $body so that no line is bigger than $editor_size
* This should only really kick in the sqWordWrap function
* if the browser doesn't support "VIRTUAL" as the wrap type.
foreach ($body as $line) {
if (sq_strlen($line, $default_charset) <=
$editor_size +
1) {
$newBody .=
$line .
"\n";
sqWordWrap($line, $editor_size, $default_charset);
$newBody .=
$line .
"\n";
$composeMessage=
$compose_messages[$session];
do_hook('compose_send_after', $Result, $composeMessage);
unset
($compose_messages[$session]);
/* if it is resumed draft, delete draft message */
if ( isset
($delete_draft)) {
Header("Location: $location/delete_message.php?mailbox=" .
urlencode( $draft_folder ).
"&message=$delete_draft&sort=$sort&startMessage=1&mail_sent=yes");
if ($compose_new_win ==
'1') {
Header("Location: $location/compose.php?mail_sent=yes");
Header("Location: $location/right_main.php?mailbox=$urlMailbox&sort=$sort".
"&startMessage=$startMessage");
if ($compose_new_win ==
'1') {
if (isset
($AttachFailure)) {
/* sqimap_logout($imapConnection); */
} elseif (isset
($html_addr_search_done)) {
if ($compose_new_win ==
'1') {
if (isset
($send_to_search) &&
is_array($send_to_search)) {
foreach ($send_to_search as $k =>
$v) {
if (substr($k, 0, 1) ==
'T') {
elseif (substr($k, 0, 1) ==
'C') {
elseif (substr($k, 0, 1) ==
'B') {
} elseif (isset
($html_addr_search)) {
if (isset
($_FILES['attachfile']) &&
$_FILES['attachfile']['tmp_name'] &&
$_FILES['attachfile']['tmp_name'] !=
'none') {
* I am using an include so as to elminiate an extra unnecessary
* click. If you can think of a better way, please implement it.
include_once('./addrbook_search_html.php');
} elseif (isset
($attach)) {
if ($compose_new_win ==
'1') {
elseif (isset
($sigappend)) {
$idents =
getPref($data_dir, $username, 'identities', 0);
if ($identity ==
'default') {
$signature =
getSig($data_dir, $username, $no);
$body .=
"\n\n".
($prefix_sig==
true?
"-- \n":
'').
$signature;
if ($compose_new_win ==
'1') {
} elseif (isset
($do_delete)) {
if ($compose_new_win ==
'1') {
if (isset
($delete) &&
is_array($delete)) {
$composeMessage =
$compose_messages[$session];
foreach($delete as $index) {
if (!empty($composeMessage->entities) && isset
($composeMessage->entities[$index])) {
$composeMessage->entities[$index]->purgeAttachments();
unset
($composeMessage->entities[$index]);
foreach ($composeMessage->entities as $entity) {
$new_entities[] =
$entity;
$composeMessage->entities =
$new_entities;
$compose_messages[$session] =
$composeMessage;
* This handles the default case as well as the error case
* (they had the same code) --> if (isset($smtpErrors))
if ($compose_new_win ==
'1') {
if (!isset
($passed_ent_id)) {
if (!isset
($passed_id)) {
$values =
newMail($mailbox,$passed_id,$passed_ent_id, $action, $session);
/* in case the origin is not read_body.php */
$values['send_to'] =
$send_to;
if (isset
($send_to_cc)) {
$values['send_to_cc'] =
$send_to_cc;
if (isset
($send_to_bcc)) {
$values['send_to_bcc'] =
$send_to_bcc;
$values['subject'] =
$subject;
/**************** Only function definitions go below *************/
/* This function is used when not sending or adding attachments */
function newMail ($mailbox=
'', $passed_id=
'', $passed_ent_id=
'', $action=
'', $session=
'') {
$use_signature, $composesession, $data_dir, $username,
$composeMessage, $body_quote;
* Set $default_charset to correspond with the user's selection
* of language interface. $default_charset global is not correct,
* if message is composed in new window.
$send_to =
$send_to_cc =
$send_to_bcc =
$subject =
$identity =
'';
$imapConnection =
sqimap_login($username, $key, $imapServerAddress,
/* redefine the messsage in case of message/rfc822 */
$message =
$message->getEntity($passed_ent_id);
/* message is an entity which contains the envelope and type0=message
* and type1=rfc822. The actual entities are childs from
* $message->entities[0]. That's where the encoding and is located
$entities =
$message->entities[0]->findDisplayEntity
(array(), $alt_order =
array('text/plain'));
$entities =
$message->entities[0]->findDisplayEntity
(array(), $alt_order =
array('text/plain','html/plain'));
$orig_header =
$message->rfc822_header; /* here is the envelope located */
/* redefine the message for picking up the attachments */
$message =
$message->entities[0];
$entities =
$message->findDisplayEntity (array(), $alt_order =
array('text/plain'));
$entities =
$message->findDisplayEntity (array(), $alt_order =
array('text/plain','html/plain'));
$orig_header =
$message->rfc822_header;
$encoding =
$message->header->encoding;
$type0 =
$message->type0;
$type1 =
$message->type1;
foreach ($entities as $ent) {
$body_part_entity =
$message->getEntity($ent);
$body_part_entity->header->encoding);
$bodypart =
preg_replace(array('/<p>/i','/<br\s*(\/)*>/i'), "\n", $bodypart);
$bodypart =
str_replace(array(' ','>','<'),array(' ','>','<'),$bodypart);
if (isset
($languages[$squirrelmail_language]['XTRA_CODE']) &&
if (mb_detect_encoding($bodypart) !=
'ASCII') {
$bodypart =
$languages[$squirrelmail_language]['XTRA_CODE']('decode', $bodypart);
// charset encoding in compose form stuff
if (isset
($body_part_entity->header->parameters['charset'])) {
$actual =
$body_part_entity->header->parameters['charset'];
// end of charset encoding in compose
if ($default_use_priority) {
$mailprio =
substr($orig_header->priority,0,1);
$idents =
getPref($data_dir, $username, 'identities');
$from_o =
$orig_header->from;
$orig_from =
$from_o->getAddress();
if (!empty($idents) &&
$idents >
1) {
$identities[] =
'"'.
getPref($data_dir, $username, 'full_name').
'" <'.
getPref($data_dir, $username, 'email_address').
'>';
for ($i =
1; $i <
$idents; $i++
) {
getPref($data_dir, $username, 'full_name' .
$i) .
getPref($data_dir, $username, 'email_address' .
$i) .
'>';
if ($enc_from_name ==
$orig_from &&
$i) {
$identities[] =
$enc_from_name;
$identity_match =
$orig_header->findAddress($identities);
$identity =
$identity_match;
$composeMessage->rfc822_header =
$orig_header;
$send_to =
decodeHeader($orig_header->getAddr_s('to'),false,false,true);
$send_to_cc =
decodeHeader($orig_header->getAddr_s('cc'),false,false,true);
$send_to_bcc =
decodeHeader($orig_header->getAddr_s('bcc'),false,false,true);
$subject =
decodeHeader($orig_header->subject,false,false,true);
/* 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;
$cnt =
count($body_ary) ;
for ($i=
0; $i <
$cnt; $i++
) {
if (!ereg("^[>\\s]*$", $body_ary[$i]) ||
!$body_ary[$i]) {
sqWordWrap($body_ary[$i], $editor_size, $default_charset );
$body .=
$body_ary[$i] .
"\n";
$composeMessage =
getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
$send_to =
decodeHeader($orig_header->getAddr_s('to'),false,false,true);
$send_to_cc =
decodeHeader($orig_header->getAddr_s('cc'),false,false,true);
$send_to_bcc =
decodeHeader($orig_header->getAddr_s('bcc'),false,false,true);
$subject =
decodeHeader($orig_header->subject,false,false,true);
$mailprio =
$orig_header->priority;
$composeMessage =
getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
$subject =
decodeHeader($orig_header->subject,false,false,true);
$subject =
'[Fwd: ' .
$subject .
']';
$composeMessage =
getAttachments($message, $composeMessage, $passed_id, $entities, $imapConnection);
case ('forward_as_attachment'):
if(isset
($orig_header->mail_followup_to) &&
$orig_header->mail_followup_to) {
$send_to =
$orig_header->getAddr_s('mail_followup_to');
$send_to =
$orig_header->reply_to;
$send_to =
$orig_header->getAddr_s('reply_to');
} else if (is_object($send_to)) { /* unneccesarry, just for failsafe purpose */
$send_to =
$orig_header->getAddr_s('reply_to');
$send_to =
$orig_header->getAddr_s('from');
$subject =
decodeHeader($orig_header->subject,false,false,true);
$subject =
trim($subject);
$subject =
'Re: ' .
$subject;
/* 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;
$cnt =
count($rewrap_body);
for ($i=
0;$i<
$cnt;$i++
) {
sqWordWrap($rewrap_body[$i], $editor_size, $default_charset);
if (preg_match("/^(>+)/", $rewrap_body[$i], $matches)) {
$body .=
$body_quote .
str_replace("\n", "\n" .
$body_quote
.
"$gt ", rtrim($rewrap_body[$i])) .
"\n";
$body .=
$body_quote .
(!empty($body_quote) ?
' ' :
'') .
str_replace("\n", "\n" .
$body_quote .
(!empty($body_quote) ?
' ' :
''), rtrim($rewrap_body[$i])) .
"\n";
$composeMessage->reply_rfc822_header =
$orig_header;
$compose_messages[$session] =
$composeMessage;
$ret =
array( 'send_to' =>
$send_to,
'send_to_cc' =>
$send_to_cc,
'send_to_bcc' =>
$send_to_bcc,
'identity' =>
$identity );
} /* function newMail() */
function getAttachments($message, &$composeMessage, $passed_id, $entities, $imapConnection) {
$hashed_attachment_dir =
getHashedDir($username, $attachment_dir);
if (!count($message->entities) ||
($message->type0 ==
'message' &&
$message->type1 ==
'rfc822')) {
if ( !in_array($message->entity_id, $entities) &&
$message->entity_id) {
switch ($message->type0) {
if ($message->type1 ==
'rfc822') {
$filename =
$message->rfc822_header->subject;
$filename =
"untitled-".
$message->entity_id;
$filename =
$message->getFilename();
if (!$message->mime_header) { /* temporary hack */
$message->mime_header =
$message->header;
$filename =
$message->getFilename();
if (isset
($languages[$squirrelmail_language]['XTRA_CODE']) &&
$filename =
$languages[$squirrelmail_language]['XTRA_CODE']('encode', $filename);
$full_localfilename =
"$hashed_attachment_dir/$localfilename";
$full_localfilename =
"$hashed_attachment_dir/$localfilename";
$message->att_local_name =
$full_localfilename;
$composeMessage->initAttachment($message->type0.
'/'.
$message->type1,$filename,
/* Write Attachment to file */
$fp =
fopen ("$hashed_attachment_dir/$localfilename", 'wb');
$passed_id, $message->entity_id),
for ($i=
0, $entCount=
count($message->entities); $i<
$entCount;$i++
) {
$composeMessage=
getAttachments($message->entities[$i], $composeMessage, $passed_id, $entities, $imapConnection);
$passed_ent_id=
'', $imapConnection) {
$hashed_attachment_dir =
getHashedDir($username, $attachment_dir);
'FETCH '.
$passed_id.
' RFC822',
TRUE, $response, $readmessage,
'FETCH '.
$passed_id.
' BODY['.
$passed_ent_id.
']',
TRUE, $response, $readmessage, $uid_support);
$message =
$message->parent;
$body =
implode('', $body_a) .
"\r\n";
$full_localfilename =
"$hashed_attachment_dir/$localfilename";
$fp =
fopen($full_localfilename, 'w');
$composeMessage->initAttachment('message/rfc822',$subject.
'.msg',
global $send_to, $send_to_cc, $body, $startMessage,
$passed_body, $color, $use_signature, $signature, $prefix_sig,
$editor_size, $editor_height, $attachments, $subject, $newmail,
$use_javascript_addr_book, $send_to_bcc, $passed_id, $mailbox,
$username, $data_dir, $identity, $draft_id, $delete_draft,
$saved_draft, $mail_sent, $sig_first, $edit_as_new, $action,
$onfocus =
' onfocus="alreadyFocused=true;"';
$composeMessage =
$compose_messages[$session];
$send_to =
$values['send_to'];
$send_to_cc =
$values['send_to_cc'];
$send_to_bcc =
$values['send_to_bcc'];
$subject =
$values['subject'];
$mailprio =
$values['mailprio'];
$identity = (int)
$values['identity'];
if ($use_javascript_addr_book) {
echo
"\n".
'<script language="JavaScript">'.
"\n<!--\n" .
'function open_abook() { ' .
"\n" .
' var nwin = window.open("addrbook_popup.php","abookpopup",' .
'"width=670,height=300,resizable=yes,scrollbars=yes");' .
"\n" .
' if((!nwin.opener) && (document.windows != null))' .
"\n" .
' nwin.opener = document.windows;' .
"\n" .
echo
"\n" .
'<form name="compose" action="compose.php" method="post" ' .
'enctype="multipart/form-data"';
echo
addHidden('startMessage', $startMessage);
if ($action ==
'draft') {
if (isset
($delete_draft)) {
echo
addHidden('delete_draft', $delete_draft);
if ($saved_draft ==
'yes') {
echo
'<br /><center><b>'.
_("Draft Saved").
'</center></b>';
if ($mail_sent ==
'yes') {
echo
'<br /><center><b>'.
_("Your Message has been sent.").
'</center></b>';
if ($compose_new_win ==
'1') {
echo
'<table align="center" bgcolor="'.
$color[0].
'" width="100%" border="0">'.
"\n" .
' <tr><td></td>'.
html_tag( 'td', '', 'right' ).
'<input type="button" name="Close" onclick="return self.close()" value="'.
_("Close").
'" /></td></tr>'.
"\n";
echo
'<table align="center" cellspacing="0" border="0">' .
"\n";
if ($location_of_buttons ==
'top') {
/* display select list for identities */
$idents =
getPref($data_dir, $username, 'identities', 0);
$fn =
getPref($data_dir, $username, 'full_name');
$em =
getPref($data_dir, $username, 'email_address');
html_tag( 'td', '', 'right', $color[4], 'width="10%"' ) .
_("From:") .
'</td>' .
"\n" .
html_tag( 'td', '', 'left', $color[4], 'width="90%"' ) .
' <select name="identity">' .
"\n" .
' <option value="default">' .
for ($i =
1; $i <
$idents; $i ++
) {
$fn =
getPref($data_dir, $username, 'full_name' .
$i);
$em =
getPref($data_dir, $username, 'email_address' .
$i);
echo
'<option value="' .
$i .
'"';
if (isset
($identity) &&
$identity ==
$i) {
echo
' selected="selected"';
echo
'</select>' .
"\n" .
html_tag( 'td', '', 'right', $color[4], 'width="10%"' ) .
_("To") .
':</td>' .
"\n" .
html_tag( 'td', '', 'left', $color[4], 'width="90%"' ) .
substr(addInput('send_to', $send_to, 60), 0, -
3).
$onfocus .
' /><br />' .
"\n" .
html_tag( 'td', '', 'right', $color[4] ) .
_("Cc") .
':</td>' .
"\n" .
html_tag( 'td', '', 'left', $color[4] ) .
substr(addInput('send_to_cc', $send_to_cc, 60), 0, -
3).
$onfocus .
' /><br />' .
"\n" .
html_tag( 'td', '', 'right', $color[4] ) .
_("Bcc") .
':</td>' .
"\n" .
html_tag( 'td', '', 'left', $color[4] ) .
substr(addInput('send_to_bcc', $send_to_bcc, 60), 0, -
3).
$onfocus .
' /><br />' .
"\n" .
html_tag( 'td', '', 'right', $color[4] ) .
_("Subject") .
':</td>' .
"\n" .
html_tag( 'td', '', 'left', $color[4] ) .
"\n";
if ($location_of_buttons ==
'between') {
/* why this distinction? */
if ($compose_new_win ==
'1') {
' <td bgcolor="' .
$color[0] .
'" colspan="2" align="center">' .
"\n" .
' <textarea name="body" id="body" rows="' . (int)
$editor_height .
'" cols="' . (int)
$editor_size .
'" wrap="virtual"' .
$onfocus .
'>';
' <td bgcolor="' .
$color[4] .
'" colspan="2">' .
"\n" .
' <textarea name="body" id="body" rows="' . (int)
$editor_height .
'" cols="' . (int)
$editor_size .
'" wrap="virtual"' .
$onfocus .
'>';
if ($use_signature ==
true &&
$newmail ==
true &&
!isset
($from_htmladdr_search)) {
if ($identity ==
'default') {
$signature =
getSig($data_dir, $username, $no);
if ($default_charset ==
'iso-2022-jp') {
echo
"\n\n".
($prefix_sig==
true?
"-- \n":
'').
mb_convert_encoding($signature, 'EUC-JP');
echo
"\n\n".
($prefix_sig==
true?
"-- \n":
'').
decodeHeader($signature,false,false,true);
if ($default_charset ==
'iso-2022-jp') {
echo
"\n\n".
($prefix_sig==
true?
"-- \n":
'').
mb_convert_encoding($signature, 'EUC-JP');
echo
"\n\n".
($prefix_sig==
true?
"-- \n":
'').
decodeHeader($signature,false,false,true);
echo
'</textarea><br />' .
"\n" .
if ($location_of_buttons ==
'bottom') {
html_tag( 'td', '', 'right', '', 'colspan="2"' ) .
"\n" .
' <br /><br />' .
"\n" .
/* This code is for attachments */
if ((bool)
ini_get('file_uploads')) {
/* Calculate the max size for an uploaded file.
* This is advisory for the user because we can't actually prevent
* people to upload too large files. */
/* php.ini vars which influence the max for uploads */
$configvars =
array('post_max_size', 'memory_limit', 'upload_max_filesize');
foreach($configvars as $var) {
/* skip 0 or empty values, and -1 which means 'unlimited' */
' <td colspan="2">' .
"\n" .
' <table width="100%" cellpadding="1" cellspacing="0" align="center"'.
' border="0" bgcolor="'.
$color[9].
'">' .
"\n" .
' <table width="100%" cellpadding="3" cellspacing="0" align="center"'.
html_tag( 'td', '', 'right', '', 'valign="middle"' ) .
_("Attach:") .
'</td>' .
"\n" .
html_tag( 'td', '', 'left', '', 'valign="middle"' ) .
' <input name="attachfile" size="48" type="file" />' .
"\n" .
' <input type="submit" name="attach"' .
' value="' .
_("Add") .
'" />' .
"\n" .
if ($composeMessage->entities) {
foreach ($composeMessage->entities as $key =>
$attachment) {
$attached_file =
$attachment->att_local_name;
if ($attachment->att_local_name ||
$attachment->body_part) {
$attached_filename =
decodeHeader($attachment->mime_header->getParameter('name'));
$type =
$attachment->mime_header->type0.
'/'.
$attachment->mime_header->type1;
$s_a[] =
'<table bgcolor="'.
$color[0].
"</td><td>\n" .
$attached_filename .
'</td><td>-</td><td> ' .
$type .
'</td><td>('.
echo
'<tr>' .
html_tag( 'td', '', 'left', $color[0], 'colspan="2"' ) .
$s .
'</td></tr>';
echo
'<tr><td colspan="2"><input type="submit" name="do_delete" value="' .
_("Delete selected attachments") .
"\" />\n" .
echo
' </table>' .
"\n" .
} // End of file_uploads if-block
/* End of attachment code */
store the complete ComposeMessages array in a hidden input value
so we can restore them in case of a session timeout.
addHidden('composesession', $composesession).
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. */
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.")
echo
'</body></html>' .
"\n";
global $use_javascript_addr_book, $save_as_draft,
$request_mdn, $request_dr,
if ($default_use_priority) {
echo
' ' .
_("Priority") .
'5' =>
_("Low") ), $mailprio, TRUE);
$mdn_user_support=
getPref($data_dir, $username, 'mdn_user_support',$default_use_mdn);
echo
' ' .
_("Receipt") .
': '.
addCheckBox('request_mdn', $request_mdn ==
'1', '1').
_("On Read").
addCheckBox('request_dr', $request_dr ==
'1', '1').
_("On Delivery");
' <input type="submit" name="sigappend" value="' .
_("Signature") .
'" />' .
"\n";
if ($use_javascript_addr_book) {
echo
" <script language=\"JavaScript\"><!--\n document.write(\"".
" <input type=button value=\\\"".
_("Addresses").
"\\\" onclick=\\\"javascript:open_abook();\\\" />\");".
" // --></script><noscript>\n".
' <input type="submit" name="html_addr_search" value="'.
echo
' <input type="submit" name="html_addr_search" value="'.
_("Addresses").
'" />' .
"\n";
echo
' <input type="submit" name ="draft" value="' .
_("Save Draft") .
"\" />\n";
echo
' <input type="submit" name="send" value="'.
_("Send") .
'" />' .
"\n";
* I implemented the $show variable because the error messages
* were getting sent before the page header. So, I check once
* using $show=false, and then when i'm ready to display the error
global $body, $send_to, $send_to_bcc, $subject, $color;
if ($send_to ==
'' &&
$send_to_bcc ==
'') {
} /* function checkInput() */
/* get out of here if no file was attached at all */
$hashed_attachment_dir =
getHashedDir($username, $attachment_dir);
$full_localfilename =
"$hashed_attachment_dir/$localfilename";
$full_localfilename =
"$hashed_attachment_dir/$localfilename";
// FIXME: we SHOULD prefer move_uploaded_file over rename because
// m_u_f works better with restricted PHP installs (safe_mode, open_basedir)
if (!@rename($_FILES['attachfile']['tmp_name'], $full_localfilename)) {
$message =
$compose_messages[$session];
$type =
strtolower($_FILES['attachfile']['type']);
$name =
$_FILES['attachfile']['name'];
$message->initAttachment($type, $name, $full_localfilename);
$compose_messages[$session] =
$message;
/* parse values like 8M and 2k into bytes */
$ini_size =
trim($ini_size);
// if there's some kind of letter at the end of the string we need to multiply.
return ($bytesize * (int)
substr($ini_size, 0, -
1));
* temporary function to make use of the deliver class.
* In the future the responsable backend should be automaticly loaded
* and conf.pl should show a list of available backends.
* The message also should be constructed by the message class.
global $send_to, $send_to_cc, $send_to_bcc, $mailprio, $subject, $body,
$username, $popuser, $usernamedata, $identity, $data_dir,
$domain, $action, $default_move_to_sent, $move_to_sent;
$rfc822_header =
$composeMessage->rfc822_header;
$rfc822_header->to =
$rfc822_header->parseAddress($send_to,true, array(), '', $domain, array(&$abook,'lookup'));
$rfc822_header->cc =
$rfc822_header->parseAddress($send_to_cc,true,array(), '',$domain, array(&$abook,'lookup'));
$rfc822_header->bcc =
$rfc822_header->parseAddress($send_to_bcc,true, array(), '',$domain, array(&$abook,'lookup'));
$rfc822_header->priority =
$mailprio;
$rfc822_header->subject =
$subject;
if (strtolower($default_charset) ==
'iso-2022-jp') {
if (mb_detect_encoding($body) ==
'ASCII') {
$special_encoding =
'8bit';
$body =
mb_convert_encoding($body, 'JIS');
$special_encoding =
'7bit';
$composeMessage->setBody($body);
if (ereg("^([^@%/]+)[@%/](.+)$", $username, $usernamedata)) {
$popuser =
$usernamedata[1];
$domain =
$usernamedata[2];
if (isset
($identity) &&
$identity !=
'default') {
$from_mail =
getPref($data_dir, $username,'email_address' .
$identity);
$full_name =
getPref($data_dir, $username,'full_name' .
$identity);
$reply_to =
getPref($data_dir, $username,'reply_to' .
$identity);
$from_mail =
getPref($data_dir, $username, 'email_address');
$full_name =
getPref($data_dir, $username, 'full_name');
$reply_to =
getPref($data_dir, $username,'reply_to');
$from_mail =
"$popuser@$domain";
$rfc822_header->from =
$rfc822_header->parseAddress($from_mail,true);
$from =
$rfc822_header->from[0];
if (!$from->host) $from->host =
$domain;
if ($full_name_encoded !=
$full_name) {
$from_addr =
$full_name_encoded .
' <'.
$from->mailbox.
'@'.
$from->host.
'>';
$from_addr =
'"'.
$full_name .
'" <'.
$from->mailbox.
'@'.
$from->host.
'>';
$rfc822_header->from =
$rfc822_header->parseAddress($from_addr,true);
$rfc822_header->reply_to =
$rfc822_header->parseAddress($reply_to,true);
if (isset
($request_mdn) &&
$request_mdn) {
$rfc822_header->dnt =
$rfc822_header->parseAddress($from_mail,true);
/* Receipt: On Delivery */
if (isset
($request_dr) &&
$request_dr) {
$rfc822_header->more_headers['Return-Receipt-To'] =
$from_mail;
if (count($composeMessage->entities)) {
$message_body->body_part =
$composeMessage->body_part;
$composeMessage->body_part =
'';
$mime_header->type0 =
'text';
$mime_header->type1 =
'plain';
$mime_header->encoding =
$special_encoding;
$mime_header->encoding =
'8bit';
$mime_header->parameters['charset'] =
$default_charset;
$message_body->mime_header =
$mime_header;
$rfc822_header->encoding =
$special_encoding;
$rfc822_header->encoding =
'8bit';
$content_type->properties['charset']=
$default_charset;
$rfc822_header->content_type =
$content_type;
$composeMessage->rfc822_header =
$rfc822_header;
/* Here you can modify the message structure just before we hand
$hookReturn =
do_hook('compose_send', $composeMessage);
/* Get any changes made by plugins to $composeMessage. */
$composeMessage =
$hookReturn[1];
if (!$useSendmail &&
!$draft) {
require_once(SM_PATH .
'class/deliver/Deliver_SMTP.class.php');
$authPop =
(isset
($pop_before_smtp) &&
$pop_before_smtp) ?
true :
false;
if ($smtp_auth_mech ==
'none' &&
!$authPop) {
global $key, $onetimepad;
$stream =
$deliver->initStream($composeMessage,$domain,0,
$smtpServerAddress, $smtpPort, $user, $pass, $authPop);
require_once(SM_PATH .
'class/deliver/Deliver_SendMail.class.php');
// Check for outdated configuration
if (!isset
($sendmail_args)) {
if ($sendmail_path==
'/var/qmail/bin/qmail-inject') {
$sendmail_args =
'-i -t';
$stream =
$deliver->initStream($composeMessage,$sendmail_path);
require_once(SM_PATH .
'class/deliver/Deliver_IMAP.class.php');
$imap_stream =
sqimap_login($username, $key, $imapServerAddress,
require_once(SM_PATH .
'class/deliver/Deliver_IMAP.class.php');
$length =
$imap_deliver->mail($composeMessage);
$imap_deliver->mail($composeMessage, $imap_stream);
$composeMessage->purgeAttachments();
$msg =
'<br />'.
sprintf(_("Error: Draft folder %s does not exist."),
$length =
$deliver->mail($composeMessage, $stream);
$succes =
$deliver->finalizeStream($stream);
$msg =
$deliver->dlv_msg .
'<br />' .
_("Server replied:") .
' ' .
$deliver->dlv_ret_nr .
' ' .
$deliver->dlv_server_msg;
$move_to_sent =
getPref($data_dir,$username,'move_to_sent');
$imap_stream =
sqimap_login($username, $key, $imapServerAddress, $imapPort, 0);
if (isset
($default_move_to_sent) &&
($default_move_to_sent !=
0)) {
if (isset
($sent_folder) &&
(($sent_folder !=
'') ||
($sent_folder !=
'none'))
if ((isset
($move_to_sent) &&
($move_to_sent !=
0)) ||
(!isset
($move_to_sent))) {
if (($fld_sent &&
$svr_allow_sent &&
!$lcl_allow_sent) ||
($fld_sent &&
$lcl_allow_sent)) {
require_once(SM_PATH .
'class/deliver/Deliver_IMAP.class.php');
$imap_deliver->mail($composeMessage, $imap_stream);
global $passed_id, $mailbox, $action;
$composeMessage->purgeAttachments();
if ($action ==
'reply' ||
$action ==
'reply_all') {
Documentation generated on Sat, 07 Oct 2006 16:30:19 +0300 by phpDocumentor 1.3.0RC6