php中通過(guò)curl smtp發(fā)送郵件
更新時(shí)間:2012年06月05日 23:53:24 作者:
公司的云平臺(tái)把fsockopen關(guān)掉了,如果要使用smtp外網(wǎng)的郵箱來(lái)發(fā)送郵件的話 只能試試使用curl來(lái)進(jìn)行了
先google了一下,發(fā)現(xiàn)很多問(wèn)相關(guān)問(wèn)題的但沒(méi)有相關(guān)的解答,在phpclasses里也沒(méi)有找到相關(guān)的類于是自己邊看stmp的相關(guān)協(xié)議邊開(kāi)始嘗試curl
SMTP協(xié)議
這個(gè)在網(wǎng)上可以找到多相關(guān)的例子,可以自己實(shí)驗(yàn)一下使用telnet去連接mail服務(wù)器
$ telnet 郵箱SMTP服務(wù)地址 25
Trying 郵箱服務(wù)IP地址...
Connected to 郵箱SMTP服務(wù)地址.
Escape character is '^]'.
exchange郵箱服務(wù)器地址 Microsoft ESMTP MAIL Service ready at Sat, 2 Jun 2012 15:02:12 +0800
EHLO 127.0.0.1
-exchange郵箱服務(wù)器地址 Hello [郵箱服務(wù)IP地址]
-SIZE
-PIPELINING
-DSN
-ENHANCEDSTATUSCODES
-X-ANONYMOUSTLS
-AUTH NTLM LOGIN
-X-EXPS GSSAPI NTLM
-8BITMIME
-BINARYMIME
-CHUNKING
-XEXCH50
XRDST
AUTH LOGIN
VXNlcm5hbWU6
用戶名(base64_encode)
UGFzc3dvcmQ6
密碼(base64_encode)
2.7.0 Authentication successful
MAIL FROM:發(fā)件箱地址
2.1.0 Sender OK
RCPT TO:收件箱地址
2.1.5 Recipient OK
DATA
Start mail input; end with <CRLF>.<CRLF>
要發(fā)送的內(nèi)容(這里的相關(guān)的規(guī)范有很多)
.
2.6.0 <0b476f30-3b96-4e3d-84d2-395a96d34000@exchange郵箱服務(wù)器地址> Queued mail for delivery
QUIT
2.0.0 Service closing transmission channel
Connection closed by foreign host.
php測(cè)試代碼:
<?php
header("content-type:text/html;charset=utf-8");
$smtp = array(
"url" => "郵箱SMTP服務(wù)器地址",
"port" => "郵箱SMTP服務(wù)器端口", // 一般為25
"username" => "用戶名",
"password" => "密碼",
"from" => "發(fā)件地址",
"to" => "收件地址",
"subject" => "測(cè)試一下標(biāo)題",
"body" => "測(cè)試一下內(nèi)容"
);
$CRLF = "\r\n";
$test = "";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $smtp['url']);
curl_setopt($curl, CURLOPT_PORT, $smtp['port']);
curl_setopt($curl, CURLOPT_TIMEOUT,10);
function inlineCode($str){
$str = trim($str);
return $str?'=?UTF-8?B?'.base64_encode($str).'?= ':'';
}
function buildHeader($headers){
$ret = '';
foreach($headers as $k=>$v){
$ret.=$k.': '.$v."\n";
}
return $ret;
}
//
$header = array(
'Return-path'=>'<'.$smtp['from'].'>',
'Date'=>date('r'),
'From'=> '<'.$smtp['from'].'>',
'MIME-Version'=>'1.0',
'Subject'=>inlineCode($smtp['subject']),
'To'=>$smtp['to'],
'Content-Type'=>'text/html; charset=UTF-8; format=flowed',
'Content-Transfer-Encoding'=>'base64'
);
$data = buildHeader($header).$CRLF.chunk_split(base64_encode($smtp['body']));
$content = "EHLO ".$smtp["url"].$CRLF; // 先得hello一下
$content .= "AUTH LOGIN".$CRLF.base64_encode($smtp["username"]).$CRLF.base64_encode($smtp["password"]).$CRLF; // 驗(yàn)證登陸
$content .= "MAIL FROM:".$smtp["from"].$CRLF; // 發(fā)件地址
$content .= "RCPT TO:".$smtp["to"].$CRLF; // 收件地址
$content .= "DATA".$CRLF.$data.$CRLF.".".$CRLF; // 發(fā)送內(nèi)容
$content .= "QUIT".$CRLF; // 退出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl接收返回?cái)?shù)據(jù)
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $content);
$test = curl_exec($curl);
var_dump($test);
echo "<br/>\r\n";
var_dump($content);
// 結(jié)束
curl_close($curl);
以上只是測(cè)試的php
包測(cè)試+修改花了近6個(gè)小時(shí)讓產(chǎn)品的代碼兼容了fsockopen和curl
以后有空寫(xiě)個(gè)兼容fsockopen和curl簡(jiǎn)單發(fā)送郵件的smtp類
SMTP協(xié)議
這個(gè)在網(wǎng)上可以找到多相關(guān)的例子,可以自己實(shí)驗(yàn)一下使用telnet去連接mail服務(wù)器
復(fù)制代碼 代碼如下:
$ telnet 郵箱SMTP服務(wù)地址 25
Trying 郵箱服務(wù)IP地址...
Connected to 郵箱SMTP服務(wù)地址.
Escape character is '^]'.
exchange郵箱服務(wù)器地址 Microsoft ESMTP MAIL Service ready at Sat, 2 Jun 2012 15:02:12 +0800
EHLO 127.0.0.1
-exchange郵箱服務(wù)器地址 Hello [郵箱服務(wù)IP地址]
-SIZE
-PIPELINING
-DSN
-ENHANCEDSTATUSCODES
-X-ANONYMOUSTLS
-AUTH NTLM LOGIN
-X-EXPS GSSAPI NTLM
-8BITMIME
-BINARYMIME
-CHUNKING
-XEXCH50
XRDST
AUTH LOGIN
VXNlcm5hbWU6
用戶名(base64_encode)
UGFzc3dvcmQ6
密碼(base64_encode)
2.7.0 Authentication successful
MAIL FROM:發(fā)件箱地址
2.1.0 Sender OK
RCPT TO:收件箱地址
2.1.5 Recipient OK
DATA
Start mail input; end with <CRLF>.<CRLF>
要發(fā)送的內(nèi)容(這里的相關(guān)的規(guī)范有很多)
.
2.6.0 <0b476f30-3b96-4e3d-84d2-395a96d34000@exchange郵箱服務(wù)器地址> Queued mail for delivery
QUIT
2.0.0 Service closing transmission channel
Connection closed by foreign host.
php測(cè)試代碼:
復(fù)制代碼 代碼如下:
<?php
header("content-type:text/html;charset=utf-8");
$smtp = array(
"url" => "郵箱SMTP服務(wù)器地址",
"port" => "郵箱SMTP服務(wù)器端口", // 一般為25
"username" => "用戶名",
"password" => "密碼",
"from" => "發(fā)件地址",
"to" => "收件地址",
"subject" => "測(cè)試一下標(biāo)題",
"body" => "測(cè)試一下內(nèi)容"
);
$CRLF = "\r\n";
$test = "";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $smtp['url']);
curl_setopt($curl, CURLOPT_PORT, $smtp['port']);
curl_setopt($curl, CURLOPT_TIMEOUT,10);
function inlineCode($str){
$str = trim($str);
return $str?'=?UTF-8?B?'.base64_encode($str).'?= ':'';
}
function buildHeader($headers){
$ret = '';
foreach($headers as $k=>$v){
$ret.=$k.': '.$v."\n";
}
return $ret;
}
//
$header = array(
'Return-path'=>'<'.$smtp['from'].'>',
'Date'=>date('r'),
'From'=> '<'.$smtp['from'].'>',
'MIME-Version'=>'1.0',
'Subject'=>inlineCode($smtp['subject']),
'To'=>$smtp['to'],
'Content-Type'=>'text/html; charset=UTF-8; format=flowed',
'Content-Transfer-Encoding'=>'base64'
);
$data = buildHeader($header).$CRLF.chunk_split(base64_encode($smtp['body']));
$content = "EHLO ".$smtp["url"].$CRLF; // 先得hello一下
$content .= "AUTH LOGIN".$CRLF.base64_encode($smtp["username"]).$CRLF.base64_encode($smtp["password"]).$CRLF; // 驗(yàn)證登陸
$content .= "MAIL FROM:".$smtp["from"].$CRLF; // 發(fā)件地址
$content .= "RCPT TO:".$smtp["to"].$CRLF; // 收件地址
$content .= "DATA".$CRLF.$data.$CRLF.".".$CRLF; // 發(fā)送內(nèi)容
$content .= "QUIT".$CRLF; // 退出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl接收返回?cái)?shù)據(jù)
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $content);
$test = curl_exec($curl);
var_dump($test);
echo "<br/>\r\n";
var_dump($content);
// 結(jié)束
curl_close($curl);
以上只是測(cè)試的php
包測(cè)試+修改花了近6個(gè)小時(shí)讓產(chǎn)品的代碼兼容了fsockopen和curl
以后有空寫(xiě)個(gè)兼容fsockopen和curl簡(jiǎn)單發(fā)送郵件的smtp類
您可能感興趣的文章:
- PHPMailer郵件類利用smtp.163.com發(fā)送郵件方法
- PHP mail 通過(guò)Windows的SMTP發(fā)送郵件失敗的解決方案
- php smtp實(shí)現(xiàn)發(fā)送郵件功能
- php基于socket實(shí)現(xiàn)SMTP發(fā)送郵件的方法
- php mailer類調(diào)用遠(yuǎn)程SMTP服務(wù)器發(fā)送郵件實(shí)現(xiàn)方法
- php使用pear_smtp發(fā)送郵件
- PHP實(shí)現(xiàn)支持SSL連接的SMTP郵件發(fā)送類
- php使用smtp發(fā)送支持附件的郵件示例
- PHP的一個(gè)完整SMTP類(解決郵件服務(wù)器需要驗(yàn)證時(shí)的問(wèn)題)
- PHP使用SMTP郵件服務(wù)器發(fā)送郵件示例
相關(guān)文章
Yii PHP Framework實(shí)用入門教程(詳細(xì)介紹)
本篇文章是對(duì)Yii PHP Framework實(shí)用入門教程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP實(shí)現(xiàn)鏈?zhǔn)讲僮鞯娜N方法詳解
這篇文章主要介紹了PHP實(shí)現(xiàn)鏈?zhǔn)讲僮鞯娜N方法,結(jié)合實(shí)例形式分析了php鏈?zhǔn)讲僮鞯南嚓P(guān)實(shí)現(xiàn)技巧與使用注意事項(xiàng),需要的朋友可以參考下2017-11-11php基于session鎖防止阻塞請(qǐng)求的方法分析
這篇文章主要介紹了php基于session鎖防止阻塞請(qǐng)求的方法,結(jié)合實(shí)例形式分析了phpsession鎖的使用及防止阻塞請(qǐng)求的相關(guān)操作技巧,需要的朋友可以參考下2017-08-08php將字符串轉(zhuǎn)化成date存入數(shù)據(jù)庫(kù)的兩種方式
這篇文章主要介紹了php將字符串轉(zhuǎn)化成date存入數(shù)據(jù)庫(kù)的兩種方式,需要的朋友可以參考下2014-04-04淺析php fwrite寫(xiě)入txt文件的時(shí)候用 \r\n不能換行的問(wèn)題
以下是對(duì)php中fwrite寫(xiě)入txt文件的時(shí)候用 \r\n不能換行的問(wèn)題進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08基于PHP輸出緩存(output_buffering)的深入理解
本篇文章是對(duì)PHP輸出緩存(output_buffering)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php實(shí)現(xiàn)根據(jù)詞頻生成tag云的方法
這篇文章主要介紹了php實(shí)現(xiàn)根據(jù)詞頻生成tag云的方法,涉及php分析與操作字符串以及標(biāo)簽云的生成技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04