Here's a class I wrote for a friend so he could email a newsletter to members of his site. The code that actually does the mailing I got from the php manual page for the mail function, provided by the user comments at the bottom. It never hurts to check the manual.
<?
/******************************************************************************************************
* Mailer - Class that will e-mail or mass email a single or list of reciepients. *
******************************************************************************************************/
class Mailer
{
var $FromName; //Real name of sender, don't define to use default
var $FromEmail; //Email of the sender (return address), don't define to use default
var $ToName; //Single real name of a reciepient
var $ToEmail; //Single email address of a reciepient
var $MultiTo; //Array of people to send this mail to: array("Name1" => "add@whatever.com", etc)
var $Subject; //Email subject string
var $Message; //Message body string
var $ReturnMSG; //Message that is returned to the script for operation information
/******************************************************************************************************
* MultiMail() - Used for sending e-mails to multiple people at once. Using this is much much faster *
* than using SingleMail(), because the mail socket remains open until all emails have been sent. *
* NOTE: $MultiTo must be set and must be an array (see above), and $Message must also be set. Also *
* If $FromName and $FromEmail are not set, they will default to what is listed below.
******************************************************************************************************/
function MultiMail()
{
if (is_array($this->MultiTo))
{
if ($this->Message)
{
if (!$this->FromName) { $this->FromName = "My Website"; } //Default from name
if (!$this->FromEmail) { $this->FromEmail = "Whoever@MyWeb.com"; } //Default from email
ini_set (sendmail_from, $FromName." <".$FromEmail.">");
$MailSocket = fsockopen (ini_get ("SMTP"), ini_get ("smtp_port"), $errno, $errstr, 30) or die("Could not open a connection to the sendmail server!");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "HELO {$_SERVER['SERVER_NAME']}\r\n");
$RCV = fgets ($MailSocket, 1024);
while (list ($Name, $Email) = each($this->MultiTo))
{
fputs ($MailSocket, "MAIL FROM:".$this->FromEmail."\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "RCPT TO:$Email\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "DATA\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "Subject: $this->Subject\r\n");
fputs ($MailSocket, "From: $this->FromName <$this->FromEmail>\r\n");
fputs ($MailSocket, "To: $Name <$Email>\r\n");
fputs ($MailSocket, "X-Sender: <$this->FromEmail>\r\n");
fputs ($MailSocket, "Return-Path: <$this->FromEmail>\r\n");
fputs ($MailSocket, "Errors-To: <$this->FromEmail>\r\n");
fputs ($MailSocket, "X-Mailer: PHP\r\n");
fputs ($MailSocket, "X-Priority: 3\r\n");
fputs ($MailSocket, "Content-Type: text/plain; charset=iso-8859-1\r\n");
fputs ($MailSocket, "\r\n");
fputs ($MailSocket, stripslashes($this->Message)." \r\n");
fputs ($MailSocket, ".\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "RSET\r\n");
$RCV = fgets ($MailSocket, 1024);
}
fputs ($MailSocket, "QUIT\r\n");
$RCV = fgets ($MailSocket, 1024);
fclose($MailSocket);
ini_restore(sendmail_from);
$this->ReturnMSG = "No errors detected and all messages sent to the mailer.";
Return True;
}
else
{
$this->ReturnMSG = "No message body was defined. There's no sense in sending a bunch of empty emails!";
Return False;
}
}
else
{
$this->ReturnMSG = "Either MultiTo was not set, or was not properly set as an array.";
Return False;
}
}
function SingleMail()
{
if ($this->ToEmail)
{
if ($this->Message)
{
if (!$this->FromName) { $this->FromName = "My Website"; } //Default from name
if (!$this->FromEmail) { $this->FromEmail = "Whoever@MyWeb.com"; } //Default from email
ini_set (sendmail_from, $FromName." <".$FromEmail.">");
$MailSocket = fsockopen (ini_get ("SMTP"), ini_get ("smtp_port"), $errno, $errstr, 30) or die("Could not open a connection to the sendmail server!");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "HELO {$_SERVER['SERVER_NAME']}\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "MAIL FROM:".$this->FromEmail."\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "RCPT TO:".$this->ToEmail."\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "DATA\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "Subject: $this->Subject\r\n");
fputs ($MailSocket, "From: $this->FromName <$this->FromEmail>\r\n");
fputs ($MailSocket, "To: ".$this->ToName." <".$this->ToEmail.">\r\n");
fputs ($MailSocket, "X-Sender: <$this->FromEmail>\r\n");
fputs ($MailSocket, "Return-Path: <$this->FromEmail>\r\n");
fputs ($MailSocket, "Errors-To: <$this->FromEmail>\r\n");
fputs ($MailSocket, "X-Mailer: PHP\r\n");
fputs ($MailSocket, "X-Priority: 3\r\n");
fputs ($MailSocket, "Content-Type: text/plain; charset=iso-8859-1\r\n");
fputs ($MailSocket, "\r\n");
fputs ($MailSocket, stripslashes($this->Message)." \r\n");
fputs ($MailSocket, ".\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "RSET\r\n");
$RCV = fgets ($MailSocket, 1024);
fputs ($MailSocket, "QUIT\r\n");
$RCV = fgets ($MailSocket, 1024);
fclose($MailSocket);
ini_restore(sendmail_from);
$this->ReturnMSG = "No errors detected and the message was sent to the mailer.";
Return True;
}
else
{
$this->ReturnMSG = "No message body was defined. There's no sense in sending a bunch of empty emails!";
Return False;
}
}
else
{
$this->ReturnMSG = "Reciepient email was not set.";
Return False;
}
}
}
?>
You can either email a single person, or several people at once. This can easily be done by calling it from a page and just passing it the required info, such as:
$MailerObj = new Mailer;
$MailerObj->ToName = $_POST["Name"];
$MailerObj->ToEmail = $_POST["Email"];
$MailerObj->Subject = $_POST["Subject"];
$MailerObj->Message = $_POST["Message"];
$Result = $MailerObj->SingleMail();
if ($Result)
{
echo "Mail sent.";
echo $MailerObj->ReturnMSG;
}
else
{
echo $MailerObj->ReturnMSG;
}
For a single user, or for multiple users:
require 'Mailer.class';
$MailerObj = new Mailer;
$MailerObj->MultiTo = array ("Somebodys Name" => "Someone@somewhere.com", "Someone_else" => "Someone_Else@somewhere_Else.com");
$MailerObj->Subject = "Test email";
$MailerObj->Message = "Hello, this is a test";
$Result = $MailerObj->MultiMail();
if ($Result)
{
echo "It worked! ";
echo $MailerObj->ReturnMSG;
}
else
{
echo $MailerObj->ReturnMSG;
}