ThinkPHP邮件发送S(Smtp + Mail + phpmailer)

时间:2023-03-09 03:42:27
ThinkPHP邮件发送S(Smtp + Mail + phpmailer)

  三种邮件发送介绍:(Smtp,Mail以及phpmailer)ThinkPhp 框架下开发。

  邮件发送配置先前准备(用该账号做测试用):(这里用新浪邮箱服务器)将自己的新浪邮箱开通 POP3/SMTP服务:

新浪邮箱中  :设置->账户下面的 POP3/SMTP服务 选择开通(然后一步一步完成开通)。

 客户端html代码:

 <body>
<!--<h1>发送信息测试</h1>-->
<div>请输入发送地址(1):<input id="adds" type="text" style="width:180px;" /></div>
<div>主题:<input id="title" type="text" style="width:100px;" /></div>
<div style="width:600px;vertical-align:top;">
发送信息:
<textarea id="msgbody" property="请输入需要发送的信息..." style="width:180px;height:100px;"></textarea>
</div>
<div>
<input type="button" value="发送1" onclick="sendmsg()" />
</div>
<body>

js:

  <script>
function sendmsg() {
var id = document.getElementById("adds").value;
var msg = document.getElementById("msgbody").value;
var title = document.getElementById("title").value;
var par = /^[a-zA-Z0-9_+.-]+\@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,4}$/; if (id == "") {
alert("输入发送地址");
return;
} else if (!par.exec(id)) {
alert("填写地址错误!");
return;
}
showloading();
$.post('__ROOT__/Home/SendEmail/sendMails', { email: id,title:title, msg: msg }, function (data) {
if (data.status == 1) {
hideloading();
// try {
alert("信息发送成功!");
alert(data.data);
// } catch (e) {
// alert(e.message);
// }
} else {
hideloading();
alert("未知错误!");
}
}, 'json');
}
</script>

 第一种:Smtp(PHP)。

  1:在ThinkPHP/LibraryLibrary文件夹下新建一个文件夹  HomeClass,在HomeClass 文件夹下新建一个类 命名为:smtp.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 fsockopen() # $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 = ereg_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.">\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";
$utfheader=iconv("UTF-8","GB2312",$header);
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, $utfheader, $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 = @fsockopen($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 = ereg_replace("^.+@([^@]+)$", "\1", $address);
if (!@getmxrr($domain, $MXHOSTS)) {
$this->log_write("Error: Cannot resolve MX \"".$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("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 (!ereg("^[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 (ereg($comment, $address)) {
$address = ereg_replace($comment, "", $address);
}
return $address;
} function get_address($address)
{
$address = ereg_replace("([ \t\r\n])+", "", $address);
$address = ereg_replace("^.*<(.+)>.*$", "\1", $address);
return $address;
}
function smtp_debug($message)
{
if ($this->debug) {
echo $message;
}
}
}
?>

  2:提交到的后台控制器  SendEmailController.class.php

 public function sendmsg(){
$email = I ( 'post.email' );
$msgs = I('post.msg');
$title=I('post.title'); import("HomeClass.smtp");//引用发送邮件类 $smtpserver = "smtp.sina.cn";//SMTP服务器
$smtpserverport = 25;//SMTP服务器端口
$smtpusermail = "******@sina.cn";//SMTP服务器的用户邮箱
$smtpuser = "****";//SMTP服务器的用户帐号
$smtppass = "*****";//SMTP服务器的用户密码 $smtpemailto = $email;//发送给谁
$mailsubject = $title;//邮件主题
$mailtime = date("Y-m-d H:i:s");
$mailbody = $msgs;//邮件内容 $utfmailbody = iconv("UTF-8","GB2312",$mailbody);//转换邮件编码
$mailtype = "TXT";//邮件格式(HTML/TXT),TXT为文本邮件 $smtp = new \smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
$smtp->debug = FALSE;//是否显示发送的调试信息 FALSE or TRUE $datas = $smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $utfmailbody, $mailtype); $this->ajaxReturn ( array (
'data' => $datas,
'status' => 1
) );
}

其中:$smtpusermail 为你的新浪邮箱账号,$smtpuser 为你新浪邮箱账号(邮箱去掉@sina.com),$smtppass  为你的邮箱密码。第一种邮件发送搞定,你可以发送邮件去另一个邮箱了!!!

第二种:Mail(ThinkPHP)。

1:配置服务器邮箱:在 Application/conf/config.php 文件中添加邮箱配置:

 'THINK_EMAIL' => array (

                 'SMTP_HOST' => 'smtp.sina.cn',
'SMTP_PORT' => '25',
'SMTP_USER' => '******@sina.cn', // SMTP服务器用户名
'SMTP_PASS' => '******', // SMTP服务器密码
'FROM_EMAIL' => '******@sina.cn', // 发件人EMAIL
'FROM_NAME' => '****', // 发件人名称
'REPLY_EMAIL' => '', // 回复EMAIL(留空则为发件人EMAIL) 'REPLY_NAME' => ''
),

SMTP_USER  与 FROM_EMAIL 可为同一 邮箱地址。

2:在 HomeClass  文件夹下 新建一个类:Mail.class.php:(网上能找到)

 <?php

 namespace HomeClass;

 class Mail {
/**
* 系统邮件发送函数
*
* @param string $to
* 接收邮件者邮箱
* @param string $name
* 接收邮件者名称
* @param string $subject
* 邮件主题
* @param string $body
* 邮件内容
* @param string $attachment
* 附件列表
* @return boolean
*/
function sendMail($to, $name, $subject = '', $body = '', $attachment = null) {
$config = C ( 'THINK_EMAIL' );
vendor ( 'PHPMailer.class#phpmailer' ); // 从PHPMailer目录导class.phpmailer.php类文件
$mail = new \PHPMailer (); // PHPMailer对象
$mail->CharSet = 'UTF-8'; // 设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码 //$mail->AddAddress($address);//添加联系人 $mail->IsSMTP (); // 设定使用SMTP服务
$mail->SMTPDebug = 0; // 关闭SMTP调试功能
// 1 = errors and messages
// 2 = messages only
$mail->SMTPAuth = true; // 启用 SMTP 验证功能
//$mail->SMTPSecure = 'ssl'; // 使用安全协议
$mail->Host = $config ['SMTP_HOST']; // SMTP 服务器
$mail->Port = $config ['SMTP_PORT']; // SMTP服务器的端口号
$mail->Username = $config ['SMTP_USER']; // SMTP服务器用户名
$mail->Password = $config ['SMTP_PASS']; // SMTP服务器密码
$mail->SetFrom ( $config ['FROM_EMAIL'], $config ['FROM_NAME'] );
$replyEmail = $config ['REPLY_EMAIL'] ? $config ['REPLY_EMAIL'] : $config ['FROM_EMAIL'];
$replyName = $config ['REPLY_NAME'] ? $config ['REPLY_NAME'] : $config ['FROM_NAME'];
$mail->AddReplyTo ( $replyEmail, $replyName );
$mail->Subject = $subject; $mail->MsgHTML ( $body );
$mail->AddAddress ( $to, '亲' );
if (is_array ( $attachment )) { // 添加附件
foreach ( $attachment as $file ) {
is_file ( $file ) && $mail->AddAttachment ( $file );
}
}
return $mail->Send () ? true : $mail->ErrorInfo;
}
}

3:将前面JS代码的post提交链接改为 __ROOT__/Home/SendEmail/sendMails2,在刚才的控制器 SendEmailController.class.php 中添加一个方法: sendMail2().

 public function sendMails2(){
$email = I ( 'post.email' );
$msgs = I('post.msg');
$title=I('post.title'); $msg = \HomeClass\Mail::sendMail ( $email, $email, $title, $msgs ); $this->ajaxReturn ( array (
'data' => $msg,
'status' => 1
) );
}

第三种:PHPMailer(ThinkPHP)

  1:看看ThinkPHP框架的 Library/Vendor 文件夹下是否存在 文件夹  PHPMailer,如果不存在,则在网上找个加入在该文件夹下。

  2:将前面的JS提交链接改为 __ROOT__/Home/SendEmail/sendMails3 ,在控制器里添加方法 sendMail3():

 public function sendmsg3($sendto_email, $user_name='', $subject, $bodyurl)
{ $email = I ( 'post.email' );
$title=I('post.title');
$msgs = I('post.msg'); vendor ( 'PHPMailer.class#phpmailer' );
$mail = new \PHPMailer();
$mail->IsSMTP(); // send via SMTP $mail->Host = "smtp.sina.cn"; // SMTP 服务器
$mail->Port = 25; // SMTP服务器的端口号
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->Username = "*****@sina.cn"; // SMTP服务器用户名
$mail->Password = "******"; // SMTP服务器密码 $mail->From = "*******@sina.cn"; // 发件人邮箱
//$mail->FromName = "****";; // 发件人 $mail->CharSet = "utf-8"; // 这里指定字符集!
$mail->Encoding = "base64"; if($user_name == '')
{
$user_name=$sendto_email;
}
$mail->AddAddress($sendto_email,$sendto_email); // 收件人邮箱和姓名 //$mail->WordWrap = 50; // set word wrap 换行字数
//$mail->AddAttachment("/var/tmp/file.tar.gz"); // attachment 附件
//$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); $mail->IsHTML(true); // send as HTML
// 邮件主题
$mail->Subject = $subject; //$urls=urlencode($bodyurl);
$mail->Body="Hi,欢迎注册!";
$mail->AltBody = "text/html"; if (!$mail->Send())
{
$mail->ClearAddresses();
return "邮件错误信息: " . $mail->ErrorInfo;
exit;
}
else
{
$mail->ClearAddresses();
// $this->assign('waitSecond', 6);
// $this->success("注册成功,系统已经向您的邮箱:{$sendto_email}发送了一封激活邮件!请您尽快激活~~<br />");
//$this->redirect('sendhtml', array('send' => 5,'email'=>$sendto_email));
return "亲!已经向您的邮箱:{$sendto_email}发送了一封激活邮件!请您尽快激活~~";
}
}

  现在可以给另一个邮箱发送邮件了!!!

发送邮件页面:

        ThinkPHP邮件发送S(Smtp + Mail + phpmailer)

    接收到的邮件:

      ThinkPHP邮件发送S(Smtp + Mail + phpmailer)

注:以上配置我只在给新浪邮箱发送邮件时成功,给QQ邮箱发送邮件时都已失败而告终,还搞不懂是为啥??

ThinkPHP官网邮件发送:  http://www.thinkphp.cn/code/32.html

  PHP邮件发送: http://www.oschina.net/code/snippet_1182150_25127