日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php发送邮件smtp源码,php下使用SMTP发邮件的代码

發布時間:2024/10/12 php 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php发送邮件smtp源码,php下使用SMTP发邮件的代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首頁 > 網絡編程 > PHP編程 > php技巧 > php下使用SMTP發郵件的代碼

php下使用SMTP發郵件的代碼

2008-01-10 20:37:22 作者:

php下使用SMTP發郵件的代碼

最近一個項目需要用到SMTP發送郵件,之前的庫類不存在了,又不喜歡安裝pear或者使用pear的net/smtp類,感覺太復雜了。就直接從discuz中抽取出核心稍微修改了下。

從協議分析網上,查找到SMTP協議的命令和應答,SMTP協議在發送SMTP和接收SMTP之間的會話是靠發送SMTP的SMTP命令和接收SMTP反饋的應答來完成的。常用的命令如下:

HELLO<domain><CRLF>識別發送方到接收SMTP的一個HELLO命令

MAIL?FROM:<reverse-path><CRLF><reverse-path>為發送者地址。此命令告訴接收方一個新郵件發送的開始,并對所有的狀態和緩沖區進行初始化。此命令開始一個郵件傳輸處理,最終完成將郵件數據傳送到一個或多個郵箱中。

RCPT?TO:<forward-path><CRLF><forward-path>標識各個郵件接收者的地址

DATA<CRLF>

接收SMTP將把其后的行為看作郵件數據去處理,以<CRLF>.<CRLF>標識數據的結尾。

REST<CRLF>退出/復位當前的郵件傳輸

NOOP<CRLF>要求接收SMTP僅做OK應答。(用于測試)

QUIT<CRLF>要求接收SMTP返回一個OK應答并關閉傳輸。

VRFY<string><CRLF>驗證指定的郵箱是否存在,由于安全因素,服務器多禁止此命令。

EXPN<string><CRLF>驗證給定的郵箱列表是否存在,擴充郵箱列表,也常禁止使用。

HELP<CRLF>查詢服務器支持什么命令

注:<CRLF>為回車、換行,ASCII碼分別為13、10(十進制)。

另外,可以在command下,使用telnet來進行簡單的手工使用SMTP。

比如:

telnet?smtp.263.net?25

Trying?211.150.96.25...

Connected?to?smtp.263.net.

Escape?character?is?'^]'.

220?Welcome?to?coremail?System(With?Anti-Spam)?2.1?for?263(040326)

HELO?weiqiong@cctk.net

250?smtp.263.net

mail?from:weiqiong@cctk.net

250?Ok

rcpt?to:g2_t1@263.net

250?Ok

data

354?End?data?with?.

haha

.

250?Ok:?queued?as?B9E452FF3E

quit

221?Bye

Connection?closed?by?foreign?host.

在此基礎上就可以寫出一個簡單的SMTP類了。

class?stmp{

private?$mailcfg=array();

private?$error_msg='';

function?__construct($mailcfg){

$this->mailcfg=$mailcfg;

}

public?function?send($mail){

$mailcfg=$this->mailcfg;

if(!$fp?=?fsockopen($mailcfg['server'],?$mailcfg['port'],?$errno,?$errstr,?30))?{

return?$this->error("($mailcfg[server]:$mailcfg[port])?CONNECT?-?Unable?to?connect?to?the?SMTP?server,?please?check?your?\"mail_config.php\".");

}

stream_set_blocking($fp,?true);

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?'220')?{

return?$this->error("$mailcfg[server]:$mailcfg[port]?CONNECT?-?$lastmessage");

}

fputs($fp,?($mailcfg['auth']???'EHLO'?:?'HELO')."?".$mailcfg['auth_username']."\r\n");

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?220?&&?substr($lastmessage,?0,?3)?!=?250)?{

return?$this->error("($mailcfg[server]:$mailcfg[port])?HELO/EHLO?-?$lastmessage");

}

while(1)?{

if(substr($lastmessage,?3,?1)?!=?'-'?||?empty($lastmessage))?{

break;

}

$lastmessage?=?fgets($fp,?512);

}

if($mailcfg['auth'])?{

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

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?334)?{

return?$this->error("($mailcfg[server]:$mailcfg[port])?AUTH?LOGIN?-?$lastmessage");

}

fputs($fp,?base64_encode($mailcfg['auth_username'])."\r\n");

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?334)?{

return?$this->error("($mailcfg[server]:$mailcfg[port])?USERNAME?-?$lastmessage");

}

fputs($fp,?base64_encode($mailcfg['auth_password'])."\r\n");

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?235)?{

return?$this->error("($mailcfg[server]:$mailcfg[port])?PASSWORD?-?$lastmessage");

}

$email_from?=?$mailcfg['from'];

}

fputs($fp,?"MAIL?FROM:?.*/",?"\\1",?$email_from).">\r\n");

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?250)?{

fputs($fp,?"MAIL?FROM:?.*/",?"\\1",?$email_from).">\r\n");

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?250)?{

return?$this->error("($mailcfg[server]:$mailcfg[port])?MAIL?FROM?-?$lastmessage");

}

}

$email_to=$mail['to'];

foreach(explode(',',?$email_to)?as?$touser)?{

$touser?=?trim($touser);

if($touser)?{

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

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?250)?{

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

$lastmessage?=?fgets($fp,?512);

return?$this->error("($mailcfg[server]:$mailcfg[port])?RCPT?TO?-?$lastmessage");

}

}

}

fputs($fp,?"DATA\r\n");

$lastmessage?=?fgets($fp,?512);

if(substr($lastmessage,?0,?3)?!=?354)?{

return?$this->error("($mailcfg[server]:$mailcfg[port])?DATA?-?$lastmessage");

}

$str="To:?$email_to\r\nFrom:?$email_from\r\nSubject:?".$mail['subject']."\r\n\r\n".$mail['content']."\r\n.\r\n";

fputs($fp,?$str);

fputs($fp,?"QUIT\r\n");

return?true;

}

public?function?get_error(){

return?$this->error_msg;

}

private?function?error($msg){

$this->error_msg.=$msg;

return?false;

}

}

?>

簡單的調用例子:

$mailcfg['server']?=?'smtp.163.com';

$mailcfg['port']?=?'25';

$mailcfg['auth']?=?1;

$mailcfg['from']?=?'test?';

$mailcfg['auth_username']?=?'test';

$mailcfg['auth_password']?=?'password';

$stmp=new?stmp($mailcfg);

$mail=array('to'=>'test@gmail.com','subject'=>'測試標題','content'=>'郵件內容PHP面向對象');

if(!$stmp->send($mail)){

echo?$stmp->get_error();

}else{

echo?'mail?succ!';

}

?>

如果發送成功,你就可以去郵箱查看郵件了。^_^

總結

以上是生活随笔為你收集整理的php发送邮件smtp源码,php下使用SMTP发邮件的代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。