1. 程式人生 > >使用PHP傳送郵件

使用PHP傳送郵件

來源:慕課網教程

一、用composer安裝nette/mail

composer require nette/mail

在當前資料夾下生成vendor資料夾,composer.json檔案,composer.lock檔案。

二、資料庫

程式碼通過查詢使用者id找到email,併發送郵件。

三、寫程式碼

controller:

<?php

class MailController extends Yaf_Controller_Abstract{

    public function indexAction(){

    }

    public function
sendAction(){
$submit=$this->getRequest()->getQuery('submit','0'); if ($submit!='1'){ echo json_encode(array( 'errno'=>-3001, 'errmsg'=>'請通過正確渠道提交' )); return false; } //獲取引數 $uid=$this
->getRequest()->getPost('uid',false); $title=$this->getRequest()->getPost('title',false); $content=$this->getRequest()->getPost('content',false); if (!$uid||!$title||!$content){ echo json_encode(array( 'errno'=>-3002, 'errmsg'
=>'使用者ID、郵件標題、郵件內容均不得為空' )); return false; } //呼叫Model,發郵件 $model=new MailModel(); if ($model->send(intval($uid),trim($title),trim($content))){ echo json_encode(array( 'errno'=>0, 'errmsg'=>'' )); }else{ echo json_encode(array( 'errno'=>$model->errno, 'errmsg'=>$model->errmsg, )); } return true; } }

model:

<?php
require __DIR__.'/../../vendor/autoload.php';//引用vendor裡的autoload.php
use Nette\Mail\Message;
class MailModel {
    public $errno=0;
    public $errmsg='';
    private $_db=null;
    public function __construct(){
        $this->_db=new PDO('mysql:host=localhost;dbname=yaf','root','');
        $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
    }

    public function send($uid,$title,$content){
        $query=$this->_db->prepare('select `email` from `user` where `id`=?');
        $query->execute(array(intval($uid)));
        $ret=$query->fetchAll();
        if (!$ret||count($ret)!=1){
            $this->errno=-3003;
            $this->errmsg='使用者郵箱資訊查詢失敗';
            return false;
        }
        $userEmail=$ret[0]['email'];
        if (!filter_var($userEmail,FILTER_VALIDATE_EMAIL)){//原理也是正則表示式,並不能驗證是否為有效的郵箱
            $this->errno=-3004;
            $this->errmsg='使用者郵箱資訊不符合標準,郵箱地址為:'.$userEmail;
            return false;
        }
        $mail=new Message();
        $mail->setFrom('[email protected]')
            ->addTo($userEmail)
            ->setSubject($title)
            ->setBody($content);
        $mailer=new Nette\Mail\SmtpMailer([
            'host'=>'smtp.163.com',
            'username'=>'[email protected]',
            'password'=>'yourpassword',
            'secure'=>'ssl'
        ]);
        $rep=$mailer->send($mail);
        return true;
    }
}

提供另外一個驗證非法郵箱的方法:

//驗證非法郵箱
function check_mail($email){
    /**
     * 查詢指定的主機的DNS記錄的,有可能有點慢
     */
    $arr=explode("@",$email);
    if (checkdnsrr(array_pop($arr),"MX")){//'MX'郵件交換記錄
        return $email;
    }
    return false;
}

可以通過http://yourdomain/yaf/mail/send?submit=1驗證是否能傳送成功了!
可能報錯:Error Msg:SMTP server did not accept PLAIN credentials with error: 550
解決方法:
到你的郵箱首頁
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
報錯:Error Msg:SMTP server did not accept PLAIN credentials with error: 550 User has no permission
將密碼換成授權碼即可!