Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-E-Mail-Versand

PHP-E-Mail-Versand

巴扎黑
巴扎黑Original
2016-11-23 11:37:571077Durchsuche

class smtp 

/* Öffentliche Variablen */ 
var $smtp_port; 
var $time_out; 
var $host_name; 
var $log_file; 
var $relay_host; 
var $debug; 
var $auth; 
var $user; 
var $pass; 
/* Private Variablen */ 
var $sock; 
/* Constractor */ 
function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass) 

$this->debug = FALSCH; 
$this->smtp_port = $smtp_port; 
$this->relay_host = $relay_host; 
$this->time_out = 30; //wird in fsockopen() verwendet 

$this->auth = $auth;//auth 
$this->user = $user; 
$this->pass = $pass; 

$this->host_name = "localhost"; //wird im HELO-Befehl verwendet 
$this->log_file = ""; 
$this->sock = FALSE; 

/* Hauptfunktion */ 
function sendmail($to, $from, $subject = "", $body = "", $mailtype, $cc = "", $bcc = " ", $additional_headers = "") 

$mail_from = $this->get_address($this->strip_comment($from)); 
$body = ereg_replace("(^|(rn))(\.)", "\1.\3", $body); 
$header .= "MIME-Version:1.0rn"; 
if($mailtype=="HTML"){ 
$header .= "Content-Type:text/htmlrn"; 

$header .= "To: ".$to."rn"; 
if ($cc != "") { 
$header .= "Cc: ".$cc."rn"; 

$header .= "Von: $from<".$from.">;rn"; 
$header .= „Betreff: „.$subject.“rn“; 
$header .= $additional_headers; 
$header .= "Datum: ".date("r")."rn"; 
$header .= "X-Mailer:By Redhat (PHP/".phpversion().")rn"; 
list($msec, $sec) = explosion(" ", microtime()); 
$header .= "Nachrichten-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">;rn" ; 
$TO = explosion(",", $this->strip_comment($to)); 
if ($cc != "") { 
$TO = array_merge($TO, explosion(",", $this->strip_comment($cc))); 

if ($bcc != "") { 
$TO = array_merge($TO, explosion(",", $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("Fehler: E-Mail kann nicht an ".$rcpt_to."n gesendet werden"); 
$sent = FALSE; 
weiter; 

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) { 
$this->log_write("E- E-Mail wurde gesendet an <".$rcpt_to.">;n"); 
} else { 
$this->log_write("Fehler: E-Mail kann nicht an < gesendet werden.$rcpt_to.">;n"); 
$sent = FALSE; 

fclose($this->sock); 
$this->log_write("Vom Remote-Host getrennt"); 

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( „RCPT TO-Befehl senden“); 

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 ;;.;< ;LF>; 

if (!$this->smtp_putcmd("QUIT")) { 
return $this->smtp_error("sending QUIT command"); 

TRUE zurückgeben; 

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("Versucht ".$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("Fehler: Verbindung zum Relay-Host kann nicht hergestellt werden ".$this-> Relay_host."n"); 
$this->log_write("Fehler: ".$errstr." ("".$errno.")n"); 
return FALSE; 

$this->log_write("Verbunden mit Relay-Host ".$this->relay_host."n"); 
TRUE zurückgeben; 

function smtp_sockopen_mx($address) 

$domain = ereg_replace("^. @([^@] )$", "\1", $address); 
if (!@getmxrr($domain, $MXHOSTS)) { 
$this->log_write("Fehler: MX kann nicht aufgelöst werden "".$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("Warnung: Es kann keine Verbindung zum MX-Host „.$host“ hergestellt werden.n "); 
$this->log_write("Fehler: ".$errstr." ("".$errno.")n"); 
weiter; 

$this->log_write("Verbunden mit MX-Host ".$host."n"); 
TRUE zurückgeben; 

$this->log_write("Fehler: Verbindung zu keinem MX-Host möglich ("".implode(", ", $MXHOSTS).")n"); 
return FALSE; 

function smtp_message($header, $body) 

fputs($this->sock, $header."rn".$body); 
$this->smtp_debug(">; ".str_replace("rn", "n".">; ", $header."n>; ".$body."n>; ") ); 
TRUE zurückgeben; 

function smtp_eom() 

fputs($this->sock, "rn.rn"); 
$this->smtp_debug(". [EOM]n"); 
return $this->smtp_ok(); 

function smtp_ok() 

$response = str_replace("rn", "", fgets($this->sock, 512)); 
$this->smtp_debug($response."n"); 
if (!ereg("^[23]", $response)) { 
fputs($this->sock, "QUITrn"); 
fgets($this->sock, 512); 
$this->log_write("Fehler: Remote-Host hat zurückgegeben "".$response.""n"); 
return FALSE; 

TRUE zurückgeben; 

function smtp_putcmd($cmd, $arg = "") 

if ($arg != "") { 
if($cmd=="") $cmd = $arg; 
else $cmd = $cmd." ".$arg; 

fputs($this->sock, $cmd."rn"); 
$this->smtp_debug(">; ".$cmd."n"); 
return $this->smtp_ok(); 

function smtp_error($string) 

$this->log_write("Fehler: Fehler aufgetreten während ".$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("Warnung: Protokolldatei kann nicht geöffnet werden. "".$this->log_file.""n"); 
return FALSE; 

flock($fp, LOCK_EX); 
fputs($fp, $message); 
fclose($fp); 
TRUE zurückgeben; 

function strip_comment($address) 

$comment = "\([^()]*\)"; 
while (ereg($comment, $address)) { 
$address =ereg_replace($comment, "", $address); 

return $address; 

function get_address($address) 

$address = ereg_replace("([ trn]) ", "", $address); 
$address = ereg_replace("^.*<(. )>;.*$", "\1", $address); 
$address zurückgeben; 

function smtp_debug($message) 

if ($this->debug) { 
echo $message; 



function sendmail($smtpserver,$smtpuser,$smtppass,$smtpemailto,$smtpusermail, $mailsubject, $mailbody){ 
$smtp = new smtp($ smtpserver,25,true,$smtpuser,$smtppass); 

$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, "HTML"); 


//sendmail("smtp.126.com","test@126.com","password","1034555083@qq.com","test@126.com", „Titel“, „Körper“); 

//$smtpserver = "SMTP.163.com"; //您的smtp服务器的地址 
$smtpserver="smtp.qq.com"; 
$port =25; //smtp服务器的端口,一般是 25 
$smtpuser = "116206443@emil.com"; //您登录smtp服务器的用户名 
$smtppwd = "123456789oiuy"; //您登录smtp服务器的密码 
$mailtype = "TXT"; //邮件的类型,可选值是 TXT 或 HTML ,TXT 表示是纯文本的邮件,HTML 表示是 html格式的邮件 
$sender = "116206443@qq. com"; 
//发件人,一般要与您登录smtp服务器的用户名($smtpuser)相同,否则可能会因为smtp服务器的设置导致发送失败 
$smtp = new smtp($smtpserver,$port ,true,$smtpuser,$smtppwd,$sender); 
$smtp->debug = true; //是否开启调试,只在测试程序时使用,正式使用时请将此行注释 
$to = "116206443@qq.com"; //收件人 
$subject = "你好"; 
$body = "测试发送的内容"; 
$send=$smtp->sendmail($to,$sender,$subject,$body,$mailtype); 

if($send==1){ 
echo "邮件发送成功"; 
}else{ 
echo "邮件发送失败
"; 
//echo "原因:".$this->smtp->logs; 

?> 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn