项目中用短信通知有时间限制,对一些频率比较大的信息力不从心. 使用邮箱发送信息是个不错的选择\(^o^)/!
首先要注册一个邮箱,在邮箱设置里开通smtp功能.
简单介绍下smtp,大概就是第三方客户端登录邮箱的功能.打开smtp功能,我们的项目里的邮箱类就可以充当邮箱客户端使用,从而发送信息了.(但要注意,密码将不是邮箱的登录密码.而是邮箱生成授权码或者自己设置的授权码)
下面是干货
<?
class SmtpAction extends Action
{
???/* Public Variables */
???public $debug = false; ???//是否开启调试 会打印每一步的执行结果
???public $smtp_port = 25;
???public $time_out = 30;
???public $host_name = "localhost";
???public $log_file = ‘‘;
???public $relay_host = "smtp.163.com";//SMTP服务器
???public $auth = true; ??//使用身份验证,否则不使用身份验证.
???public $user = "23213213@163.com";//SMTP服务器的用户帐号
???public $pass = "32132132132";//SMTP服务器的用户密码
????
???/* Private Variables */
???private $sock = FALSE;
???function index($to=‘‘,$name=‘‘,$body=‘‘) {
???????$to = I(‘to‘) ? I(‘to‘) : $to; ??//目标邮箱
???????$form = $this->user; ??//发件人
???????$name = I(‘name‘)? I(‘name‘) : $name; ????//标题
???????$body = I(‘body‘)? I(‘body‘) : $body; ?????//正文
???????$mailtype = ‘html‘; ????//正文类型 ?html/txt
???????$this->sendmail($to,$form,$name,$body,$mailtype);
???}
???/* 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 = ‘‘;
???????$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");
???????}
???????// echo "<br>";
???????// echo $header; ??//信息
???????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 = preg_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 (!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."<br>";
???????}
???}
function get_attach_type($image_tag) { //
???$filedata = array();
????
???$img_file_con=fopen($image_tag,"r");
???unset($image_data);
???while ($tem_buffer=AddSlashes(fread($img_file_con,filesize($image_tag))))
???$image_data.=$tem_buffer;
???fclose($img_file_con);
???$filedata[‘context‘] = $image_data;
???$filedata[‘filename‘]= basename($image_tag);
???$extension=substr($image_tag,strrpos($image_tag,"."),strlen($image_tag)-strrpos($image_tag,"."));
???switch($extension){
???????case ".gif":
???????????$filedata[‘type‘] = "image/gif";
???????????break;
???????case ".gz":
???????????$filedata[‘type‘] = "application/x-gzip";
???????????break;
???????case ".htm":
???????????$filedata[‘type‘] = "text/html";
???????????break;
???????case ".html":
???????????$filedata[‘type‘] = "text/html";
???????????break;
???????case ".jpg":
???????????$filedata[‘type‘] = "image/jpeg";
???????????break;
???????case ".tar":
???????????$filedata[‘type‘] = "application/x-tar";
???????????break;
???????case ".txt":
???????????$filedata[‘type‘] = "text/plain";
???????????break;
???????case ".zip":
???????????$filedata[‘type‘] = "application/zip";
???????????break;
???????default:
???????????$filedata[‘type‘] = "application/octet-stream";
???????????break;
???}
???return $filedata;
???}
} // end class
?>
php 中引入邮箱服务 , 利用第三方的smtp邮件服务
原文地址:http://www.cnblogs.com/jinshuo/p/7778038.html