分类 PHP 下的文章

CURL


/**
 * curl例子  
 * @param $query
 * [
 *  'url'=>'www.baidu.com', //链接
 *  'timeput'=>30,          //超时时间 秒
 *  'headers'=>''          //请求头信息
 *  'postData'=>''         //请求数据
 *  'proxy'=>'127.0.0.1:8888' //代理
 * ]
 */
function curlSetting($query)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $query['url']); // 设置url
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回请求结果,不直接输出
    curl_setopt($ch, CURLOPT_HEADER, true); // 请求结果中也要包含响应的heade0r
    // 设置超时
    $timeout = isset($query['timeout']) ?: 30;
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 允许跳转
    curl_setopt($ch, CURLOPT_BUFFERSIZE, 1024);

//        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    // 设置请求HEADER
    if (isset($query['headers'])) {
        if (!isAssocArray($query['headers'])) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $query['headers']);
        } else {
            $headers = [];
            foreach ($query['headers'] as $k => $v) $headers[] = "{$k}: {$v}";
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }
    }

    // 设置post及其数据
    if (isset($query['postData']) && !is_null($query['postData'])) {
        curl_setopt($ch, CURLOPT_POST, true);
        if (is_string($query['postData'])) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $query['postData']);
        } elseif (is_array($query['postData'])) {
            $queryString = http_build_query($query['postData']);
            // 有可能出现为应对 hobbies[]=swimming&hobbies[]=football 这种情况而出现的 hobbies[0]=swimming&hobbies[1]=football
            $queryString = preg_replace('/%5B\d+%5D/simU', '%5B%5D', $queryString);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $queryString);
        }
    }

    // 设置代理
    !empty($query['proxy']) && curl_setopt($ch, CURLOPT_PROXY, $query['proxy']);
    $response = curl_exec($ch);
    $curlInfo = curl_getinfo($ch);
    var_dump($curlInfo);

}

curlMulti

// 多线程抓取
class CurlMulti
{
    protected static $mh = null;

    // task中需要包含url header postdata proxy timeout
    public static function send(array $tasks)
    {
        // 添加任务到并行句柄中
        foreach ($tasks as $task) {
            $ch = self::taskSetting($task['url'], $task['headers'], $task['post_data'], $task['proxy'], $task['timeout']);
            curl_multi_add_handle(self::getMh(), $ch);
        }

        $result = [];
        do {
            curl_multi_exec(self::getMh(), $running);

            if (($info = curl_multi_info_read(self::getMh())) !== false) {
                if ($info['result'] === CURLE_OK) {
                    $curlInfo     = curl_getinfo($info['handle']);
                    $response     = curl_multi_getcontent($info['handle']);
                    $body         = substr($response, - $curlInfo['size_download']);
                    $header     = substr($response, 0, strlen($response) - $curlInfo['size_download']);
                    $taskCur    = $tasks[array_search($curlInfo['url'], array_column($tasks, 'url'))];
                    if (!empty($taskCur['callback'])) $body = call_user_func_array($taskCur['callback'], [$body]);
                    $result[]     = [
                        'code'         => $curlInfo['http_code'],
                        'header'    => $header,
                        'body'        => empty($taskCur['callback']) ? $body : call_user_func_array($taskCur['callback'], [$body]),
                        'curlInfo'     => $curlInfo,
                    ];
                }
                curl_close($info['handle']);
                curl_multi_remove_handle(self::getMh(), $info['handle']);
            }

        } while ($running > 0);

        return $result;
    }

    protected static function taskSetting($url, $headers = [], $postData = null, $proxy = '', $timeout = 30)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        !empty($headers) && curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        if (!is_null($postData)) {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        }
        if (!empty($proxy)) curl_setopt($ch, CURLOPT_PROXY, $proxy);
        return $ch;
    }

    protected static function getMh()
    {
        if (is_null(self::$mh)) {
            self::$mh = curl_multi_init();
        }
        return self::$mh;
    }
}

下载地址 https://github.com/weiyixi/PhpMail-SMTP-POP3-IMAP

PhpMail-SMTP-POP3-IMAP 邮件接收发送 Mail receiving and sending

最近遇到一个工程需要自动发件(SMTP)收件(IMAP/POP3)功能,发现很难找到一个PHP的完整包来使用
所以自己综合phpMailer,PhpImap,csdn博客等各开源代码,做一个收发件都包括的库,供新人使用。
有不足之处请指出

imap 收件示例

