mail函数php smtp,php:smtp方式或mail函数方式发送邮件

php实现的邮件发送类,二种方式:

smtp方式与mail函数方式。

代码:<?php

/**

* 邮件发送类

*/

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." SendFromMail.">\n".

"Subject: ".$this->subject."\n".

"Content-Type: text/html; charset=".$this->charset."\n";

}

if(mail("$name_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") . "\r\n";

$SEND .= 'Subject: =?'.$this->charset.'?B?'.base64_encode($this->subject)."=?=\r\n";

if ($this->headers!=''){ $SEND .= $this->headers."\r\n\r\n"; }

else

{

$SEND .= "Reply-To: ".$this->SendFromMail."\r\n";

$SEND .= "MIME-Version: 1.0\r\n";

$SEND .= "Content-Type: text/".$this->ContentType."; charset=\"".$this->charset."\"\r\n";

$SEND .= "Content-Transfer-Encoding: 8bit\r\n";

$SEND .= "From: \"".$this->from_name."\" SendFromMail.">\r\n";

$SEND .= "To: $name_to \r\n";

$SEND .= "X-Priority: 3\r\n\r\n";

}

$SEND .= $this->message."\r\n";

$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. "\r\n");

if (!$this->server_parse($socket, "250", LINE)) {

if ($this->smtp_debug) $this->error = '

Can not send HELO!

';

fclose($socket);

return false;

}

fputs($socket, "AUTH LOGIN\r\n");

if (!$this->server_parse($socket, "334", LINE)) {

if ($this->smtp_debug) $this->error = '

Can not find an answer to a request authorization.

';

fclose($socket);

return false;

}

fputs($socket, base64_encode($this->smtp_user) . "\r\n");

if (!$this->server_parse($socket, "334", LINE)) {

if ($this->smtp_debug) $this->error = '

Login authorization was not accepted by server!

';

fclose($socket);

return false;

}

fputs($socket, base64_encode($this->smtp_password) . "\r\n");

if (!$this->server_parse($socket, "235", LINE)) {

if ($this->smtp_debug) $this->error = '

No password was not accepted as a true server! Authorization Error!

';

fclose($socket);

return false;

}

fputs($socket, "MAIL FROM: smtp_user.">\r\n");

if (!$this->server_parse($socket, "250", LINE)) {

if ($this->smtp_debug) $this->error = '

Unable to send command MAIL FROM:

';

fclose($socket);

return false;

}

fputs($socket, "RCPT TO: \r\n");

if (!$this->server_parse($socket, "250", LINE)) {

if ($this->smtp_debug) $this->error = '

Unable to send command RCPT TO:

';

fclose($socket);

return false;

}

fputs($socket, "DATA\r\n");

if (!$this->server_parse($socket, "354", LINE)) {

if ($this->smtp_debug) $this->error = '

Unable to send command DATA

';

fclose($socket);

return false;

}

fputs($socket, $SEND."\r\n.\r\n");

if (!$this->server_parse($socket, "250", LINE)) {

if ($this->smtp_debug) $this->error = '

Unable to send the message body. The letter was sent!

';

fclose($socket);

return false;

}

fputs($socket, "QUIT\r\n");

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 = "

$line Problems sending mail! $response

";

return false;

}

}

if (!(substr($server_response, 0, 3) == $response)) {

if ($this->smtp_debug) $this->error = "

$line Problems sending mail! $response

";

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 '.$domain.' 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 ,"recipient name" ',

'My subject','My message here.'))

{

echo '邮件已发送!';

}

else

{

echo $Mail->error;

}

// 例2 (mail from me)

$Mail->mail_to = 'mymail1@mydomain.com; recipient2 name ,"recipient name" ';

$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 ';

$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;

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值