搜索
简帛阁>技术文章>PHP通过SMTP服务器发送邮件

PHP通过SMTP服务器发送邮件

一直报错一直有各种各样的问题,一步一步改,最终成功了,哈哈,我都不知道我安装的SMTP服务器到底有没有作用,居然就成功啦,开森

调用部分的代码如下:

require_once "include/email.class.php";
        //******************** 配置信息 ********************************
        $smtpserver = "ssl://smtp.163.com";//SMTP服务器
        $smtpserverport =465;//SMTP服务器端口
        $smtpusermail = "18855032520@163.com";//SMTP服务器的用户邮箱
        $smtpemailto = $row['email'];//发送给谁
        $smtpuser = "18855032520";//SMTP服务器的用户帐号
        $smtppass = "j××××××××22";//SMTP服务器的用户密码(我的163邮箱的授权码)//jdmmfnrzwioucajb
        $mailtitle = "OJ系统密码重置激活";//邮件主题
        $mailcontent = "$lost_user_id:\n您好!\n您在OJ系统选择了找回密码服务,为了验证您的身份,请将下面字串输入口令重置页面以确认身份:".$_SESSION[$OJ_NAME.'_'.'lost_key']."\n\n\n安徽科技学院在线评测系统";//邮件内容
        $mailtype = "TXT";//邮件格式(HTML/TXT),TXT为文本邮件

        //************************ 配置信息 ****************************
        $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
        $smtp->debug =false;//是否显示发送的调试信息
        $state = $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype);

        require("template/".$OJ_TEMPLATE."/lostpassword2.php");

其中的mail.class.php代码真的改了好久,因为原来下载的代码里面的有的函数和用法已经过时了,我全都改过来了

<?php
class smtp

{<!-- -->

/* Public Variables */

var $smtp_port;

var $time_out;

var $host_name;

var $log_file;

var $relay_host;

var $debug;

var $auth;

var $user;

var $pass;

/* Private Variables */ 
var $sock;

/* Constractor */

function smtp($relay_host = "", $smtp_port = 25,$auth = false,$user,$pass)

{<!-- -->

$this->debug = FALSE;

$this->smtp_port = $smtp_port;

$this->relay_host = $relay_host;

$this->time_out = 30; //is used in pfsockopen()
#

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

$this->user = $user;

$this->pass = $pass;

#

$this->host_name = "localhost"; //is used in HELO command 
$this->log_file = "";

$this->sock = FALSE;

}

/* Main Function */

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

{<!-- -->

$mail_from = $this->get_address($this->strip_comment($from));

$body = preg_replace("/(^|(\r\n))(\.)/", "\1.\3", $body);

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

if($mailtype=="HTML"){

$header .= "Content-Type:text/html\r\n";

}

$header .= "To: ".$to."\r\n";

if ($cc != "") {

$header .= "Cc: ".$cc."\r\n";

}

$header .= "From: $from<".$from.">\r\n";

$header .= "Subject: ".$subject."\r\n";

$header .= $additional_headers;

$header .= "Date: ".date("r")."\r\n";

$header .= "X-Mailer:By Redhat (PHP/".phpversion().")\r\n";

list($msec, $sec) = explode(" ", microtime());

$header .= "Message-ID: <".date("YmdHis", $sec).".".($msec*1000000).".".$mail_from.">\r\n";

$TO = explode(",", $this->strip_comment($to));

if ($cc != "") {

$TO = array_merge($TO, explode(",", $this->strip_comment($cc)));

}

if ($bcc != "") {

$TO = array_merge($TO, explode(",", $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("Error: Cannot send email to ".$rcpt_to."\n");

$sent = FALSE;

continue;

}

if ($this->smtp_send($this->host_name, $mail_from, $rcpt_to, $header, $body)) {

$this->log_write("E-mail has been sent to <".$rcpt_to.">\n");

} else {

$this->log_write("Error: Cannot send email to <".$rcpt_to.">\n");

$sent = FALSE;

}

fclose($this->sock);

$this->log_write("Disconnected from remote host\n");

}

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("sending RCPT TO command");

}

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 <CR><LF>.<CR><LF> [EOM]");

}

if (!$this->smtp_putcmd("QUIT")) {

return $this->smtp_error("sending QUIT command");

}

return TRUE;

}

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("Trying to ".$this->relay_host.":".$this->smtp_port."\n");

$this->sock = @pfsockopen($this->relay_host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {

$this->log_write("Error: Cannot connenct to relay host ".$this->relay_host."\n");

$this->log_write("Error: ".$errstr." (".$errno.")\n");

return FALSE;

}

$this->log_write("Connected to relay host ".$this->relay_host."\n");

return TRUE;;

}

function smtp_sockopen_mx($address)

