* Functions for message compositon: writing a message, attaching files etc.
*
* @author Thijs Kinkhorst <kink at squirrelmail.org>
- * @copyright © 1999-2007 The SquirrelMail Project Team
+ * @copyright 1999-2011 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id$
* @package squirrelmail
*/
+/**
+ * Get a new file to write an attachment to.
+ * This function makes sure it doesn't overwrite other attachments,
+ * preventing collisions and race conditions.
+ *
+ * @return filename of the tempfile only (not full path)
+ * @since 1.5.2
+ */
+function sq_get_attach_tempfile()
+{
+ global $username, $attachment_dir;
+
+ $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
+
+ // using PHP >= 4.3.2 we can be truly atomic here
+ $filemods = check_php_version ( 4,3,2 ) ? 'x' : 'w';
+
+ // give up after 1000 tries
+ $TMP_MAX = 1000;
+ for ($try=0; $try<$TMP_MAX; ++$try) {
+
+ $localfilename = GenerateRandomString(32, '', 7);
+ $full_localfilename = "$hashed_attachment_dir/$localfilename";
+
+ // filename collision. try again
+ if ( file_exists($full_localfilename) ) {
+ continue;
+ }
+
+ // try to open for (binary) writing
+ $fp = @fopen( $full_localfilename, $filemods);
+
+ if ( $fp !== FALSE ) {
+ // success! make sure it's not readable, close and return filename
+ chmod($full_localfilename, 0600);
+ fclose($fp);
+ return $localfilename;
+ }
+ }
+
+ // we tried 1000 times but didn't succeed.
+ error_box( _("Could not open temporary file to store attachment. Contact your system administrator to resolve this issue.") );
+ return FALSE;
+}
+
+
+/**
+ * Send a simple mail message using SquirrelMail's API.
+ *
+ * Until SquirrelMail is sufficiently redesigned, this
+ * function is a stand-in for a simple mail delivery
+ * call. Currently, it only sends plaintext messages
+ * (unless the caller uses the $message parameter).
+ *
+ * @param string $to The destination recipient.
+ * @param string $subject The message subject.
+ * @param string $body The message body.
+ * @param string $from The sender.
+ * @param string $cc The destination carbon-copy recipient.
+ * (OPTIONAL; default no Cc:)
+ * @param string $bcc The destination blind carbon-copy recipient.
+ * (OPTIONAL; default no Bcc:)
+ * @param object $message If the caller wants to construct a more
+ * complicated message themselves and pass
+ * it here, this function will take care
+ * of the rest - handing it over to SMTP
+ * or Sendmail. If this parameter is non-
+ * empty, all other parameters are ignored.
+ * (OPTIONAL: default is empty)
+ *
+ * @return array A two-element array, the first element being a
+ * boolean value indicating if the message was successfully
+ * sent or not, and the second element being the message's
+ * assigned Message-ID, if available (only available as of
+ * SquirrelMail 1.4.14 and 1.5.2)
+ *
+ */
+function sq_send_mail($to, $subject, $body, $from, $cc='', $bcc='', $message='')
+{
+
+ require_once(SM_PATH . 'functions/mime.php');
+ require_once(SM_PATH . 'class/mime.class.php');
+
+ if (empty($message))
+ {
+ $message = new Message();
+ $header = new Rfc822Header();
+
+ $message->setBody($body);
+ $content_type = new ContentType('text/plain');
+ global $special_encoding, $default_charset;
+ if ($special_encoding)
+ $rfc822_header->encoding = $special_encoding;
+ else
+ $rfc822_header->encoding = '8bit';
+ if ($default_charset)
+ $content_type->properties['charset']=$default_charset;
+ $header->content_type = $content_type;
+
+ $header->parseField('To', $to);
+ $header->parseField('Cc', $cc);
+ $header->parseField('Bcc', $bcc);
+ $header->parseField('From', $from);
+ $header->parseField('Subject', $subject);
+ $message->rfc822_header = $header;
+ }
+//sm_print_r($message);exit;
+
+
+ global $useSendmail;
+
+
+ // ripped from src/compose.php - based on both 1.5.2 and 1.4.14
+ //
+ if (!$useSendmail) {
+ require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
+ $deliver = new Deliver_SMTP();
+ global $smtpServerAddress, $smtpPort, $pop_before_smtp,
+ $domain, $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;
+ $user = '';
+ $pass = '';
+ get_smtp_user($user, $pass);
+ $stream = $deliver->initStream($message,$domain,0,
+ $smtpServerAddress, $smtpPort, $user, $pass, $authPop, $pop_before_smtp_host);
+ } else {
+ require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
+ global $sendmail_path, $sendmail_args;
+ // Check for outdated configuration
+ if (!isset($sendmail_args)) {
+ if ($sendmail_path=='/var/qmail/bin/qmail-inject') {
+ $sendmail_args = '';
+ } else {
+ $sendmail_args = '-i -t';
+ }
+ }
+ $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
+ $stream = $deliver->initStream($message,$sendmail_path);
+ }
+
+
+ $success = false;
+ $message_id = '';
+ if ($stream) {
+ $deliver->mail($message, $stream);
+ if (!empty($message->rfc822_header->message_id)) {
+ $message_id = $message->rfc822_header->message_id;
+ }
+
+ $success = $deliver->finalizeStream($stream);
+ }
+
+ return array($success, $message_id);
+
+}
+
+