PHP:如何通过SMTP与邮件服务器通信?
如何使用PHP通过SMTP与邮件服务器通信?查找mail()文档。查看。使用打开套接字。使用写入套接字。使用或逐字节使用逐行读取套接字。可能您正在查找以下内容: 这些示例使用Pear邮件包:PHP:如何通过SMTP与邮件服务器通信?,php,smtp,Php,Smtp,如何使用PHP通过SMTP与邮件服务器通信?查找mail()文档。查看。使用打开套接字。使用写入套接字。使用或逐字节使用逐行读取套接字。可能您正在查找以下内容: 这些示例使用Pear邮件包: http://www.cyberciti.biz/tips/howto-php-send-email-via-smtp-authentication.html看看Zend_Mail它拥有处理邮件所需的所有功能 -http://framework.zend.com -http://framework.ze
http://www.cyberciti.biz/tips/howto-php-send-email-via-smtp-authentication.html看看Zend_Mail它拥有处理邮件所需的所有功能 -http://framework.zend.com
-http://framework.zend.com/manual/en/zend.mail.html我为我个人的
Email()
方法写了这段代码,也许它能有所帮助。我使用的正则表达式能够验证来自SMTP服务器的每个回复
if (isset($smtp) === true)
{
$result = null;
$stream = stream_socket_client($smtp);
if (is_resource($stream) === true)
{
$data = array('HELO ' . $_SERVER['HTTP_HOST']);
$result .= substr(ltrim(fread($stream, 8192)), 0, 3);
if (preg_match('~^220~', $result) > 0)
{
$auth = array_slice(func_get_args(), 8, 2);
if (count($auth) == 2)
{
$data = array_merge($data, array('AUTH LOGIN'), array_map('base64_encode', $auth));
}
$data[] = sprintf('MAIL FROM: <%s>', implode('', array_slice($from, 0, 1)));
foreach (array_merge(array_values($to), array_values($cc), array_values($bcc)) as $value)
{
$data[] = sprintf('RCPT TO: <%s>', $value);
}
$data[] = 'DATA';
$data[] = implode("\r\n", array_merge(array_diff_key($header, array('Bcc' => true)), array(''), $content, array('.')));
$data[] = 'QUIT';
while (preg_match('~^220(?>250(?>(?>334){1,2}(?>235)?)?(?>(?>250){1,}(?>354(?>250)?)?)?)?$~', $result) > 0)
{
if (fwrite($stream, array_shift($data) . "\r\n") !== false)
{
$result .= substr(ltrim(fread($stream, 8192)), 0, 3);
}
}
if (count($data) > 0)
{
if (fwrite($stream, array_pop($data) . "\r\n") !== false)
{
$result .= substr(ltrim(fread($stream, 8192)), 0, 3);
}
}
}
fclose($stream);
}
return (preg_match('~221$~', $result) > 0) ? true : false;
}
if(isset($smtp)==true)
{
$result=null;
$stream=stream\u socket\u客户端($smtp);
if(is_资源($stream)==true)
{
$data=array('HELO'.$\u服务器['HTTP\u主机']);
$result.=substr(ltrim(fread($stream,8192)),0,3);
如果(预匹配(“^220~”,$result)>0)
{
$auth=array\u slice(func\u get\u args(),8,2);
如果(计数($auth)==2)
{
$data=array_merge($data,array('AUTH LOGIN'),array_map('base64_encode',$AUTH));
}
$data[]=sprintf('mailfrom:',内爆('',array_slice($FROM,0,1));
foreach(数组\合并(数组\值($to)、数组\值($cc)、数组\值($bcc))作为$value)
{
$data[]=sprintf('RCPT TO:',$value);
}
$data[]=“数据”;
$data[]=内爆(“\r\n”,数组合并(数组差异键($header,array('Bcc'=>true)),数组(“”),$content,数组(');
$data[]=“退出”;
而(preg_匹配(“^220(?>250(?>(?>334){1,2}(?>235)?)?(?>(?>250){1,}(?>354(?>250)?)?)?$,$result)>0)
{
if(fwrite($stream,array_shift($data)。“\r\n”)!==false)
{
$result.=substr(ltrim(fread($stream,8192)),0,3);
}
}
如果(计数($data)>0)
{
if(fwrite($stream,array_pop($data)。“\r\n”)!==false)
{
$result.=substr(ltrim(fread($stream,8192)),0,3);
}
}
}
fclose($流);
}
返回(preg_match(“~221$~”,$result)>0)?true:false;
}
你不明白我在问什么。@Bronislaw我真的认为他明白,这是另一个资源如果你不喜欢答案,请在你的问题中详细说明。我需要发送例如RCPT到comand并获得回复。。。我不想发邮件。@Bronislaw请在你原来的帖子中添加这一点和更多细节。尽可能把问题弄清楚,这样我们才能给你一个非常清楚的答案。如果你认为人们不明白你的问题,请澄清你的问题……这正是我想要的。注意:使用fwrite()
与smtp服务器通信时,必须使用换行符“\r\n”
终止命令字符串,smtp服务器才能开始执行命令。