使用PHP傳送郵件
阿新 • • 發佈:2018-12-24
來源:慕課網教程
一、用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
將密碼換成授權碼即可!