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 相关文章推荐
第九节--绑定
Nov 16 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
php 数学运算验证码实现代码
Oct 11 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
Mar 03 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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邮件专题
2006/10/09 PHP
php中用文本文件做数据库的实现方法
2008/03/27 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
laravel 实现向公共模板中传值 (view composer)
2019/10/22 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
python实现图像识别功能
2018/01/29 Python
实例详解Python模块decimal
2019/06/26 Python
Django缓存系统实现过程解析
2019/08/02 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
Python eval函数介绍及用法
2020/11/09 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
Cult Gaia官网:美国生活方式品牌
2019/08/16 全球购物
UNIX文件系统常用命令
2012/05/25 面试题
房地产员工找工作的自我评价
2013/11/15 职场文书
先进个人事迹材料
2014/01/25 职场文书
应聘教师自荐信
2015/03/26 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang