php中通过curl smtp发送邮件
2015-01-24信息快讯网
公司的云平台把fsockopen关掉了,如果要使用smtp外网的邮箱来发送邮件的话 只能试试使用curl来进行了
先google了一下,发现很多问相关问题的但没有相关的解答,在phpclasses里也没有找到相关的类于是自己边看stmp的相关协议边开始尝试curlSMTP协议
这个在网上可以找到多相关的例子,可以自己实验一下使用telnet去连接mail服务器
$ telnet 邮箱SMTP服务地址 25 Trying 邮箱服务IP地址... Connected to 邮箱SMTP服务地址. Escape character is '^]'. exchange邮箱服务器地址 Microsoft ESMTP MAIL Service ready at Sat, 2 Jun 2012 15:02:12 +0800 EHLO 127.0.0.1 -exchange邮箱服务器地址 Hello [邮箱服务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:发件箱地址 2.1.0 Sender OK RCPT TO:收件箱地址 2.1.5 Recipient OK DATA Start mail input; end with <CRLF>.<CRLF> 要发送的内容(这里的相关的规范有很多) . 2.6.0 <0b476f30-3b96-4e3d-84d2-395a96d34000@exchange邮箱服务器地址> Queued mail for delivery QUIT 2.0.0 Service closing transmission channel Connection closed by foreign host.
php测试代码:
<?php header("content-type:text/html;charset=utf-8"); $smtp = array( "url" => "邮箱SMTP服务器地址", "port" => "邮箱SMTP服务器端口", // 一般为25 "username" => "用户名", "password" => "密码", "from" => "发件地址", "to" => "收件地址", "subject" => "测试一下标题", "body" => "测试一下内容" ); $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; // 验证登陆 $content .= "MAIL FROM:".$smtp["from"].$CRLF; // 发件地址 $content .= "RCPT TO:".$smtp["to"].$CRLF; // 收件地址 $content .= "DATA".$CRLF.$data.$CRLF.".".$CRLF; // 发送内容 $content .= "QUIT".$CRLF; // 退出 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl接收返回数据 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $content); $test = curl_exec($curl); var_dump($test); echo "<br/>\r\n"; var_dump($content); // 结束 curl_close($curl);
以上只是测试的php
包测试+修改花了近6个小时让产品的代码兼容了fsockopen和curl
以后有空写个兼容fsockopen和curl简单发送邮件的smtp类
解析php中die(),exit(),return的区别
解析posix与perl标准的正则表达式区别
PHP的curl实现get,post和cookie(实例介绍)
深入PHP curl参数的详解
解析php curl_setopt 函数的相关应用及介绍
探讨:parse url解析URL,返回其组成部分
利用curl 多线程 模拟 并发的详解
基于PHP CURL用法的深入分析
PHP 查找字符串常用函数介绍
Smarty的配置与高级缓存技术分享
PHP中return 和 exit 、break和contiue 区别与用法
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
JS中encodeURIComponent函数用php解码的代码
php中通过curl模拟登陆discuz论坛的实现代码
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
yii框架中的Url生产问题小结
比file_get_contents稳定的curl_get_contents分享
学习使用curl采集curl使用方法
php curl常见错误:SSL错误、bool(false)