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> |
1977ab55 |
9 | * @copyright 1999-2010 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 | */ |
24 | function 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) |
85 | * |
86 | * @return array A two-element array, the first element being a |
87 | * boolean value indicating if the message was successfully |
88 | * sent or not, and the second element being the message's |
89 | * assigned Message-ID, if available (only available as of |
90 | * SquirrelMail 1.4.14 and 1.5.2) |
91 | * |
92 | */ |
93 | function sq_send_mail($to, $subject, $body, $from, $cc='', $bcc='', $message='') |
94 | { |
95 | |
b4df37a5 |
96 | require_once(SM_PATH . 'functions/mime.php'); |
69894c56 |
97 | require_once(SM_PATH . 'class/mime.class.php'); |
534f3930 |
98 | |
70a49760 |
99 | if (empty($message)) |
100 | { |
101 | $message = new Message(); |
102 | $header = new Rfc822Header(); |
103 | |
104 | $message->setBody($body); |
105 | $content_type = new ContentType('text/plain'); |
106 | global $special_encoding, $default_charset; |
107 | if ($special_encoding) |
108 | $rfc822_header->encoding = $special_encoding; |
109 | else |
110 | $rfc822_header->encoding = '8bit'; |
111 | if ($default_charset) |
112 | $content_type->properties['charset']=$default_charset; |
113 | $header->content_type = $content_type; |
114 | |
115 | $header->parseField('To', $to); |
116 | $header->parseField('Cc', $cc); |
117 | $header->parseField('Bcc', $bcc); |
118 | $header->parseField('From', $from); |
119 | $header->parseField('Subject', $subject); |
120 | $message->rfc822_header = $header; |
121 | } |
122 | //sm_print_r($message);exit; |
123 | |
124 | |
125 | global $useSendmail; |
126 | |
127 | |
128 | // ripped from src/compose.php - based on both 1.5.2 and 1.4.14 |
129 | // |
130 | if (!$useSendmail) { |
131 | require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php'); |
132 | $deliver = new Deliver_SMTP(); |
783e926e |
133 | global $smtpServerAddress, $smtpPort, $pop_before_smtp, |
134 | $domain, $pop_before_smtp_host; |
70a49760 |
135 | |
136 | $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false; |
783e926e |
137 | if (empty($pop_before_smtp_host)) $pop_before_smtp_host = $smtpServerAddress; |
70a49760 |
138 | $user = ''; |
139 | $pass = ''; |
140 | get_smtp_user($user, $pass); |
141 | $stream = $deliver->initStream($message,$domain,0, |
783e926e |
142 | $smtpServerAddress, $smtpPort, $user, $pass, $authPop, $pop_before_smtp_host); |
70a49760 |
143 | } else { |
144 | require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php'); |
145 | global $sendmail_path, $sendmail_args; |
146 | // Check for outdated configuration |
147 | if (!isset($sendmail_args)) { |
148 | if ($sendmail_path=='/var/qmail/bin/qmail-inject') { |
149 | $sendmail_args = ''; |
150 | } else { |
151 | $sendmail_args = '-i -t'; |
152 | } |
153 | } |
154 | $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args)); |
155 | $stream = $deliver->initStream($message,$sendmail_path); |
156 | } |
157 | |
158 | |
159 | $success = false; |
160 | $message_id = ''; |
161 | if ($stream) { |
162 | $deliver->mail($message, $stream); |
163 | if (!empty($message->rfc822_header->message_id)) { |
164 | $message_id = $message->rfc822_header->message_id; |
165 | } |
166 | |
167 | $success = $deliver->finalizeStream($stream); |
168 | } |
169 | |
170 | return array($success, $message_id); |
171 | |
172 | } |
173 | |
174 | |