php 通过sendcloud发送邮件&附件功能

通过sendcloud发送邮箱&附件功能

自己在yii2/laravel5.4两个框架上得到验证,这次直接上代码使用的是yii2,需要laravel代码的同学可以私我
废话不多说,直接上干货
DEMO下载地址:http://www.sendcloud.net/doc/email_v2/code/
php 通过sendcloud发送邮件&附件功能_第1张图片

下载完成以后就能看到官方给我们的例子

function send_mail() {
        $url = 'http://api.sendcloud.net/apiv2/mail/send';
		
		//就是一些配置参数,建议写成配置文件
        $API_USER = '...';
        $API_KEY = '...';
        $param = array(
            'apiUser' => $API_USER, # 使用api_user和api_key进行验证
            'apiKey' => $API_KEY,
            'from' => '[email protected]', # 发信人,用正确邮件地址替代
            'fromName' => 'SendCloud',
            'to' => '[email protected]', # 收件人地址,用正确邮件地址替代,多个地址用';'分隔
            'subject' => 'Sendcloud php webapi with attachment example',
            'html' => '欢迎使用SendCloud',
            'respEmailId' => 'true'
        );
        
		//上传的附近路劲信息
        $file = "./test.txt"; #你的附件路径1
        $handle = fopen($file,'rb');
        $content = fread($handle,filesize($file));
        
        
        $file2 = "./test2.txt"; #你的附件路径2
        $handle2 = fopen($file2,'rb');
        $content2 = fread($handle2,filesize($file2));
        
        

        $eol = "\r\n";
        $data = '';

        $mime_boundary=md5(time());

        // 配置参数
        foreach ( $param as $key => $value ) { 
            $data .= '--' . $mime_boundary . $eol;  
            $data .= 'Content-Disposition: form-data; '; 
            $data .= "name=" . $key . $eol . $eol; 
            $data .= $value . $eol; 
        }

        // 配置文件
        $data .= '--' . $mime_boundary . $eol;
        $data .= 'Content-Disposition: form-data; name="attachments"; filename="filename.txt"' . $eol;
        $data .= 'Content-Type: text/plain' . $eol;
        $data .= 'Content-Transfer-Encoding: binary' . $eol . $eol;
        $data .= $content . $eol;
        
        $data .= '--' . $mime_boundary . $eol;
        $data .= 'Content-Disposition: form-data; name="attachments"; filename="filename2.txt"' . $eol;
        $data .= 'Content-Type: text/plain' . $eol;
        $data .= 'Content-Transfer-Encoding: binary' . $eol . $eol;
        $data .= $content2 . $eol;
        
        $data .= "--" . $mime_boundary . "--" . $eol . $eol; 

        $options = array(
            'http' => array(
                'method' => 'POST',//邮件发送必须是post
                'header' => 'Content-Type: multipart/form-data;boundary='.$mime_boundary . $eol,
                'content' => $data
        ));
        $context  = stream_context_create($options);
        $result = file_get_contents($url, FILE_TEXT, $context);

        return $result;
        fclose($handle);
        fclose($handle2);
}

以上就是官方给我们提供的demo,也没有什么特别需要主要的.根据自己项目需求自己修改就好,下面给出yii2框架结合sendcloud发送邮件

public static function sendMailUsingSendCloud($email='',$file=[]){
        if (empty($email))return json_encode(['result'=>false,"statusCode"=>1,'msg'=>'邮箱不正确'],JSON_UNESCAPED_UNICODE);
        $cache = \Yii::$app->cache;
        
        //验证email请求时间
        if ($cache->exists($email)){
            return json_encode(['result'=>false,"statusCode"=>1,'msg'=>'请求频繁,请稍后重试'],JSON_UNESCAPED_UNICODE);
        }
        //缓存2分钟
        $cache->add($email,1,2);
        
        $url = 'http://api.sendcloud.net/apiv2/mail/send';
        
        $param = array(
            'apiUser'     => \Yii::$app->params['sendcloud_API_user'], # 使用api_user和api_key进行验证
            'apiKey'      => \Yii::$app->params['sendcloud_API_key'],
            'from'        => \Yii::$app->params['sendcloud_from'], # 发信人,用正确邮件地址替代
            'mail_from'   => \Yii::$app->params['sendcloud_from'], # 发信人,用正确邮件地址替代
            'fromName'    => \Yii::$app->params['sendcloud_fromName'],
            'to'          => $email, # 收件人地址,用正确邮件地址替代,多个地址用';'分隔
            'subject'     => \Yii::$app->params['sendcloud_subject'],
            'html'        => \Yii::$app->params['sendcloud_html'],
            'respEmailId' => 'true'
        );
        
        $eol = "\r\n";
        $data = '';
        
        $mime_boundary=md5(time());
        
        // 配置参数
        foreach ( $param as $key => $value ) {
            $data .= '--' . $mime_boundary . $eol;
            $data .= 'Content-Disposition: form-data; ';
            $data .= "name=" . $key . $eol . $eol;
            $data .= $value . $eol;
        }
        
        //这步就是结合官方示例对多附件的一个处理
        if (!empty($file)){
            foreach ( $file as $key => $val ){
                $files = $val['download_url']; #你的附件路径1
                $content = file_get_contents($files);
                $data .= '--' . $mime_boundary . $eol;
                $data .= 'Content-Disposition: form-data; name="attachments"; filename="'.$val['file_name'].'"' . $eol;
                $data .= 'Content-Type: text/plain' . $eol;
                $data .= 'Content-Transfer-Encoding: binary' . $eol . $eol;
                $data .= $content . $eol;
            }
        }
          
        $data .= "--" . $mime_boundary . "--" . $eol . $eol;
        
        $options = array(
            'http' => array(
                'method'  => 'POST',
                'header'  => 'Content-Type: multipart/form-data;boundary=' . $mime_boundary . $eol,
                'content' => $data
            ));
        $context = stream_context_create($options);
        $result  = file_get_contents($url, FILE_TEXT, $context);
		//可以根据自己情况.给每次发送邮件做记录
        return $result;
    }

以上就是通过yii2结合sencloud发送邮件的功能,其实和官网给的示例变动不是很多,我只不过就封装了一下该方法,方便以后使用,更加灵活

自己遇到的一个小问题:
可能有些同学可能就会问了.问什么我发送的邮件会出现谁谁谁代发的情况
在这里插入图片描述

其实官方FAQ也说明了,链接 http://www.sendcloud.net/doc/faq/
php 通过sendcloud发送邮件&附件功能_第2张图片
官方说的非常明了.这个东西啊.只要保证了mail_form和from一致,就不会显示代发,但是网易邮箱除外,大家注意一下就好了

大家如果有喜欢我的,可以点一下关注.我会不定时更新平时一些新技术和遇到的一些问题,当然大家有不懂的也可以问我,大家一起相互学习进步

你可能感兴趣的:(遇到过的问题)