php实现的邮件发送类,二种方式:
smtp方式与mail函数方式。
代码:
<?php
/**
* 邮件发送类
* by www.jb200.com
*/
Class sendmail{
public $smtp_host;
public $smtp_port = 25;
public $smtp_user;
public $smtp_password;
public $from_name;
public $SendFromMail;
public $mail_to;
public $subject;
public $message;
public $headers = '';
public $ContentType = 'html';
public $charset = 'windows-1251';
public $smtp_debug = true;
public $socket;
public $error;
public $SendMailVia = 'smtp';
public function __construct()
{
if($this->SendFromMail == ''){
$this->SendFromMail = $this->smtp_user;
}
}
public function Send($mail_to = '', $subject = '', $message = '')
{
if($mail_to!=''){$this->mail_to = stripslashes($mail_to);}
if($subject!=''){$this->subject = stripslashes($subject);}
if($message!=''){$this->message = $message;}
$meilsArr = array_filter($this->GetMailAndNameArr());
if(trim($this->mail_to)==''){$this->error = 'Enter the recipient address'; }
if($meilsArr == array()){$this->error = 'Please enter a valid recipient address'; }
foreach ($meilsArr as $val)
{
$validEmail = $this->validEmail($val[2]);
if($validEmail)
{
if($this->SendMailVia=='smtp'){
return $this->SMTPsend($mail_to = $val[2], $name_to = $val[1]);
}
else{
return $this->MAILsend($mail_to = $val[2], $name_to = $val[1]);
}
}
}
}
public function MAILsend($mail_to, $name_to)
{
if($this->ContentType=="text"){
$header="Content-Type: text/plain; charset=".$this->charset."";
}
else{
$header="Return-Path: ".$this->smtp_user."n".
"Reply-To: ".$this->SendFromMail."n".
"From: ".$this->from_name." <".$this->SendFromMail.">n".
"Subject: ".$this->subject."n".
"Content-Type: text/html; charset=".$this->charset."n";
}
if(mail("$name_to <$mail_to>",$this->subject,$this->message,$header)){
return true;
}else{
return false;
}
}
public function SMTPsend($mail_to, $name_to)
{
$SEND = "Date: ".date("D, d M Y H:i:s") . "rn";
$SEND .= 'Subject: =?'.$this->charset.'?B?'.base64_encode($this->subject)."=?=rn";
if ($this->headers!=''){ $SEND .= $this->headers."rnrn"; }
else
{
$SEND .= "Reply-To: ".$this->SendFromMail."rn";
$SEND .= "MIME-Version: 1.0rn";
$SEND .= "Content-Type: text/".$this->ContentType."; charset="".$this->charset.""rn";
$SEND .= "Content-Transfer-Encoding: 8bitrn";
$SEND .= "From: "".$this->from_name."" <".$this->SendFromMail.">rn";
$SEND .= "To: $name_to <$mail_to>rn";
$SEND .= "X-Priority: 3rnrn";
}
$SEND .= $this->message."rn";
$socket = fsockopen($this->smtp_host, $this->smtp_port, $errno, $errstr, 30);
if(!socket)
{
if($this->smtp_debug) $this->error = $errno." - ".$errstr;
return false;
}
if (!$this->server_parse($socket, "220", __LINE__)){ return false; }
fputs($socket, "HELO ".$this->smtp_host. "rn");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Can not send HELO!</p>';
fclose($socket);
return false;
}
fputs($socket, "AUTH LOGINrn");
if (!$this->server_parse($socket, "334", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Can not find an answer to a request authorization.</p>';
fclose($socket);
return false;
}
fputs($socket, base64_encode($this->smtp_user) . "rn");
if (!$this->server_parse($socket, "334", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Login authorization was not accepted by server!</p>';
fclose($socket);
return false;
}
fputs($socket, base64_encode($this->smtp_password) . "rn");
if (!$this->server_parse($socket, "235", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>No password was not accepted as a true server! Authorization Error!</p>';
fclose($socket);
return false;
}
fputs($socket, "MAIL FROM: <".$this->smtp_user.">rn");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send command MAIL FROM: </p>';
fclose($socket);
return false;
}
fputs($socket, "RCPT TO: <" . $mail_to . ">rn");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send command RCPT TO: </p>';
fclose($socket);
return false;
}
fputs($socket, "DATArn");
if (!$this->server_parse($socket, "354", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send command DATA</p>';
fclose($socket);
return false;
}
fputs($socket, $SEND."rn.rn");
if (!$this->server_parse($socket, "250", __LINE__)) {
if ($this->smtp_debug) $this->error = '<p>Unable to send the message body. The letter was sent!</p>';
fclose($socket);
return false;
}
fputs($socket, "QUITrn");
fclose($socket);
return TRUE;
}
private function GetMailAndNameArr(){
$mailingArr = array();
$tos = preg_split("/;|,/",$this->mail_to);
$pregcode = '/(.*?)<(.*?)>/i';
foreach($tos as $to)
{
if(preg_match('/(.*?)<(.*?)>/i',$to,$matches))
{
unset($matches[0]);
$matches[1] = trim(str_replace('"','',$matches[1]));
$matches[2] = trim($matches[2]);
$mailingArr[] =$matches;
}
elseif(preg_match('/b([A-Z0-9._%-]+)@([A-Z0-9.-]+.[A-Z]{2,4})b/i',$to,$matches2))
{
unset($matches[0]);
$matches[1] = trim(str_replace('"','',$matches2[1]));
$matches[2] = trim($matches2[0]);
$mailingArr[] =$matches;
}
}
return $mailingArr;
}
private function server_parse($socket, $response, $line = __LINE__) {
while (substr($server_response, 3, 1) != ' ') {
if (!($server_response = fgets($socket, 256))) {
if ($this->smtp_debug) $this->error = "<p>$line Problems sending mail! $response</p>";
return false;
}
}
if (!(substr($server_response, 0, 3) == $response)) {
if ($this->smtp_debug) $this->error = "<p>$line Problems sending mail! $response</p>";
return false;
}
return true;
}
function validEmail($email)
{
$isValid = true;
$atIndex = strrpos($email, "@");
$msg = '';
if (is_bool($atIndex) && !$atIndex)
{
$isValid = false;
}
else
{
$domain = substr($email, $atIndex+1);
$local = substr($email, 0, $atIndex);
$localLen = strlen($local);
$domainLen = strlen($domain);
if ($localLen < 1 || $localLen > 64){
$msg = 'local part length exceeded';
$isValid = false;
}
else if ($domainLen < 1 || $domainLen > 255){
$msg = ' domain part length exceeded ';
$isValid = false;
}
else if ($local[0] == '.' || $local[$localLen-1] == '.'){
$msg = ' local part starts or ends with .';
$isValid = false;
}
else if (preg_match('/../', $local)){
$msg = 'local part has two consecutive dots';
$isValid = false;
}
else if (!preg_match('/^[A-Za-z0-9-.]+$/', $domain)){
$msg = 'character not valid in domain part';
$isValid = false;
}
else if (preg_match('/../', $domain)){
$msg = ' domain part has two consecutive dots';
$isValid = false;
}
else if(!preg_match('/^(\.|[A-Za-z0-9!#%&`_=/$'*+?^{}|~.-])+$/', str_replace("\","",$local))){
$msg = ' character not valid in local part unless local part is quoted';
if (!preg_match('/^"(\"|[^"])+"$/',str_replace("\","",$local))){
$isValid = false;
}
}
if ($isValid && !(checkdnsrr($domain,"MX") || checkdnsrr($domain,"A"))){
$msg = ' domain <b>'.$domain.'</b> not found in DNS';
$isValid = false;
}
}
$this->error = $msg;
return $isValid;
}
}
?>
调用示例:
<?php
include "sendmail.class.php";
$Mail = new sendmail();
// Set congif
$Mail->SendMailVia = 'smtp'; // Send via smtp server or mail function
$Mail->smtp_host = 'mail.myhost.com';
$Mail->smtp_port = 25;
$Mail->smtp_user = 'user@myhost.com';
$Mail->smtp_password = 'mypassw';
// 例1 (mail from me)
if($Mail->Send('mymail1@mydomain.com; recipient2 name <recipientmail2@mydomain.com>,"recipient name" <recipient@mail.com>',
'My subject','My message here.'))
{
echo '邮件已发送!';
}
else
{
echo $Mail->error;
}
// 例2 (mail from me)
$Mail->mail_to = 'mymail1@mydomain.com; recipient2 name <recipientmail2@mydomain.com>,"recipient name" <recipient@mail.com>';
$Mail->subject = 'My subject';
$Mail->message = 'My message here';
if($Mail->Send())
{
echo '邮件已发送!';
}
else
{
echo $Mail->error;
}
// 例3 (mail from another user: example user2@site2.com)
$Mail->mail_to = 'Recipient Name <recipientmail@domain.com>';
$Mail->subject = 'My subject';
$Mail->message = 'My message here';
$Mail->from_name = 'User2 Name';
$Mail->SendFromMail = 'user2@site2.com';
if($Mail->Send())
{
echo 'message Mail send!';
}
else
{
echo $Mail->error;
}
?>
您可能感兴趣的文章:
php使用smtp发送邮件的实现代码
php smtp发送邮件的函数
php中通过curl smtp发送邮件的例子
php使用Pear的NetMail发送smtp邮件
使用pear:Net_SMTP类发送邮件的例子
linux下php配置smtp发送邮件的方法
php写的smtp邮件发送类