Even better HTML email content style containment
[squirrelmail.git] / functions / compose.php
CommitLineData
8ec806b8 1<?php
2
3/**
4 * compose.php
5 *
6 * Functions for message compositon: writing a message, attaching files etc.
7 *
8 * @author Thijs Kinkhorst <kink at squirrelmail.org>
8ed19238 9 * @copyright 1999-2019 The SquirrelMail Project Team
8ec806b8 10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
11 * @version $Id$
12 * @package squirrelmail
13 */
14
15
628bce99 16/**
17 * Get a new file to write an attachment to.
18 * This function makes sure it doesn't overwrite other attachments,
19 * preventing collisions and race conditions.
20 *
1f270d3c 21 * @return filename of the tempfile only (not full path)
628bce99 22 * @since 1.5.2
23 */
24function sq_get_attach_tempfile()
25{
26 global $username, $attachment_dir;
27
28 $hashed_attachment_dir = getHashedDir($username, $attachment_dir);
29
30 // using PHP >= 4.3.2 we can be truly atomic here
31 $filemods = check_php_version ( 4,3,2 ) ? 'x' : 'w';
32
33 // give up after 1000 tries
34 $TMP_MAX = 1000;
35 for ($try=0; $try<$TMP_MAX; ++$try) {
36
37 $localfilename = GenerateRandomString(32, '', 7);
38 $full_localfilename = "$hashed_attachment_dir/$localfilename";
39
40 // filename collision. try again
41 if ( file_exists($full_localfilename) ) {
42 continue;
43 }
44
45 // try to open for (binary) writing
46 $fp = @fopen( $full_localfilename, $filemods);
47
48 if ( $fp !== FALSE ) {
49 // success! make sure it's not readable, close and return filename
50 chmod($full_localfilename, 0600);
51 fclose($fp);
1f270d3c 52 return $localfilename;
628bce99 53 }
54 }
55
56 // we tried 1000 times but didn't succeed.
57 error_box( _("Could not open temporary file to store attachment. Contact your system administrator to resolve this issue.") );
58 return FALSE;
59}
60
61
70a49760 62/**
63 * Send a simple mail message using SquirrelMail's API.
64 *
65 * Until SquirrelMail is sufficiently redesigned, this
66 * function is a stand-in for a simple mail delivery
67 * call. Currently, it only sends plaintext messages
68 * (unless the caller uses the $message parameter).
69 *
70 * @param string $to The destination recipient.
71 * @param string $subject The message subject.
72 * @param string $body The message body.
73 * @param string $from The sender.
74 * @param string $cc The destination carbon-copy recipient.
75 * (OPTIONAL; default no Cc:)
76 * @param string $bcc The destination blind carbon-copy recipient.
77 * (OPTIONAL; default no Bcc:)
78 * @param object $message If the caller wants to construct a more
79 * complicated message themselves and pass
80 * it here, this function will take care
81 * of the rest - handing it over to SMTP
82 * or Sendmail. If this parameter is non-
83 * empty, all other parameters are ignored.
84 * (OPTIONAL: default is empty)
4619a414 85 * @param boolean $only_build_message_object When TRUE, only builds the
86 * message object that it
87 * intends to send and returns
88 * it (returned success code
89 * will be -1 and message ID
90 * emtpy) (OPTIONAL; default
91 * is FALSE)
70a49760 92 *
59927db3 93 * @return array A three-element array, the first element being a
70a49760 94 * boolean value indicating if the message was successfully
59927db3 95 * sent or not, the second element being the message's
70a49760 96 * assigned Message-ID, if available (only available as of
59927db3 97 * SquirrelMail 1.4.14 and 1.5.2), and the third element
98 * being the message object itself.
4619a414 99 * If $only_build_message_object is TRUE, only the third
100 * element is useful; first two should be ignored - the
101 * message is never sent in this case.
70a49760 102 *
103 */
4619a414 104function sq_send_mail($to, $subject, $body, $from, $cc='', $bcc='',
105 $message='', $only_build_message_object=FALSE)
70a49760 106{
107
b4df37a5 108 require_once(SM_PATH . 'functions/mime.php');
69894c56 109 require_once(SM_PATH . 'class/mime.class.php');
534f3930 110
70a49760 111 if (empty($message))
112 {
113 $message = new Message();
114 $header = new Rfc822Header();
115
116 $message->setBody($body);
117 $content_type = new ContentType('text/plain');
118 global $special_encoding, $default_charset;
119 if ($special_encoding)
68e26510 120 $header->encoding = $special_encoding;
70a49760 121 else
68e26510 122 $header->encoding = '8bit';
70a49760 123 if ($default_charset)
124 $content_type->properties['charset']=$default_charset;
125 $header->content_type = $content_type;
126
127 $header->parseField('To', $to);
128 $header->parseField('Cc', $cc);
129 $header->parseField('Bcc', $bcc);
130 $header->parseField('From', $from);
131 $header->parseField('Subject', $subject);
132 $message->rfc822_header = $header;
133 }
134//sm_print_r($message);exit;
135
136
4619a414 137 if ($only_build_message_object)
138 return array(-1, '', $message);
139
140
70a49760 141 global $useSendmail;
142
143
144 // ripped from src/compose.php - based on both 1.5.2 and 1.4.14
145 //
146 if (!$useSendmail) {
147 require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
148 $deliver = new Deliver_SMTP();
783e926e 149 global $smtpServerAddress, $smtpPort, $pop_before_smtp,
b65a57ea 150 $domain, $pop_before_smtp_host, $smtp_stream_options;
70a49760 151
152 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
783e926e 153 if (empty($pop_before_smtp_host)) $pop_before_smtp_host = $smtpServerAddress;
70a49760 154 $user = '';
155 $pass = '';
156 get_smtp_user($user, $pass);
157 $stream = $deliver->initStream($message,$domain,0,
b65a57ea 158 $smtpServerAddress, $smtpPort, $user, $pass, $authPop, $pop_before_smtp_host, $smtp_stream_options);
70a49760 159 } else {
160 require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
161 global $sendmail_path, $sendmail_args;
162 // Check for outdated configuration
163 if (!isset($sendmail_args)) {
164 if ($sendmail_path=='/var/qmail/bin/qmail-inject') {
165 $sendmail_args = '';
166 } else {
167 $sendmail_args = '-i -t';
168 }
169 }
170 $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
171 $stream = $deliver->initStream($message,$sendmail_path);
172 }
173
174
175 $success = false;
176 $message_id = '';
177 if ($stream) {
178 $deliver->mail($message, $stream);
179 if (!empty($message->rfc822_header->message_id)) {
180 $message_id = $message->rfc822_header->message_id;
181 }
182
183 $success = $deliver->finalizeStream($stream);
184 }
185
59927db3 186 return array($success, $message_id, $message);
70a49760 187
188}
189
190