php中通过curl smtp发送邮件

 更新时间:2012年06月05日 23:53:24   作者:  
公司的云平台把fsockopen关掉了,如果要使用smtp外网的邮箱来发送邮件的话 只能试试使用curl来进行了
先google了一下,发现很多问相关问题的但没有相关的解答,在phpclasses里也没有找到相关的类于是自己边看stmp的相关协议边开始尝试curl
SMTP协议
这个在网上可以找到多相关的例子,可以自己实验一下使用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下使用strpos需要注意 === 运算符

    php下使用strpos需要注意 === 运算符

    首先应该知道 strpos 函数可能返回布尔值 FALSE,但也可能返回一个与 FALSE 等值的非布尔值,例如 0 或者""。我们应使用 === 运算符来测试本函数的返回值。
    2010-07-07
  • php实现多维数组中每个单元值(数字)翻倍的方法

    php实现多维数组中每个单元值(数字)翻倍的方法

    这篇文章主要介绍了php实现多维数组中每个单元值(数字)翻倍的方法,涉及php操作数组的技巧,需要的朋友可以参考下
    2015-02-02
  • php使用ereg验证文件上传的方法

    php使用ereg验证文件上传的方法

    这篇文章主要介绍了php使用ereg验证文件上传的方法,是非常简单实用的正则验证技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • 浅析PHP原理之变量(Variables inside PHP)

    浅析PHP原理之变量(Variables inside PHP)

    我前面的文章中已经讲过,PHP的执行是通过Zend engine(ZE, Zend引擎), ZE是用C编写的,大家都知道C是一个强类型语言,也就是说,在C中所有的变量在它被声明到最终销毁,都只能保存一种类型的数据。 那么PHP是如何在ZE的基础上实现弱类型的呢
    2013-08-08
  • PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例

    PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例

    这篇文章主要介绍了PHP封装类似thinkphp连贯操作数据库Db类与简单应用,涉及php基于mysqli的数据库连接、增删改查、异常处理等相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • php正则删除img标签的方法示例

    php正则删除img标签的方法示例

    这篇文章主要介绍了php正则删除img标签的方法,结合具体实例形式分析了php针对img标签正则匹配相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • PHP中PDO事务处理操作示例

    PHP中PDO事务处理操作示例

    这篇文章主要介绍了PHP中PDO事务处理操作,结合实例形式分析了php使用pdo的mysql事务处理操作步骤、实现技巧及相关注意事项,需要的朋友可以参考下
    2018-05-05
  • PHP实现的观察者模式实例

    PHP实现的观察者模式实例

    这篇文章主要介绍了PHP实现的观察者模式,结合具体实例形式分析了php观察者模式的定义与使用方法,需要的朋友可以参考下
    2017-06-06
  • PHP产生随机字符串函数

    PHP产生随机字符串函数

    PHP产生随机字符串函数...
    2006-12-12
  • php注册登录系统简化版

    php注册登录系统简化版

    这篇文章主要为大家详细介绍了php注册登录系统简化版的实现步骤,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03

最新评论