先google了一下,发现很多问相关问题的但没有相关的解答,在phpclasses里也没有找到相关的类于是自己边看stmp的相关协议边开始尝试curl
SMTP协议
这个在网上可以找到多相关的例子,可以自己实验一下使用telnet去连接mail服务器
<BR>$ telnet 邮箱SMTP服务地址 25 <BR>Trying 邮箱服务IP地址... <BR>Connected to 邮箱SMTP服务地址. <BR>Escape character is '^]'. <BR>exchange邮箱服务器地址 Microsoft ESMTP MAIL Service ready at Sat, 2 Jun 2012 15:02:12 +0800 <BR>EHLO 127.0.0.1 <BR>-exchange邮箱服务器地址 Hello [邮箱服务IP地址] <BR>-SIZE <BR>-PIPELINING <BR>-DSN <BR>-ENHANCEDSTATUSCODES <BR>-X-ANONYMOUSTLS <BR>-AUTH NTLM LOGIN <BR>-X-EXPS GSSAPI NTLM <BR>-8BITMIME <BR>-BINARYMIME <BR>-CHUNKING <BR>-XEXCH50 <BR>XRDST <BR>AUTH LOGIN <BR>VXNlcm5hbWU6 <BR>用户名(base64_encode) <BR>UGFzc3dvcmQ6 <BR>密码(base64_encode) <BR>2.7.0 Authentication successful <BR>MAIL FROM:发件箱地址 <BR>2.1.0 Sen<strong style="color:transparent">本文来源gao@daima#com搞(%代@#码@网&</strong><strong>搞gaodaima代码</strong>der OK <BR>RCPT TO:收件箱地址 <BR>2.1.5 Recipient OK <BR>DATA <BR>Start mail input; end with . <BR>要发送的内容(这里的相关的规范有很多) <BR>. <BR>2.6.0 Queued mail for delivery <BR>QUIT <BR>2.0.0 Service closing transmission channel <BR>Connection closed by foreign host. <BR>
php测试代码:
<BR><?php <BR>header("content-type:text/html;charset=utf-8"); <BR>$smtp = array( <BR>"url" => "邮箱SMTP服务器地址", <BR>"port" => "邮箱SMTP服务器端口", // 一般为25 <BR>"username" => "用户名", <BR>"password" => "密码", <BR>"from" => "发件地址", <BR>"to" => "收件地址", <BR>"subject" => "测试一下标题", <BR>"body" => "测试一下内容" <BR>); <BR>$CRLF = "\r\n"; <BR>$test = ""; <BR>$curl = curl_init(); <BR>curl_setopt($curl, CURLOPT_URL, $smtp['url']); <BR>curl_setopt($curl, CURLOPT_PORT, $smtp['port']); <BR>curl_setopt($curl, CURLOPT_TIMEOUT,10); <BR>function inlineCode($str){ <BR>$str = trim($str); <BR>return $str?'=?UTF-8?B?'.base64_encode($str).'?= ':''; <BR>} <BR>function buildHeader($headers){ <BR>$ret = ''; <BR>foreach($headers as $k=>$v){ <BR>$ret.=$k.': '.$v."\n"; <BR>} <BR>return $ret; <BR>} <BR>// <BR>$header = array( <BR>'Return-path'=>'', <BR>'Date'=>date('r'), <BR>'From'=> '', <BR>'MIME-Version'=>'1.0', <BR>'Subject'=>inlineCode($smtp['subject']), <BR>'To'=>$smtp['to'], <BR>'Content-Type'=>'text/html; charset=UTF-8; format=flowed', <BR>'Content-Transfer-Encoding'=>'base64' <BR>); <BR>$data = buildHeader($header).$CRLF.chunk_split(base64_encode($smtp['body'])); <BR>$content = "EHLO ".$smtp["url"].$CRLF; // 先得hello一下 <BR>$content .= "AUTH LOGIN".$CRLF.base64_encode($smtp["username"]).$CRLF.base64_encode($smtp["password"]).$CRLF; // 验证登陆 <BR>$content .= "MAIL FROM:".$smtp["from"].$CRLF; // 发件地址 <BR>$content .= "RCPT TO:".$smtp["to"].$CRLF; // 收件地址 <BR>$content .= "DATA".$CRLF.$data.$CRLF.".".$CRLF; // 发送内容 <BR>$content .= "QUIT".$CRLF; // 退出 <BR>curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl接收返回数据 <BR>curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $content); <BR>$test = curl_exec($curl); <BR>var_dump($test); <BR>echo "<br />\r\n"; <BR>var_dump($content); <BR>// 结束 <BR>curl_close($curl); <BR>
以上只是测试的php
包测试+修改花了近6个小时让产品的代码兼容了fsockopen和curl
以后有空写个兼容fsockopen和curl简单发送邮件的smtp类