博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php 加密收发邮件
阅读量:4138 次
发布时间:2019-05-25

本文共 4162 字,大约阅读时间需要 13 分钟。

《一》

在测试环境中使用Hotmail工程收发邮件,需要程序对加密连接邮件服务器做工作。

一、smtp 发送邮件

如果用户设置了邮件服务器是加密(安全)连接方式,则PHP程序在与邮件服务器连接成功,第一次发送“HELO”后,将链接管道设置为加密方式,下面是SMTP测试连接的代码。

if($svrparam['secureconn']=='1'){

fputs($smtpConnect, "STARTTLS". $newLine);

$smtpResponse = fgets($smtpConnect, 4096);

if( substr($smtpResponse,0,3) == '220' )

$ret .= '<p class="success" title="'.$smtpResponse.'"><i></i>STARTTLS 成功</p>';

else{

$ret .= '<p class="err" title="'.$smtpResponse.'"><i></i>STARTTLS 失败</p>';

echo $ret;exit;

}

// 将通讯管道设置为加密模式

if(!stream_socket_enable_crypto($smtpConnect, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {

$ret .= '<p class="err"><i></i>加密管道失败</p>';

echo $ret;exit;

}

// you have to say HELO again after TLS is started

fputs($smtpConnect, "HELO $localhost". $newLine);

$smtpResponse = fgets($smtpConnect, 4096);

if( substr($smtpResponse,0,3) == '250' )

$ret .= '<p class="success" title="'.$smtpResponse.'"><i></i>与服务器二次握手成功</p>';

else{

$ret .= '<p class="err" title="'.$smtpResponse.'"><i></i>与服务器二次握手失败</p>';

echo $ret;exit;

}

}

二、POP3 接收邮件

imap_open使用非加密方式连接POP3服务器时的连接字符串:

$imapopenstr="{".$svrparam['rcvsvr']."/pop3:".$svrparam['rcvport']."}inbox";

使用加密方式链接POP3服务器时的连接字符串:

$imapopenstr="{".$svrparam['rcvsvr']."/pop3:".$svrparam['rcvport']."/ssl}inbox";

option中增加了ssl。

《二》

pop3加密  imap接收邮件,做case,加上ssl就可以。

在smtp发送时ssl加密时可能遇到的问题,连接过程同博客”PHP 加密收发邮件“

一、基本流程

//1.打开sock通道

$smtp = fsockopen('smtp.live.com', 25, $errno, $errstr, $timeout);

//2.发送 ehlo  命令,$_POST['DomainName'] 主机名,可以自己取

cmd( "EHLO {$_POST['DomainName']}" );

//3.启动tls加密

cmd( "STARTTLS" );

//4.将通道设为加密模式

stream_socket_enable_crypto( $smtp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT );

//5.再次 ehlo

cmd( "EHLO {$_POST['DomainName']}" );

//6.登录命令

cmd( "AUTH LOGIN" );

//输入用户名

cmd(  "USERNAME_HERE" );

//输入密码

cmd(  "PASSWORD_HERE" );

二、用smtp发送邮件时,如果你所用的邮箱服务器没有限制要加密收发邮件,那么只要有第 1,2,6步骤,就可以成功发送了

三、但当 服务器要求加密时,就一定要有3,4步,否则当然是连接不上啦。这里第5步不是必须的,不写也不会报错。

四、可能出现的问题

问题一:

报错:Warning stream_socket_enable_crypto() []: this stream does not support SSL/crypto in

意思是不支持ssl,输出phpinfo,发现自己的php环境没有安装ssl扩展,有些默认安装了,有些没有安装

这里写下windows下的安装方法

1、拷贝PHP 目录中的libeay32.dll, ssleay32.dll, php5ts.dll, php ext 目录下 php_curl.dll 文件到
system32 目录。(一定要拷贝全啊,不要丢掉哪个,不然会报错的)
2、修改php.ini:配置好extension_dir ,去掉extension = php_curl.dll  和 extension=php_openssl.dll 前面的分号。

3、重起apache。

再次输出phpinfo,看到如下内容就安装成功了

Registered Stream Socket Transports tcp, udp, ssl, sslv3, sslv2, tls

问题二:

AUTH LOGIN的时候,从网上找,发现都写着 base64_encode("USERNAME_HERE" ),base64_encode("PASSWORD_HERE");自己也这样写了,报错了AUTH command failed: 5.0.0 Authentication Failed,去掉之后正常发送邮件

还有一点要注意的就是,发送邮件加密的这种感官上比平时的要慢三四秒钟

stream_socket_enable_crypto

(PHP 5 >= 5.1.0)

stream_socket_enable_crypto — Turns encryption on/off on an already connected socket

 说明

 
stream_socket_enable_crypto ( 
resource $stream , 
bool $enable [, 
int $crypto_type [, 
resource $session_stream ]] )

Enable or disable encryption on the stream.

Once the crypto settings are established, cryptography can be turned on and off dynamically by passing TRUE or FALSE in the enableparameter.

 参数

stream

The stream resource.

enable

Enable/disable cryptography on the stream.

crypto_type

Setup encryption on the stream. Valid methods are

  • STREAM_CRYPTO_METHOD_SSLv2_CLIENT
  • STREAM_CRYPTO_METHOD_SSLv3_CLIENT
  • STREAM_CRYPTO_METHOD_SSLv23_CLIENT
  • STREAM_CRYPTO_METHOD_TLS_CLIENT
  • STREAM_CRYPTO_METHOD_SSLv2_SERVER
  • STREAM_CRYPTO_METHOD_SSLv3_SERVER
  • STREAM_CRYPTO_METHOD_SSLv23_SERVER
  • STREAM_CRYPTO_METHOD_TLS_SERVER

session_stream

Seed the stream with settings from session_stream.

 返回值

Returns TRUE on success, FALSE if negotiation has failed or 0 if there isn't enough data and you should try again (only for non-blocking sockets).

 范例

Example #1 stream_socket_enable_crypto() example

<?php
$fp 
stream_socket_client("tcp://myproto.example.com:31337"$errno$errstr30);
if (!
$fp) {
    die(
"Unable to connect: $errstr ($errno)");
}
/* Turn on encryption for login phase */
stream_socket_enable_crypto($fptrueSTREAM_CRYPTO_METHOD_SSLv23_CLIENT);
fwrite($fp"USER god\r\n");
fwrite($fp"PASS secret\r\n");
/* Turn off encryption for the rest */
stream_socket_enable_crypto($fpfalse);
while (
$motd fgets($fp)) {
    echo 
$motd;
}
fclose($fp);
?>

以上例程的输出类似于:

 

转载地址:http://kbhvi.baihongyu.com/

你可能感兴趣的文章
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
异常 Java学习Day_15
查看>>
Mysql初始化的命令
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>
Servlet进阶和JSP基础
查看>>
servlet中的cookie和session
查看>>
过滤器及JSP九大隐式对象
查看>>
软件(项目)的分层
查看>>
菜单树
查看>>
Servlet的生命周期
查看>>