require_once __DIR__ . '/src/__autoload.php';
set_time_limit(0);
//IMAP收件
//argument is the directory into which attachments are to be saved:
$mailbox = new \src\PhpImap\Mailbox('{imap.qq.com:993/imap/ssl}INBOX', 'XXXXXXX@qq.com', 'XXXXXXX', __DIR__);
//读取所有邮件id到数组:
//Read all messaged into an array:
$mailsIds = $mailbox->searchMailbox('ALL');
if (!$mailsIds) {
    die('Mailbox is empty');
}
// Get the first message and save its attachment(s) to disk:
//获取一份邮件对象 打印出来
$mail = $mailbox->getMail($mailsIds[0]);
var_dump($mail);
die;

pop3 收件示例

require_once __DIR__ . '/src/__autoload.php';
set_time_limit(0);

$host = "tls://pop.126.com"; //‘tls://’为ssl协议加密,端口走加密端口
$user = "XXXXXX@126.com"; //邮箱
$pass = "XXXXXX"; //密码
$rec = new \src\pop3\Pop3($host, 995, 3);
//打开连接
if (!$rec->open())
    die($rec->err_str);
echo "open ";
//登录
if (!$rec->login($user, $pass)) {
    var_dump($rec->err_str);
    die;
}
echo "login";

if (!$rec->stat())
    die($rec->err_str);
echo "You  have" . $rec->messages . "emails,total size:" . $rec->size . "<br>";
if ($rec->messages > 0) {
    //读取邮件列表
    if (!$rec->listmail())
        die($rec->err_str);
    echo "Your mail list:<br>";
    for ($i = 1; $i <= count($rec->mail_list); $i++) {
        echo "mailId:" . $rec->mail_list[$i]['num'] . "Size:" . $rec->mail_list[$i]['size'] . "<BR>";
    }
    //获取一个邮件
    //read One email
    $rec->getmail(1);
    echo "getHeader:<br>";
    for ($i = 0; $i < count($rec->head); $i++) {
        echo htmlspecialchars($rec->head[$i]) . "<br>\n";
    }

    echo "getContent:<BR>";
    for ($i = 0; $i < count($rec->body); $i++) {
        echo htmlspecialchars($rec->body[$i]) . "<br>\n";
    }
}
$rec->close();

die;

SMTP 发件

require_once __DIR__ . '/src/__autoload.php';
set_time_limit(0);

/**
 * @param $sendto_email  收件地址
 * @param $sendto_name   收件人
 * @param $subject       邮件标题
 * @param $body          邮件内容
 * @param $user_name     送件人
 * @param $post_array =[
 *          'server_address'=>'smtp.qq.com',    //smtp  服务器
 *          'port'=>465,                        //端口
 *          'mail_id'=>'AAAA@qq.com',          //账号
 *          'mail_pwd'=>'密码',                   //密码
 *          'mail_address'=>'发件人邮箱'
 * ]
 * @return bool
 * @throws \src\PHPMailer\Exception
 */
var_dump(smtp_mail('XXXXXX@qq.com', 'XXXX', 'hahah', 'aaaaaa', 'XXX', [
    'server_address' => 'smtp.126.com',    //smtp  服务器
    'port' => 465,                        //端口
    'mail_id' => 'XXXXX@126.com',          //账号
    'mail_pwd' => 'XXXXX',                   //密码
    'mail_address' => 'XXXXXX@126.com'
]));
function smtp_mail($sendto_email, $sendto_name, $subject, $body, $user_name, $post_array,$is_html=false)
{
    $mail = new \src\PHPMailer\PHPMailer();
    $mail->SMTPDebug = 0;   // 开启Debug
    $mail->IsSMTP();                // 使用SMTP模式发送新建
    $mail->Host = $post_array['server_address']; // QQ企业邮箱SMTP服务器地址
    $mail->Port = $post_array['port'];  //邮件发送端口,一定是465
    $mail->SMTPAuth = true;         // 打开SMTP认证,本地搭建的也许不会需要这个参数
    $mail->SMTPSecure = "ssl";  // 打开SSL加密,这一句一定要
    $mail->Username = $post_array['mail_id'];   // SMTP用户名
    $mail->Password = $post_array['mail_pwd'];        // 为QQ邮箱SMTP的独立密码,即授权码
    $mail->From = $post_array['mail_address'];      // 发件人邮箱
    $mail->FromName = $user_name;// $post_array['mail_address'];  // 发件人

    $mail->CharSet = "UTF-8";            // 这里指定字符集!
    $mail->Encoding = "base64";
    if (!$mail->AddAddress($sendto_email, $sendto_name)) {
        return false;
    }  // 收件人邮箱和姓名
    $mail->addCC($post_array['mail_address']);//抄送
    $mail->IsHTML($is_html);  // send as HTML
    // 邮件主题
    $mail->Subject = $subject;

    $mail->Body = $body;      //isHTML是true 的时候  这里body有效
    $mail->AltBody = str_replace("<br/>", "\r\n", $body);  //isHTML是false 的时候  这里body有效
    if (!$mail->Send()) {
        return false;
    } else {
        return true;
    }
}