{<!-- -->

$domain = preg_replace("/^.+@([^@]+)$/", "\1", $address);

if (!@getmxrr($domain, $MXHOSTS)) {

$this->log_write("Error: Cannot resolve MX \"".$domain."\"\n");

return FALSE;

}
//专注与php学习 http://www.daixiaorui.com 欢迎您的访问

foreach ($MXHOSTS as $host) {

$this->log_write("Trying to ".$host.":".$this->smtp_port."\n");

$this->sock = @pfsockopen($host, $this->smtp_port, $errno, $errstr, $this->time_out);

if (!($this->sock && $this->smtp_ok())) {

$this->log_write("Warning: Cannot connect to mx host ".$host."\n");

$this->log_write("Error: ".$errstr." (".$errno.")\n");

continue;

}

$this->log_write("Connected to mx host ".$host."\n");

return TRUE;

}

$this->log_write("Error: Cannot connect to any mx hosts (".implode(", ", $MXHOSTS).")\n");

return FALSE;

}

function smtp_message($header, $body)

{<!-- -->

fputs($this->sock, $header."\r\n".$body);

$this->smtp_debug("> ".str_replace("\r\n", "\n"."> ", $header."\n> ".$body."\n> "));

return TRUE;

}

function smtp_eom()

{<!-- -->

fputs($this->sock, "\r\n.\r\n");

$this->smtp_debug(". [EOM]\n");

return $this->smtp_ok();

}

function smtp_ok()

{<!-- -->

$response = str_replace("\r\n", "", fgets($this->sock, 512));

$this->smtp_debug($response."\n");

if (!preg_match("/^[23]/", $response)) {

fputs($this->sock, "QUIT\r\n");

fgets($this->sock, 512);

$this->log_write("Error: Remote host returned \"".$response."\"\n");

return FALSE;

}

return TRUE;

}

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

{<!-- -->

if ($arg != "") {

if($cmd=="") $cmd = $arg;

else $cmd = $cmd." ".$arg;

}

fputs($this->sock, $cmd."\r\n");

$this->smtp_debug("> ".$cmd."\n");

return $this->smtp_ok();

}

function smtp_error($string)

{<!-- -->

$this->log_write("Error: Error occurred while ".$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("Warning: Cannot open log file \"".$this->log_file."\"\n");

return FALSE;;

}

flock($fp, LOCK_EX);

fputs($fp, $message);

fclose($fp);


return TRUE;

}


function strip_comment($address)

{<!-- -->

$comment = "/\([^()]*\)/";

while (preg_match($comment, $address)) {

$address = preg_replace($comment, "", $address);

}


return $address;

}


function get_address($address)

{<!-- -->

$address = preg_replace("/([ \t\r\n])+/", "", $address);

$address = preg_replace("/^.*<(.+)>.*$/", "\1", $address);

return $address;

}

function smtp_debug($message)

{<!-- -->

if ($this->debug) {

echo $message;

}

}

}

?>
一直报错一直有各种各样的问题,一步一步改,最终成功了,哈哈,我都不知道我安装的SMTP服务器到底有没有作用,居然就成功啦,开森调用部分的代码如下:require_onceinclude/emailc
先google了一下,发现很多问相关问题的但没有相关的解答,在phpclasses里也没有找到相关的类于是自己边看stmp的相关协议边开始尝试curlSMTP协议这个在网上可以找到多相关的例子,可以自
原因必定在WordPress的php邮件发送类中。轻松Google到了原因:原来Windows的SMTP服务不支持Name<address@domaincom>这样的邮件格式,必须直接写成
当你还在纠结php内置的mail()函数不能发送邮件时,那么你现在很幸运,此时的这篇文章可以帮助到你!php利用smtp类来发邮件真是屡试不爽,我用过很久了,基本上没出过问题。本博客后台,当博主回复
文实例讲述了php基于socket实现SMTP发送邮件的方法。分享给大家供大家参考。具体分析如下:php采用socket通过SMTP发送邮件。用的是php的phpsockets扩展,可以发送纯文本和
smtpphp复制代码代码如下:<?phpclasssmtp{/*PublicVariables*/var$smtp_port;var$time_out;var$host_name;var$lo
***JavaMailSMTP服务器发送邮件程序示例*扮演SMTP服务器角色与邮件客户端软件最大的区别就是:*SMTP服务器需要解析不同接收人邮件地址主机名对应的SMTP服务器主机名*,同时不需要验
轻量级PHP邮件发送,需要有smtp服务器,代码经过多次实战使用,现在把代码分享给大家代码如下:<?php/*邮件发送smtp服务联结smtp服务器,进行邮件发送,版权所有,不能复制@auth
SMTP协议当我们使用PHP的第三方库或工具类进行邮件发送的时候,是否想过一个问题:为什么我们不能自己写php代码实现邮件发现,而要用别人的库呢?php发送邮件到底是如何实现的?首先我们要了解发送邮件
文实例讲述了PHP实现支持SSL连接的SMTP邮件发送类。分享给大家供大家参考。具体如下:该实例代码测试过了gmail和QQ邮箱的SMTP。具体代码如下:代码如下:<php/***邮件发送类*