最近一個專案要用到SMTP發送郵件,之前的函式庫類不存在了,又不喜歡安裝pear或使用pear的net/smtp類,感覺太複雜了。就直接從discuz中抽取出核心稍微修改了一下。
從協定分析網路上,查找到SMTP協定的命令與應答,SMTP協定在發送SMTP和接收SMTP之間的會話是靠發送SMTP的SMTP指令和接收SMTP回饋的應答來完成的。常用的指令如下:
HELLO<domain><CRLF>辨識發送方到接收SMTP的一個HELLO指令
MAIL FROM:<reverse-path><CRLFLF><此指令告訴接收方一個新郵件發送的開始,並對所有的狀態和緩衝區進行初始化。此命令開始一個郵件傳輸處理,最終完成將郵件資料傳送到一個或多個郵箱中。
RCPT TO:<forward-path><CRLF><forward-path>標識各個郵件接收者的地址
DATA< ,以<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. 220 Welcome to coremail System(With Anti-Spam) 2.1 for 263(040326)
HELO weiqiong@cctk.net.com
250 Ok
rcpt to:g2_t1@263.net
250 Ok
data
354 End data with
quit
221 Bye
Connection closed by foreign Bye
Connection closed by foreign Bye
Connection closed by foreign
class stmp{
private $mailcfg=array();
私人 $this->mailcfg =$mailcfg;
}
公用函數 send($mail){
ockopen($mailcfg['server'], $cfcfg['port'], $errno, $errstr, 30)) {
return $this->error("( $mail)[SM]:$mail 連接到伺服器連接埠連接埠請檢查您的「mail_config.php」。 512);
if(substr($ lastmessage, 0, 3) !='220') {
return $this->error("$mailcfg[]:$mailcfg[ }
fputs ($fp, ($mailcfg['auth'] ? 'EHLO' : 'HELO')." ".$mailcfg['auth_username']."rn");
);
if(substr($lastmessage, 0, 3) != 220 && substr($lastmes turn $this->error("($mailcfg[server ]) :$mailcfg[埠]) HELO/EHLO - $lastmessage");
}
$lastmessage, 3, 1) != '-' | empty($lastmessage)) {
break;
} $lastmessage = fgets($fp, 512);
}
($$cf. 🎜> fputs($fp, "AUTH LOGINrn");
if(substr($lastmessage, 0, 3) != 334) {
$this->error("($mailcfg[server]:$mailcfg[port]) AUTH LOGIN - $lastmessage" );
64_encode($mailcfg['auth_username']) ."rn");
$lastmessage = fgets($fp, 512);
return $this->error(" ($mailcfg[server]:$mailcfg[port]) USERNAME - $lastmessage") ;
}
fputs($fp, base64_encode($mailcfg['auth_password'])."rn");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 235) { $mailcfg[port]) PASSWORD - $lastmessage") ;
,
$email_from = $mail];
}
fputs($fp, "郵件來自: . );
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 250) {
.*/ ", "\1", $email_from).">rn");
$lastmessage = fgets($fp, 512);
if(substr($lastmessage, 0, 3) != 250) { $mailcfg[port]) MAIL FROM - $lastmessage" ) ;
}
}
each(explode(',', $email_to) as $touser) {
$touser = 修剪( $touser);
if($touser) {
$lastmessage = fgets($fp, 512 );
if(substr($lastmessage, 0, 3) != 250) {
$lastmessage = fgets($fp, 5) 12 );
return $this->error("($mailcfg[server]:$mail }
}
($ fp, "DATArn");
$lastmessage = fgets($fp, 512);
返回$this-> error( "($mailcfg[伺服器]:$mailcfg[連接埠]) 資料 - $lastmessage") ;
}
$str="收件人:$email_tornFrom:$email_fromrnSubject:".$mail['subject']."rnrn".$ $fp, $str);
fputs($fp, "QUITrn");
return $this->error_msg;
}
來自私有函數 error($msg){
$ }
}
? >
簡單的呼叫範例:
$mailcfg['伺服器'] = 'smtp.163.com';
mail $mailcfg['auth'] = 1;
$mailcfg['from'] = 'test
$mailcfg['auth_password'] = '密碼';
$stmp gmail.com','subject' =>'測試標題','content'=>'郵件內容PHP物件導向');
if(!$stmp- >send($mail)){
echo $stmp->get_error();
成功! ';
}
? >
如果發送成功,你就可以去郵箱查看郵件了。 ^_^
以上就介紹了smartupload.jar php下使用SMTP發郵件的程式碼,包含了smartupload.jar方面的內容,希望對PHP教學有興趣的朋友有幫助。