X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fsmtp.php;h=a15144f7221017cacd690be45c8bb9ff230b0601;hb=b09153de3515dc00e0022cdeecbcbb822ed5773a;hp=6edb4488ca5edb266a2d947c374a5d0bcf9e2e7b;hpb=d47b2518bd5b1544e3b7577b59f323b29737eb12;p=squirrelmail.git diff --git a/functions/smtp.php b/functions/smtp.php index 6edb4488..a15144f7 100644 --- a/functions/smtp.php +++ b/functions/smtp.php @@ -7,6 +7,18 @@ $smtp_php = true; + // This should most probably go to some initialization... + if (ereg("^([^@%/]+)[@%/](.+)$", $username, $usernamedata)) { + $popuser = $usernamedata[1]; + $domain = $usernamedata[2]; + unset($usernamedata); + } else { + $popuser = $username; + } + // We need domain for smtp + if (!$domain) + $domain = getenv("HOSTNAME"); + // Returns true only if this message is multipart function isMultipart () { global $attachments; @@ -38,7 +50,7 @@ $filetype = "application/octet-stream"; $header = "--".mimeBoundary()."\r\n"; - $header .= "Content-Type: $filetype\r\n"; + $header .= "Content-Type: $filetype;name=\"$remotename\"\r\n"; $header .= "Content-Disposition: attachment; filename=\"$remotename\"\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n\r\n"; fputs ($fp, $header); @@ -77,14 +89,7 @@ static $mimeBoundaryString; if ($mimeBoundaryString == "") { - sq_mt_randomize(); // Initialize the random number generator - // Use all allowed chars besides space. - $Chrs = '\'()+,-./0123456789:=?ABCDEFGHIJKLMNOP' . - 'QRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'; - // Create a LONG boundary to ensure no duplicates - while (strlen($mimeBoundaryString) < 70) { - $mimeBoundaryString .= $Chrs[mt_rand(0, strlen($Chrs))]; - } + $mimeBoundaryString = GenerateRandomString(70, '\'()+,-./:=?_', 7); } return $mimeBoundaryString; @@ -92,6 +97,8 @@ /* Time offset for correct timezone */ function timezone () { + global $invert_time; + $diff_second = date("Z"); if ($invert_time) $diff_second = - $diff_second; @@ -113,7 +120,7 @@ /* Print all the needed RFC822 headers */ function write822Header ($fp, $t, $c, $b, $subject, $more_headers) { global $REMOTE_ADDR, $SERVER_NAME, $REMOTE_PORT; - global $data_dir, $username, $domain, $version, $useSendmail; + global $data_dir, $username, $popuser, $domain, $version, $useSendmail; global $default_charset, $HTTP_VIA, $HTTP_X_FORWARDED_FOR; global $REMOTE_HOST; @@ -128,14 +135,14 @@ $reply_to = getPref($data_dir, $username, "reply_to"); $from = getPref($data_dir, $username, "full_name"); $from_addr = getPref($data_dir, $username, "email_address"); - + if ($from_addr == "") - $from_addr = "$username@$domain"; + $from_addr = $popuser."@".$domain; $to_list = getLineOfAddrs($to); $cc_list = getLineOfAddrs($cc); $bcc_list = getLineOfAddrs($bcc); - + /* Encoding 8-bit characters and making from line */ $subject = sqStripSlashes(encodeHeader($subject)); if ($from == "") @@ -257,12 +264,12 @@ // Send mail using the sendmail command function sendSendmail($t, $c, $b, $subject, $body, $more_headers) { - global $sendmail_path, $username, $domain; + global $sendmail_path, $popuser, $username, $domain; // Build envelope sender address. Make sure it doesn't contain // spaces or other "weird" chars that would allow a user to // exploit the shell/pipe it is used in. - $envelopefrom = "$username@$domain"; + $envelopefrom = "$popuser@$domain"; $envelopefrom = ereg_replace("[[:blank:]]","", $envelopefrom); $envelopefrom = ereg_replace("[[:space:]]","", $envelopefrom); $envelopefrom = ereg_replace("[[:cntrl:]]","", $envelopefrom); @@ -290,7 +297,7 @@ } function sendSMTP($t, $c, $b, $subject, $body, $more_headers) { - global $username, $domain, $version, $smtpServerAddress, $smtpPort, + global $username, $popuser, $domain, $version, $smtpServerAddress, $smtpPort, $data_dir, $color; $to = parseAddrs($t); @@ -298,35 +305,8 @@ $bcc = parseAddrs($b); $from_addr = getPref($data_dir, $username, "email_address"); - - /* - * A patch from Bill Thousand - * - * "I don't know if anyone else needs this or not, but it totally makes squirrelmail usable for us. - * This quick patch checks the username and from address for the domain information. We use - * a virtual domain patch for our imap server that allows multiple domains by using username@domain.com - * as the login username." - */ - if ($from_addr == "") { - if (strstr($username, "@")) { - $from_addr = $username; - $address_pieces = explode("@",$username); - $domain = $address_pieces[1]; - } else { - $from_addr = "$username@$domain"; - } - } else { - // If the From Address is specified, use the domain in the from - // address if it's there. - if (strstr($from_addr, "@")) { - $address_pieces = explode("@", $from_addr); - $domain = $address_pieces[1]; - } - } - /* - * End patch from Bill Thousand - */ - + if (!$from_addr) + $from_addr = "$popuser@$domain"; $smtpConnection = fsockopen($smtpServerAddress, $smtpPort, $errorNumber, $errorString); if (!$smtpConnection) { @@ -523,8 +503,13 @@ } sqimap_mailbox_close($imap_stream); } - - if ($useSendmail==true) { + + // this is to catch all plain \n instances and + // replace them with \r\n. + $body = ereg_replace("\r\n", "\n", $body); + $body = ereg_replace("\n", "\r\n", $body); + + if ($useSendmail) { $length = sendSendmail($t, $c, $b, $subject, $body, $more_headers); } else { $length = sendSMTP($t, $c, $b, $subject, $body, $more_headers); @@ -533,11 +518,12 @@ if (sqimap_mailbox_exists ($imap_stream, $sent_folder)) { sqimap_append ($imap_stream, $sent_folder, $length); write822Header ($imap_stream, $t, $c, $b, $subject, $more_headers); - writeBody ($imap_stream, $body); + writeBody ($imap_stream, $body); sqimap_append_done ($imap_stream); - } - sqimap_logout($imap_stream); + } + sqimap_logout($imap_stream); // Delete the files uploaded for attaching (if any). deleteAttachments(); } + ?>