php中通过curl smtp发送邮件


Posted in PHP onJune 05, 2012

先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 相关文章推荐
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
PHP 简单日历实现代码
Oct 28 PHP
ezSQL PHP数据库操作类库
May 16 PHP
基于php split()函数的用法详解
Jun 05 PHP
Laravel框架表单验证详解
Sep 04 PHP
服务器上配置PHP运行环境教程
Feb 12 PHP
PHP+JS三级菜单联动菜单实现方法
Feb 24 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
PHP chr()函数讲解
Feb 11 PHP
PHP生成随机字符串实例代码(字母+数字)
Sep 11 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
Aug 03 PHP
Smarty的配置与高级缓存技术分享
Jun 05 #PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
Jun 05 #PHP
php中json_decode()和json_encode()的使用方法
Jun 04 #PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 #PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 #PHP
PHP仿盗链代码
Jun 03 #PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 #PHP
You might like
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
利用javascript查看html源文件
2006/11/08 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
javascript每日必学之继承
2016/02/23 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
详解AngularJS之$window窗口对象
2018/01/17 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python通过yield实现数组全排列的方法
2015/03/18 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
Python异常处理操作实例详解
2018/05/10 Python
python实现AES加密解密
2019/03/28 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
评析教师个人的自我评价
2014/02/19 职场文书
演讲主持词
2014/03/18 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
表扬信范文
2015/05/04 职场文书
银行资信证明
2015/06/17 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL