X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=functions%2Fsmtp.php;h=2034191d5503027b33cec80cab6b4f106f76c21c;hb=1da5bf35ee35f035e42f3d113e1fd6868b350052;hp=2274bc107e80b7169c63f88398d2fe10aed28643;hpb=7831268eb119a34cd370a5e9d7502052f033880b;p=squirrelmail.git diff --git a/functions/smtp.php b/functions/smtp.php index 2274bc10..2034191d 100644 --- a/functions/smtp.php +++ b/functions/smtp.php @@ -5,6 +5,62 @@ ** an smtp server. **/ + function sendMessage($username, $domain, $t, $c, $b, $subject, $body, $version) { + include("../config/config.php"); + + if ($useSendmail==true) { + sendSendmail($username, $domain, $t, $c, $b, $subject, $body, $version); + } else { + sendSMTP($username, $domain, $t, $c, $b, $subject, $body, $version); + } + + } + + // Send mail using the sendmail command + function sendSendmail($username, $domain, $t, $c, $b, $subject, $body, $version) { + include("../config/config.php"); + + // This is pretty much equal to the code in sendSMTP + $to = parseAddrs($t); + $cc = parseAddrs($c); + $bcc = parseAddrs($b); + $from_addr = "$username@$domain"; + $reply_to = getPref($data_dir, $username, "reply_to"); + $from = getPref($data_dir, $username, "full_name"); + + $to_list = getLineOfAddrs($to); + $cc_list = getLineOfAddrs($cc); + $bcc_list = getLineOfAddrs($bcc); + + if ($from == "") + $from = "<$from_addr>"; + else + $from = $from . " <$from_addr>"; + + // open pipe to sendmail + $fp = popen ("$sendmail_path -t -f$from_addr", "w"); + + fputs($fp, "Subject: $subject\n"); // Subject + fputs($fp, "From: $from\n"); // Subject + fputs($fp, "To: $to_list\n"); // Who it's TO + + if ($cc_list) { + fputs($fp, "Cc: $cc_list\n"); // Who the CCs are + } + if ($bcc_list) { + fputs($fp, "Bcc: $bcc_list\n"); // BCCs is removed from header by sendmail + } + fputs($fp, "X-Mailer: SquirrelMail (version $version)\n"); // Identify SquirrelMail + fputs($fp, "MIME-Version: 1.0\n"); + fputs($fp, "Content-Type: text/plain\n"); + if ($reply_to != "") + fputs($fp, "Reply-To: $reply_to\n"); + + fputs($fp, "\n$body\n"); // send the body of the message + + pclose($fp); + } + function smtpReadData($smtpConnection) { $read = fgets($smtpConnection, 1024); $counter = 0; @@ -16,64 +72,185 @@ } } - function sendMessage($smtpServerAddress, $smtpPort, $username, $domain, $t, $c, $b, $subject, $body, $version) { + function sendSMTP($username, $domain, $t, $c, $b, $subject, $body, $version) { include("../config/config.php"); $to = parseAddrs($t); $cc = parseAddrs($c); $bcc = parseAddrs($b); - $body = stripslashes($body); - $from = "$username@$domain"; + $from_addr = "$username@$domain"; + $reply_to = getPref($data_dir, $username, "reply_to"); + $from = getPref($data_dir, $username, "full_name"); + + if ($from == "") + $from = "<$from_addr>"; + else + $from = $from . " <$from_addr>"; - echo ""; $smtpConnection = fsockopen($smtpServerAddress, $smtpPort, $errorNumber, $errorString); if (!$smtpConnection) { echo "Error connecting to SMTP Server.
"; echo "$errorNumber : $errorString
"; exit; - } else { - $tmp = fgets($smtpConnection, 1024); } + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + errorCheck($tmp); $to_list = getLineOfAddrs($to); $cc_list = getLineOfAddrs($cc); /** Lets introduce ourselves */ fputs($smtpConnection, "HELO $domain\n"); + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + errorCheck($tmp); /** Ok, who is sending the message? */ - fputs($smtpConnection, "MAIL FROM:<$from>\n"); + fputs($smtpConnection, "MAIL FROM:<$from_addr>\n"); + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + errorCheck($tmp); /** send who the recipients are */ for ($i = 0; $i < count($to); $i++) { fputs($smtpConnection, "RCPT TO:<$to[$i]>\n"); + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + errorCheck($tmp); } for ($i = 0; $i < count($cc); $i++) { fputs($smtpConnection, "RCPT TO:<$cc[$i]>\n"); + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + errorCheck($tmp); } for ($i = 0; $i < count($bcc); $i++) { fputs($smtpConnection, "RCPT TO:<$bcc[$i]>\n"); + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + errorCheck($tmp); } /** Lets start sending the actual message */ fputs($smtpConnection, "DATA\n"); + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + errorCheck($tmp); fputs($smtpConnection, "Subject: $subject\n"); // Subject - fputs($smtpConnection, "From: <$from>\n"); // Subject - fputs($smtpConnection, "To: <$to_list>\n"); // Who it's TO + fputs($smtpConnection, "From: $from\n"); // Subject + fputs($smtpConnection, "To: $to_list\n"); // Who it's TO if ($cc_list) { - fputs($smtpConnection, "Cc: <$cc_list>\n"); // Who the CCs are + fputs($smtpConnection, "Cc: $cc_list\n"); // Who the CCs are } fputs($smtpConnection, "X-Mailer: SquirrelMail (version $version)\n"); // Identify SquirrelMail - fputs($smtpConnection, "Reply-To: $from\n"); fputs($smtpConnection, "MIME-Version: 1.0\n"); fputs($smtpConnection, "Content-Type: text/plain\n"); + if ($reply_to != "") + fputs($smtpConnection, "Reply-To: $reply_to\n"); fputs($smtpConnection, "$body\n"); // send the body of the message fputs($smtpConnection, ".\n"); // end the DATA part + $tmp = nl2br(htmlspecialchars(fgets($smtpConnection, 1024))); + $num = errorCheck($tmp); + if ($num != 250) { + echo "ERROR
Message not sent!
Reason given: $tmp
"; + } + fputs($smtpConnection, "QUIT\n"); // log off - echo "
"; + + fclose($smtpConnection); + } + + + function errorCheck($line) { + // Status: 0 = fatal + // 5 = ok + + $err_num = substr($line, 0, strpos($line, " ")); + switch ($err_num) { + case 500: $message = "Syntax error; command not recognized"; + $status = 0; + break; + case 501: $message = "Syntax error in parameters or arguments"; + $status = 0; + break; + case 502: $message = "Command not implemented"; + $status = 0; + break; + case 503: $message = "Bad sequence of commands"; + $status = 0; + break; + case 504: $message = "Command parameter not implemented"; + $status = 0; + break; + + + case 211: $message = "System status, or system help reply"; + $status = 5; + break; + case 214: $message = "Help message"; + $status = 5; + break; + + + case 220: $message = "Service ready"; + $status = 5; + break; + case 221: $message = "Service closing transmission channel"; + $status = 5; + break; + case 421: $message = "Service not available, closing chanel"; + $status = 0; + break; + + + case 250: $message = "Requested mail action okay, completed"; + $status = 5; + break; + case 251: $message = "User not local; will forward"; + $status = 5; + break; + case 450: $message = "Requested mail action not taken: mailbox unavailable"; + $status = 0; + break; + case 550: $message = "Requested action not taken: mailbox unavailable"; + $status = 0; + break; + case 451: $message = "Requested action aborted: error in processing"; + $status = 0; + break; + case 551: $message = "User not local; please try forwarding"; + $status = 0; + break; + case 452: $message = "Requested action not taken: insufficient system storage"; + $status = 0; + break; + case 552: $message = "Requested mail action aborted: exceeding storage allocation"; + $status = 0; + break; + case 553: $message = "Requested action not taken: mailbox name not allowed"; + $status = 0; + break; + case 354: $message = "Start mail input; end with ."; + $status = 5; + break; + case 554: $message = "Transaction failed"; + $status = 0; + break; + default: $message = "Unknown response: $line"; + $status = 0; + $error_num = "001"; + break; + } + + if ($status == 0) { + echo ""; + echo ""; + echo "
ERROR

"; + echo "   Error Number: $err_num
"; + echo "         Reason: $message
"; + echo "Server Response: $line
"; + echo "
MAIL NOT SENT"; + echo "
"; + exit; + } + return $err_num; } -?> \ No newline at end of file +?>