Jump to content

Archived

This topic is now archived and is closed to further replies.

srujana

SMTP script not working

Recommended Posts

Hai all,
i want a feedback form in my site and i tried with mail() function.But my hosting service doesnt provide me. And he suggested to do it in any other way like smtp.

I tried with many scripts which are online.But couldnt succeed.I took Professional PHP4 book from my library and tried with the code which is there in it.
It is not sending email .. and it even shows that there is no error.
I used 3 files.I am pasting them here.and the o/p i got.
I dont know where i am going wrong.Please help me:(

This is my_mail_class.php
[code]<?php
//my_mail_class.php

class My_Mail
{
var $to='';
var $from='';
var $reply_to='';
var $cc='';
var $bcc='';
var $subject='';
var $body='';

var $validate_email=true;
var $rigorous_email_check=false;

var $allow_empty_subject=false;
var $allow_empty_body=false;

var $headers = array();

var $ERROR_MSG;
var $ERR_EMPTY_MAIL_TO="Empty TO Field!";
var $ERR_EMPTY_SUBJECT="Empty SUBJECT Field!";
var $ERR_EMPTY_BODY="Empty BODY Field!";

var $ERR_SEND_MAIL_FAILURE="An Error Occured While Attempting To Send EMAIL!";
var $ERR_TO_FIELD_INVALID="TO Field Contains Invalid Email Address!";

var $ERR_CC_FIELD_INVALID="CC Field Contains Invalid Email Address!";
var $ERR_BCC_FIELD_INVALID="BCC Field Contains Invalid Email Address!";
var $STR_NO_ERROR="No error has occured yet";


function CheckFields()
{
if(empty($this->to))
{
$this->ERROR_MSG=$this->ERR_EMPTY_MAIL_TO;
return false;
}

if(!$this->allow_empty_subject && empty($this->subject))
{
$this->ERROR_MSG=$this->ERR_EMPTY_SUBJECT;
return false;
}

if(!$this->allow_empty_body && empty($this->body))
{
$this->ERROR_MSG=$this->ERR_EMPTY_BODY;
return false;
}

$this->to=ereg_replace(";",",",$this->to);
$this->cc=ereg_replace(";",",",$this->cc);
$this->bcc=ereg_replace(";",",",$this->bcc);

if(!empty($this->from))
$this->headers[]="From: $this->from";
if(!empty($this->reply_to))
$this->headers[]="Reply-To: $this->reply_to";

//check email addresses if specified so.
if($this->validate_email)
{
$to_emails=explode(",",$this->to);
if(!empty($this->cc))
$cc_emails=explode(",",$this->cc);
if(!empty($this->bcc))
$bcc_emails=explode(",",$this->bcc);

//use MX records to further check email addresses.
if($this->rigorous_email_check)
{

if(!$this->rigorousEmailCheck($to_emails))
{
$this->ERROR_MSG=$this->ERR_TO_FIELD_INVALID;
return false;
}
else if(is_array($cc_emails) && !$this->rigorousEmailCheck($cc_emails))
{
$this->ERROR_MSG=$this->ERR_CC_FIELD_INVALID;
return false;
}
else if(is_array($bcc_emails) && !$this->rigorousEmailCheck($bcc_emails))
{
$this->ERROR_MSG=$this->ERR_BCC_FIELD_INVALID;
return false;
}
}
else
{
if(!$this->email_check($to_emails))
{
$this->ERROR_MSG=$this->ERR_TO_FIELD_INVALID;
return false;
}
else if(is_array($cc_emails) && !$this->email_check($cc_emails))
{
$this->ERROR_MSG=$this->ERR_CC_FIELD_INVALID;
return false;
}
else if(is_array($bcc_emails) && !$this->email_check($bcc_emails))
{
$this->ERROR_MSG=$this->ERR_BCC_FIELD_INVALID;
return false;
}
}
}
return false;
}




function emailcheck($emails)
{
foreach($emails as $email)
{
if(eregi("<(.+)>",$email,$match))
$email=$match[1];
if(!eregi("^[_\-\.0-9a-z]+@([0-9a-z][_0-9a-z\.]+)\.([a-z]{2,4}$)",$email))
return false;
}
return true;
}

function rigorousEmailCheck($emails)
{
if(!$this->emailCheck($emails))
return false;
foreach ($emails as $email)
{
list($user,$domain)=split("@",$email,2);
if(checkdnsrr($domain,"ANY"))
return true;
else
{
return false;
}
}
}
function viewMsg()
{
if(!$this->checkFields())
return false;

$this->headers=array();
$this->buildHeaders();

$this->headers[]="From: $this->from";
$this->headers[]="To: $this->to";
$this->headers[]="Subject: $this->subject";

$msg= implode("\r\n", $this->headers);
$msg.="\r\n\r\n";
$msg.=$this->body;

return $msg;
}

function send()
{
if(!$this->checkFields())
return true;

$this->buildHeaders();
if(mail($this->to,stripslashes(trim($this->sunject)),stripslashes($this->body),implode("\r\n",$this->headers)))
return true;
else
{
$this->ERROR_MSG=$this->ERR_SEND_MAIL_FAILURE;
return false;
}
}

function errorMsg()
{
if(empty($this->ERROR_MSG))
return $this->STR_NO_ERROR;
return $this->ERROR_MSG;

}

}
?>
[/code]

The above class is then extended by my_smtp_mail_class.php
[code]<?php
//my_smtp_mail_class.php

include "./my_mail_class.php";
class My_Smtp_Mail extends My_Mail
{
var $smtp_host='';
var $smtp_port=25;

var $socket=0;

var $response_code=0;
var $response_msg='';

var $ERR_SMTP_HOST_NOT_SET='SMTP host not set!';
var $ERR_SMTP_CONNECTION_FAILED='Failed to connect to the specified SMTP host!';
var $ERR_SMTP_NOT_CONNECTED='Establish a connection to an SMTP server first!';

var $ERR_COMMAND_UNRECOGNIZED='Unrecognizable command!';
var $ERR_HELO_WITHOUT_ARG='HELO command needs an argument';
var $ERR_MAIL_WITHOUT_ARG='MAIL FROM command needs an argument';
var $ERR_RCPT_WITHOUT_ARG='RCPT TO command needs an argument';
var $ERR_DATA_WITHOUT_ARG='DATA command needs an argument';

var $ERR_UNKNOWN_RESPONSE_FROM_SERVER='Unknown response from the server';
var $ERR_HELO_FAILED='HELOcommand failed';
var $ERR_MAIL_FAILED='MAIL TO command failed';
var $ERR_RCPT_FAILED='RCPT TO command failed';
var $ERR_DATA_FAILED='DATA command failed';
var $ERR_QUIT_FAILED='QUIT command failed';
var $ERR_INIT_SOCKET_ERROR="Couldn't initialize the socket!";

function connect()
{
if(empty($this->smtp_host))
{
$this->ERROR_MSG=$this->ERR_SMTP_HOST_NOT_SET;
return false;
}
$this->socket=fsockopen($this->smtp_host,$this->smtp_port,&$err_no,&$err_str);
if(!$this->socket)
{
if(!$err_no)
{
$err_str=$this->ERR_INIT_SOCKET_ERROR;
}
$this->ERROR_MSG=$this->ERR_SMTP_CONNECTION_FAILED."$err_no: $err_str";
return false;
}
if(!$this->getResponse())
{
$this->ERROR_MSG=$this->ERR_UNKNOWN_RESPONSE_FROM_SERVER.":".$this->response_msg;
return false;
}
if($this->response_code!=220)
{
$this->ERROR_MSG=$this->ERR_SMTP_CONNECTION_FAILED." ".$this->response_code." ".$this->response_msg;
return false;
}
return true;
}

function getResponse()
{
if(!$this->socket)
{
$this->ERROR_MSG=$this->ERR_SMTP_NOT_CONNECTED;
return false;
}
$server_response=fgets($this->socket,1024);

if(ereg("^([0-9]{3}) (.*)$",$server_response,$match))
{
$this->response_code=$match[1];
$this->response_msg=$match[2];
return true;
}
$this->response_msg=$server_response;
return false;
}

function talk($cmd,$args='')
{
if(!$this->socket)
{
$this->ERROR_MSG=$this->ERR_SMTP_NOT_CONNECTED;
return false;
}
switch($cmd)
{
case "HELO":
if(empty($args))
{
$this->ERROR_MSG=$this->ERR_HELO_WITHOUT_ARG;
return false;
}
$smtp_cmd="HELO $arg\r\n";
fwrite($this->socket,$smtp_cmd);
if(!$this->getResponse())
{
$this->ERROR_MSG=$this->ERR_UNKNOWN_RESPONSE_FROM_SERVER.":".$this->response_msg;
return false;
}

if($this->response_code!=250)
{
$this->ERROR_MSG=$this->ERR_HELO_FAILED." ".$this->response_code." ".$this->response_msg;
return false;
}
break;

case "MAIL":
if(empty($args))
{
$this->ERROR_MSG=$this->ERR_MAIL_WITHOUT_ARG;
return false;
}
$smtp_cmd="MAIL FROM: $arg\r\n";
fwrite($this->socket,$smtp_cmd);
if(!$this->getResponse())
{
$this->ERROR_MSG=$this->ERR_UNKNOWN_RESPONSE_FROM_SERVER.":".$this->response_msg;
return false;
}

if($this->response_code!=250)
{
$this->ERROR_MSG=$this->ERR_MAIL_FAILED." ".$this->response_code." ".$this->response_msg;
return false;
}
break;

case "RCPT":
if(empty($arg))
{
$this->ERROR_MSG=$this->ERR_RCPT_WITHOUT_ARG;
return false;
}
$to_emails=explode(",",$arg);

foreach ($to_emails as $email)
{
$smtp_cmd="RCPT TO: $email\r\n";
fwrite($this->socket,$smtp_cmd);
if(!$this->getResponse())
{
$this->ERROR_MSG=$this->ERR_UNKNOWN_RESPONSE_FROM_SERVER.":".$this->response_msg;
return false;
}

if($this->response_code!=250)
{
$this->ERROR_MSG=$this->ERR_RCPT_FAILED." ".$this->response_code." ".$this->response_msg;
return false;
}
}
break;
case "DATA":
if(empty($arg))
{
$this->ERROR_MSG=$this->ERR_DATA_WITHOUT_ARG;
return false;
}
$smtp_cmd="DATA\r\n";
fwrite($this->socket,$smtp_cmd);
if(!$this->getResponse())
{
$this->ERROR_MSG=$this->ERR_UNKNOWN_RESPONSE_FROM_SERVER.":".$this->response_msg;
return false;
}
if($this->response_code!=354)
{
$this->ERROR_MSG=$this->ERR_DATA_FAILED." ".$this->response_code." ".$this->response_msg;
return false;
}
$smtp_cmd="$arg\r\n"."."."\r\n";
fwrite($this->socket,$smtp_cmd);
if(!$this->getResponse())
{
$this->ERROR_MSG=$this->ERR_UNKNOWN_RESPONSE_FROM_SERVER.":".$this->response_msg;
return false;
}
if($this->response_code!=250)
{
$this->ERROR_MSG=$this->ERR_DATA_FAILED." ".$this->response_code." ".$this->response_msg;
return false;
}
break;

case "QUIT":
$smtp_cmd="QUIT\r\n";
fwrite($this->socket,$smtp_cmd);
if(!$this->getResponse())
{
$this->ERROR_MSG=$this->ERR_UNKNOWN_RESPONSE_FROM_SERVER.":".$this->response_msg;
return false;
}
if($this->response_code!=251)
{
$this->ERROR_MSG=$this->ERR_QUIT_FAILED." ".$this->response_code." ".$this->response_msg;
return false;
}
break;
default:

$this->ERROR_MSG=$this->ERR_COMMAND_UNRECOGNIZED;
return false;
break;

}
return true;
}

function send()
{
if(!$this->checkFields())
return false;

$this->buildHeaders();

if(!$this->connect())
return false;
if(!$this->talk("HELO",$GLOBALS["SERVER_NAME"]))
return false;
if(!$this->talk("MAIL",$this->from))
return false;
if(!$this->talk("RCPT",$this->to))
return false;

if(!empty($this->to))
$this->headers[]="To: $this->to";
if(!empty($this->subject))
$this->headers[]="Subject: $this->subject";

if(!$this->talk("DATA",implode("\r\n",$this->headers)."\r\n\r\n".$this->body))
return false;
if(!$this->talk("QUIT"))
return false;
fclose($this->socket);
return true;
}
}
?>




[/code]

Now,the below script is for testing....
[code]<?php
//my_smtp_mail_class_test.php
include("./my_smtp_mail_class.php");

$mail=new My_Smtp_Mail();
$mail->smtp_host=''; //i tried with localhost and also with the smtp server name my hostingsite provided to me.. but nothing worked

$mail->to="myid@mydomain.com";
$mail->from="anotherid@gmail.com";
$mail->cc='';
$mail->bcc='';
$mail->subject="Testing..1..2..3..4";
$mail->body="Just testing...";
$mail->rigorous_email_check=1;

if($mail->send())
{
echo ("Successfully sent an email titled $mail->subject!");
}
else
die("Error while attempting to send an email titled $mail->subject:".$mail->errorMsg());
echo("<br>");
echo(str_replace("\r\n","<br>",$mail->viewMsg()));
?>
[/code]

The output i got is:
[b]Error while attempting to send an email titled Testing..1..2..3..4:No error has occured yet[/b]

Share this post


Link to post
Share on other sites
first try this script it is the form and mail script in one
this script is set to work with the name simpleemail.php
so you will want to name this page that ok

[code]
//this is so you dont get any notices or warnings
<? error_reporting(E_ERROR);?>

<?
//this is the mail script
$to = $_POST['to'];
$sub=$_POST['sub'];
$mess = $_POST['mess'];
$from="From: $_POST[email]";


if(isset($_POST['submit'])){   

    $mail=mail("$to", "$sub", "$mess", "$from");
    if(!$mail){
print "<center>Sorry Your E-mail Was Not Sent</center>";
}else{
print "<center>Your E-mail Was Sent Successfuly</center>";
}
}else{
//and here is the mail form
print "<form method=post action=simpleemail.php>";
print "<center><table cellpadding=0 cellspacing=0 class=contacttable><tH class=contacthead><center>Simple E-mail</CENTER>";
print "<TR><TD>To: <input type=text name=to size=40>";
print "<TR><TD>From: <input type=text name=email>";
print "<TR><TD>Subject: <input type=text name=sub size=70>";
print "<TR><TD>Message:<br />";
print "<textarea name=mess cols=80 rows=10></textarea><BR />";
print "<input type=submit name=submit value=send>";
print "</th></tr></td></table></center></form>";
}
?>

[/code]

if this script doesnt work your host either doesnt have a mail server or hasnt enabled it to let there users run scripts from there pages and i know for a fact this script works because i use to use it on my page

Share this post


Link to post
Share on other sites
if the script i posted workes you may want to try to declair your varibles like so

[code]
$to = "myid@mydomain.com";
$sub = "Testing..1..2..3..4";
$mess = "Just testing...";
$from ="From: $_POST[email]";
[/code]

instead of

[code]
$mail=new My_Smtp_Mail();
$mail->smtp_host=''; //i tried with localhost and also with the smtp server name my hostingsite provided to me.. but nothing worked

$mail->to="myid@mydomain.com";
$mail->from="anotherid@gmail.com";
$mail->cc='';
$mail->bcc='';
$mail->subject="Testing..1..2..3..4";
$mail->body="Just testing...";
$mail->rigorous_email_check=1;
[/code]

because your host has register globals off witch is recomended and if that is the case you may have to declair them like so

$to = $_POST['to'];

or else they wont work

Share this post


Link to post
Share on other sites
shortj75,
thanks for ur reply.the script above is saying that the email is sent successfully... the same happens with my past scripts but i havent get any mail.

this is because that my hosting service wont allow mail function so some reasons.
so.. i am looking for an alternative..
have u seen my script above... can u find anything wrong in tht?

Share this post


Link to post
Share on other sites
try this code as i no that some computers smtp that have been setup with tight condition will only send mail with the php correct header information.

Your also have to cheek your spam box as meny free mail systems see meny posts as spam if there not in your address book ok.

test it.php
[code]
<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
   'Reply-To: webmaster@example.com' . "\r\n" .
   'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>
[/code]

Share this post


Link to post
Share on other sites
I already worked with that script and failed... coz my hosting service is not providing tht function for some reasons:(

do u have any other script??

Share this post


Link to post
Share on other sites
did you ask the hosting company why?

have you asked what you can use to send email?

if you dont ask you will never no .

ask

good luck.

Share this post


Link to post
Share on other sites
ya.. i asked them several times...
what they said is to try smtp...
since i had no other choice.. i am running back of books and net and tried so many scripts...

this is my position right now:(

Share this post


Link to post
Share on other sites
there you go mate

[code]
<?php

@set_time_limit(0);

require_once 'smtp_mail.php';

$to = "expertphp@yahoo.com";
$from = "from@myaccount.com";
$subject = "Subject here";

$headers = "MIME-Version: 1.0\r\n".
  "Content-type: text/html; charset=iso-8859-1\r\n".
  "From: \"My Name\" <".$from.">\r\n".
  "To: \"Client\" <".$to.">\r\n".
  "Date: ".date("r")."\r\n".
  "Subject: ".$subject."\r\n";

$message = "
<html>
<body>
<b>html message</b><br>
<font color=\"red\">here</font>
<img src=\"http://static.php.net/www.php.net/images/php.gif\"
border=\"0\" alt=\"\">
</body>
</html>
";

$response = smtp_mail($to, $subject, $message, $from, $headers);

if($response[0]) echo "The message has been sent !<br />\n".$response[1];
else echo "The message can not been sent !<br />\n".$response[1];

?>
[/code]

Share this post


Link to post
Share on other sites
is smtp_mail.php will be there in default..
i executed thinking so and got that cannot include..

Share this post


Link to post
Share on other sites
your host probably means to do it by haveing you maile go through a different mail host like yahoo or something like so

[code]

<?php


$from = "who from <from@therehost.com>";
$to = "you<you@yourhost.com>";
$subject = "whats up";
$body = "nothing and you";

$host = "smtp.host.com"; //(like smtp.yahoo.com)or msn or who ever you user for your email address
$username = "your_username";(example: killer)
$password = "your_password";(example: dog or ****)

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
} else {
  echo("<p>Message successfully sent!</p>");
}
[/code]

or something along that line this code might or might not work for you but some one else may have one that will work better for what you need

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.