The Community Forums

Interact with an entire community of cPanel & WHM users!
  1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Mail Script Issue - Relay Host?

Discussion in 'E-mail Discussions' started by Arhineus, Jun 11, 2008.

  1. Arhineus

    Arhineus Well-Known Member

    Joined:
    Nov 1, 2005
    Messages:
    58
    Likes Received:
    0
    Trophy Points:
    6
    I've got a mail script my friend set me up with, but it's not working and I'm going bonkers trying to get it to work.

    When the file "orderform.php" is filled out and submitted, it calls the files "submit.php"

    Code:
    <?php
    require("config.php");
    ##########################################
    $mailbody =$body;// $body mail content
    $mailtype = "HTML";//mail format£¨HTML/TXT£©
    ##########################################
    $to=$_POST[to];
    $subject=$_POST[subject];
    $products=array(A Bunch of Stuff);
    $content="";
    $eheader="<html><body><TABLE cellSpacing=1 cellPadding=1 width='80%' border=0> <THEAD> <TR>
        <TD >PRODUCTS</TD>
        <TD>Quantity:</TD>    
        <TD>Total $:</TD></TR></THEAD>";
    for ( $i = 1 ; $i <= 30 ; $i ++) { 
       if($_POST["tt".$i]!='')
    	  $content=$content."<tr><td>".$products[$i]."</td><td>".$_POST["t".$i]."</td><td>".round($_POST["tt".$i],2)."</td><tr>";
      } 
     $content=$content."<tr><td></td><td><Strong>Subtotal</Strong></td><td>".round($_POST["Subtotal"],2)."</td></tr>";
    $content=$content."<tr><td></td><td><Strong>PST</Strong></td><td>".round($_POST["PST"],2)."</td></tr>";
    $content=$content."<tr><td></td><td><Strong>GST</Strong></td><td>".round($_POST["GST"],2)."</td></tr>";
    $content=$content."<tr><td></td><td><Strong>GrandTotal</Strong></td><td>".round($_POST["GrandTotal"],2)."</td></tr>";
    $contact="<table><tr><td>Company:</td><td>".$_POST["Company"]."</td></tr><tr><td>Contact Name:</td><td>".$_POST["ContactName"];
     $contact=$contact."</td></tr><tr><td>Account Number:</td><td>".$_POST["AccountNumber"]."</td></tr><tr><td>Address:</td><td>";
     $contact=$contact.$_POST["Address"]."</td></tr><tr><td>Email:</td><td>".$_POST["Email"]."</td></tr><tr><td>PhoneNumber:</td><td>";
     $contact=$contact.$_POST["PhoneNumber"]."</td></tr><tr><td>FaxNumber:</td><td>".$_POST["FaxNumber"]."</td></tr><tr><td>ShipTo:</td><td>";
     $contact=$contact.$_POST["ShipTo"]."</td></tr><tr><td>Day:</td><td>".$_POST["Day"]."</td></tr><tr><td>Time:</td><td>".$_POST["time"]."</td></tr></table>";
    
    $ender="</table>".$contact."</body></html>";
    $mailbody=$eheader.$content.$ender;
    
    ######
    
    
    
    $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);
    
    $smtp->debug = true;
    
    $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);
    
    ?>
    The contents of "config.php" are as follows.

    Code:
    <?php
    
    require("smtp.php");
    ##########################################
    
    $smtpserver = "mail.domain.com";//SMTP server addrss
    
    $smtpserverport = 25;//SMTP server port
    
    $smtpusermail = "user@domain.com";//the email of SMTP server
    
    $smtpemailto = "receiver@domain.com";// received email
    
    $smtpuser = "user@domain.com";//account of SMTP server
    
    $smtppass = "password";//password for the account of smtp server
    
    $mailsubject ="order form" ;//mail subject 
    
    ?>
    The contents of the required file "smtp.php" are as follows:

    Code:
    <?php class smtp
    {
    
    /* Public Variables */
    
    var $smtp_port;
    
    var $time_out;
    
    var $host_name;
    
    var $log_file;
    
    var $relay_host;
    
    var $debug;
    
    var $auth;
    
    var $user;
    
    var $pass;
    
    /* Private Variables */ 
    var $sock;
    
    /* Constractor */
    
    function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)
    
    {
    
    $this->debug = FALSE;
    
    $this->smtp_port = $smtp_port;
    
    $this->relay_host = $relay_host;
    
    $this->time_out = 30; //is used in fsockopen() 
    #
    
    $this->auth = $auth;//auth
    
    $this->user = $user;
    
    $this->pass = $pass;
    
    #
    
    $this->host_name = "localhost"; //is used in HELO command 
    $this->log_file = "";
    
    $this->sock = FALSE;
    
    }
    
    /* Main Function */
    
    function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = "", $additional_headers = "")
    
    {
    
    $mail_from = $this->get_address($this->strip_comment($from));
    
    $body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body);
    
    $header .= "MIME-Version:1.0\r\n";
    
    if($mailtype=="HTML"){
    
    $header .= "Content-Type:text/html\r\n";
    
    }
    
    $header .= "To: ".$to."\r\n";
    
    if ($cc != "") {
    
    $header .= "Cc: ".$cc."\r\n";
    
    }
    
    $header .= "From: $from<".$from.">\r\n";
    
    $header .= "Subject: ".$subject."\r\n";
    
    $header .= $additional_headers;
    
    $header .= "Date: ".date("r")."\r\n";
    
    $header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n";
    
    list($msec, $sec) = explode(" ", microtime());
    
    $header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n";
    
    $TO = explode(",", $this->strip_comment($to));
    
    if ($cc != "") {
    
    $TO = array_merge($TO, explode(",", $this->strip_comment($cc)));
    
    }
    
    if ($bcc != "") {
    
    $TO = array_merge($TO, explode(",", $this->strip_comment($bcc)));
    
    }
    
    $sent = TRUE;
    
    foreach ($TO as $rcpt_to) {
    
    $rcpt_to = $this->get_address($rcpt_to);
    
    if (!$this->smtp_sockopen($rcpt_to)) {
    
    $this->log_write("Error: Cannot send email to ".$rcpt_to."\n");
    
    $sent = FALSE;
    
    continue;
    
    }
    
    if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {
    
    $this->log_write("E-mail has been sent to <".$rcpt_to.">\n");
    
    } else {
    
    $this->log_write("Error: Cannot send email to <".$rcpt_to.">\n");
    
    $sent = FALSE;
    
    }
    
    fclose($this->sock);
    
    $this->log_write("Disconnected from remote host\n");
    
    }
    
    return $sent;
    
    }
    
    
    
    /* Private Functions */
    
    
    
    function smtp_send($helo, $from, $to, $header, $body = "")
    
    {
    
    if (!$this->smtp_putcmd("HELO", $helo)) {
    
    return $this->smtp_error("sending HELO command");
    
    }
    
    #auth
    
    if($this->auth){
    
    if (!$this->smtp_putcmd("AUTH LOGIN", base64_encode($this->user))) {
    
    return $this->smtp_error("sending HELO command");
    
    
    }
    
    if (!$this->smtp_putcmd("", base64_encode($this->pass))) {
    
    return $this->smtp_error("sending HELO command");
    
    }
    
    }
    
    #
    
    if (!$this->smtp_putcmd("MAIL", "FROM:<".$from.">")) {
    
    return $this->smtp_error("sending MAIL FROM command");
    
    }
    
    if (!$this->smtp_putcmd("RCPT", "TO:<".$to.">")) {
    
    return $this->smtp_error("sending RCPT TO command");
    
    }
    
    if (!$this->smtp_putcmd("DATA")) {
    
    return $this->smtp_error("sending DATA command");
    
    }
    
    if (!$this->smtp_message($header, $body)) {
    
    return $this->smtp_error("sending message");
    
    }
    
    if (!$this->smtp_eom()) {
    
    return $this->smtp_error("sending <CR><LF>.<CR><LF> [EOM]");
    
    }
    
    if (!$this->smtp_putcmd("QUIT")) {
    
    return $this->smtp_error("sending QUIT command");
    
    }
    
    return TRUE;
    
    }
    
    function smtp_sockopen($address)
    
    {
    
    if ($this->relay_host == "") {
    
    return $this->smtp_sockopen_mx($address);
    
    } else {
    
    return $this->smtp_sockopen_relay();
    
    }
    
    }
    
    function smtp_sockopen_relay()
    
    {
    
    $this->log_write("Trying to ".$this->relay_host.":".$this->smtp_port."\n");
    
    $this->sock = @fsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);
    
    if (!($this->sock && $this->smtp_ok())) {
    
    $this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n");
    
    $this->log_write("Error: ".$errstr." (".$errno.")\n");
    
    return FALSE;
    
    }
    
    $this->log_write("Connected to relay host ".$this->relay_host."\n");
    
    return TRUE;;
    
    }
    
    
    
    function smtp_sockopen_mx($address)
    
    {
    
    $domain = ereg_replace("^.+@([^@]+)$", "\1", $address);
    
    if (!@getmxrr($domain, $MXHOSTS)) {
    
    $this->log_write("Error: Cannot resolve MX \"".$domain."\"\n");
    
    return FALSE;
    
    }
    
    foreach ($MXHOSTS as $host) {
    
    $this->log_write("Trying to ".$host.":".$this->smtp_port."\n");
    
    $this->sock = @fsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);
    
    if (!($this->sock && $this->smtp_ok())) {
    
    $this->log_write("Warning: Cannot connect to mx host ".$host."\n");
    
    $this->log_write("Error: ".$errstr." (".$errno.")\n");
    
    continue;
    
    }
    
    $this->log_write("Connected to mx host ".$host."\n");
    
    return TRUE;
    
    }
    
    $this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n");
    
    return FALSE;
    
    }
    
    
    
    function smtp_message($header, $body)
    
    {
    
    fputs($this->sock, $header."\r\n".$body);
    
    $this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> "));
    
    
    
    return TRUE;
    
    }
    
    
    
    function smtp_eom()
    
    {
    
    fputs($this->sock, "\r\n.\r\n");
    
    $this->smtp_debug(". [EOM]\n");
    
    
    
    return $this->smtp_ok();
    
    }
    
    
    
    function smtp_ok()
    
    {
    
    $response = str_replace("\r\n", "", fgets($this->sock, 512));
    
    $this->smtp_debug($response."\n");
    
    
    
    if (!ereg("^[23]", $response)) {
    
    fputs($this->sock, "QUIT\r\n");
    
    fgets($this->sock, 512);
    
    $this->log_write("Error: Remote host returned \"".$response."\"\n");
    
    return FALSE;
    
    }
    
    return TRUE;
    
    }
    
    function smtp_putcmd($cmd, $arg = "")
    
    {
    
    if ($arg != "") {
    
    if($cmd=="") $cmd = $arg;
    
    else $cmd = $cmd." ".$arg;
    
    }
    
    fputs($this->sock, $cmd."\r\n");
    
    $this->smtp_debug("> ".$cmd."\n");
    
    return $this->smtp_ok();
    
    }
    
    function smtp_error($string)
    
    {
    
    $this->log_write("Error: Error occurred while ".$string.".\n");
    
    return FALSE;
    
    }
    
    function log_write($message)
    
    {
    
    $this->smtp_debug($message);
    
    if ($this->log_file == "") {
    
    return TRUE;
    
    }
    
    $message = date("M d H:i:s ").get_current_user()."[".getmypid()."]: ".$message;
    
    if (!@file_exists($this->log_file) || !($fp = @fopen($this->log_file, "a"))) {
    
    $this->smtp_debug("Warning: Cannot open log file \"".$this->log_file."\"\n");
    
    return FALSE;;
    
    }
    
    flock($fp, LOCK_EX);
    
    fputs($fp, $message);
    
    fclose($fp);
    
    
    return TRUE;
    
    }
    
    
    function strip_comment($address)
    
    {
    
    $comment = "\([^()]*\)";
    
    while (ereg($comment, $address)) {
    
    $address = ereg_replace($comment, "", $address);
    
    }
    
    
    return $address;
    
    }
    
    
    function get_address($address)
    
    {
    
    $address = ereg_replace("([ \t\r\n])+", "", $address);
    
    $address = ereg_replace("^.*<(.+)>.*$", "\1", $address);
    
    return $address;
    
    }
    
    function smtp_debug($message)
    
    {
    
    if ($this->debug) {
    
    echo $message;
    
    }
    
    }
    
    }
    
    ?>
     
  2. Arhineus

    Arhineus Well-Known Member

    Joined:
    Nov 1, 2005
    Messages:
    58
    Likes Received:
    0
    Trophy Points:
    6
    Sorry for the double post, but I was cut off with the character limit.

    The problem, is that when the form is submitted, it's kicking back an error message as follows.

    Code:
    Trying to mail.domain.com:25 220-servername.thehost.com ESMTP Exim 4.68 #1 Wed, 11 Jun 2008 20:31:35 -0700 Connected to relay host mail.domain.com > HELO localhost 220-We do not authorize the use of this system to transport unsolicited, > AUTH LOGIN b3JkZXI= 220 and/or bulk e-mail. > MjQ5MA== 250 servername.thehost.com Hello servername.thehost.com [serverIP] > MAIL FROM: 503 AUTH command used when not advertised Error: Remote host returned "503 AUTH command used when not advertised" Error: Error occurred while sending MAIL FROM command. Error: Cannot send email to Disconnected from remote host
    I'm not sure why this message is coming up. If I understand the script properly, it should be connecting to the mail server and authenticating as the SMTP user, and sending the message as that user, but obviously it's not doing so.

    I'm hoping someone can steer me in the right direction.
     
  3. cPanelDavidG

    cPanelDavidG Technical Product Specialist

    Joined:
    Nov 29, 2006
    Messages:
    11,279
    Likes Received:
    8
    Trophy Points:
    38
    Location:
    Houston, TX
    cPanel Access Level:
    Root Administrator
    This is probably triggering a measure that prevents a cPanel/WHM server from being used to relay/send spam.

    You should use the PHP mail() function to send mail.
     
Loading...

Share This Page