腾讯企业邮箱发送邮件php,Laravel5.* 使用Smtp发送邮件以及常见报错解决(腾讯企业邮箱、163、QQ、Gmail 等) - Laravel学习网...
一、快速解決郵件發(fā)送
Laravel 提供了非常簡單的郵件發(fā)送 API,但是文檔卻不是太清晰,再加上它采用傳遞閉包(回調(diào)函數(shù))的方式調(diào)用,導(dǎo)致郵件發(fā)送的使用門檻偏高。看文檔也是云里霧里,那我們來簡單的來講一下發(fā)送郵件,只需要3步即可,
1、有一個發(fā)送郵箱賬號和密碼:
無論是什么郵箱,要發(fā)送郵件,必須要開啟IMAP/SMTP服務(wù)和POP/SMTP服務(wù),企業(yè)郵箱是默認(rèn)開啟的,直接使用即可
2、修改.env文件的配置,我們這里以騰訊企業(yè)郵箱為例:
MAIL_DRIVER=smtp
MAIL_HOST=smtp.exmail.qq.com
MAIL_PORT=465
MAIL_USERNAME=user@company.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=ssl
driver用于配置默認(rèn)的郵件發(fā)送驅(qū)動,MAIL_HOST是郵箱所在主機(jī),MAIL_PORT為發(fā)送端口,MAIL_USERNAME為發(fā)送郵箱,MAIL_PASSWORD為郵箱密碼
3、發(fā)送測試郵件
Mail::raw('test mail', function ($m) {
$m->from('1@earnp.com', 'User');
$m->to('71@qq.com')->subject('test email');
});
好的,到這里郵件就發(fā)送成功了,注意使用前要use Mail一下,接下來深入解讀
二、深入解讀
1、配置文件
Laravel集成了SwiftMailer庫進(jìn)行郵件發(fā)送,郵件配置文件位于config/mail.php:
return [
// port用于配置郵箱發(fā)送服務(wù)端口號,比如一般默認(rèn)值是25,但如果設(shè)置SMTP使用SSL加密,該值為465。
'driver' => env('MAIL_DRIVER', 'smtp'),
// host是郵箱所在主機(jī),比如我們使用163郵箱,對應(yīng)值是smtp.163.com,使用QQ郵箱的話,對應(yīng)值是smtp.qq.com。
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
// port用于配置郵箱發(fā)送服務(wù)端口號,比如一般默認(rèn)值是25,但如果設(shè)置SMTP使用SSL加密,該值為465。
'port' => env('MAIL_PORT', 587),
// from配置項包含address和name,前者表示發(fā)送郵箱,后者表示發(fā)送郵件使用的用戶名。
'from' => ['address' => null, 'name' => null],
// encryption表示加密類型,可以設(shè)置為null表示不使用任何加密,也可以設(shè)置為tls/ssl。
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
// username表示郵箱賬號,比如yaojinbu@163.com
'username' => env('MAIL_USERNAME'),
// password表示上述郵箱登錄對應(yīng)登錄密碼。
'password' => env('MAIL_PASSWORD'),
// sendmail是在設(shè)置driver為sendmail時使用,用于指定sendmail命令路徑。
'sendmail' => '/usr/sbin/sendmail -bs',
// pretend用于配置是否將郵件發(fā)送記錄到日志中,默認(rèn)為false則發(fā)送郵件不記錄日志,如果為true的話只記錄日志不發(fā)送郵件,這一配置在本地開發(fā)中調(diào)試時很有用。
'pretend' => false,
]
2、簡單郵件發(fā)送實現(xiàn)
在該控制器中添加郵件發(fā)送動作send(),我們使用Mail門面的send方法發(fā)送郵件,我們先發(fā)送一個最簡單的郵件:
namespace App\Http\Controllers;
use Mail;
class MailController extends Controller
{
public function send()
{
$flag = Mail::send('emails.test',['name'=>'Laravel學(xué)習(xí)網(wǎng)'],function($message){
$to = '123@qq.com';
$message ->to($to)->subject('測試郵件');
});
if($flag){
echo '發(fā)送郵件成功,請查收!';
}else{
echo '發(fā)送郵件失敗,請重試!';
}
}
}
Mail::send需要傳遞三個參數(shù),第一個是郵件視圖,第二個是傳入視圖的數(shù)據(jù),第三個是一個閉包,該閉包中定義了收件人、抄送人(如果有的話)、郵件主題、附件等信息。郵件的主體內(nèi)容位于局部視圖中,下面我們就來定義這個局部視圖,在resources/views/emails目錄下新建test.blade.php,編輯其內(nèi)容如下:
{{$name}},這是一封測試郵件
運用上面的路由調(diào)用控制器即可收到郵件了
3、更簡單的純文本郵件發(fā)送
上面的示例僅僅是發(fā)送一個字符串,對于純文本字符串郵件發(fā)送,還有更簡單的方法:
Mail::raw('這是一封測試郵件', function ($message) {
$to = '123@qq.com';
$message ->to($to)->subject('測試郵件');
});
這樣的話無需創(chuàng)建視圖即可完成郵件發(fā)送。
4、發(fā)送帶附件的郵件(中文亂碼解決)
當(dāng)然,郵件內(nèi)容往往不僅僅是純文本這么簡單,有時候我們會在郵件中加上附件,那么這該如何實現(xiàn)呢?
$flag = Mail::send('emails.test',['name'=>$name],function($message){
$to = '123@qq.com';
$message->to($to)->subject('測試郵件');
$attachment = storage_path('app/files/test.doc');
//在郵件中上傳附件
$message->attach($attachment,['as'=>'測試文檔.doc']);
});
從代碼可知我們使用閉包中$message實例上的attach方法上傳附件,該方法第一個參數(shù)是附件地址,第二個參數(shù)是一些額外參數(shù),這里我們通過as指定附件在郵件中的顯示名稱。
注:需要注意的是$message實際上是Illuminate\Mail\Message的實例,我們可以在$message上調(diào)用Message類的所有方法。
運行陸游,這樣在收件箱中可以看到附件,但附件名稱出現(xiàn)中文亂碼,解決辦法如下:
$message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('測試文檔')."?=.doc"]);
5、發(fā)送帶圖片的郵件
除了附件之外,有時候為了讓郵件內(nèi)容更豐富,還會在郵件內(nèi)容中插入圖片,我們固然可以在郵件視圖中硬編碼寫入圖片路徑,但是這顯然很笨重,靈活性很差,Laravel為我們提供了便捷方法——在視圖中使用$message上的embed方法:
{{$name}},這是一封測試郵件
這里的$message就是上述郵件發(fā)送閉包中的$message,Laravel內(nèi)部自動將該變量傳遞到郵件視圖。當(dāng)然我們還需要在控制器動作中傳入$imgPath變量;同時,我們也可以直接使用這種類型發(fā)送郵件哦:
$name = 'Laravel學(xué)習(xí)網(wǎng)';
$imgPath = 'http://host.com/1.jpg';
$flag = Mail::send('emails.test',['name'=>$name,'imgPath'=>$imgPath],function($message){
$to = '123@qq.com';
$message->to($to)->subject('測試郵件');
$attachment = storage_path('app/files/test.doc');
//在郵件中上傳附件
$message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('測試文檔')."?=.doc"]);
});
在瀏覽器中訪問http://laravel.app:8000/mail/send發(fā)送郵件,郵件發(fā)送成功后去收件箱查看,圖片已經(jīng)插入到郵件內(nèi)容中。
embedData
此外還支持發(fā)送原生的圖片數(shù)據(jù)到郵件中,即將本地圖片讀取到內(nèi)存然后渲染到郵件視圖,這可以通過$message上的embedData實現(xiàn)。
首先我們修改控制器動作如下:
$name = 'Laravel學(xué)習(xí)網(wǎng)';
//$imgPath = 'http://host.com/1.jpg';
$image = Storage::get('images/test.jpg');
$flag = Mail::send('emails.test',['name'=>$name,'image'=>$image],function($message){
$to = '123@qq.com';
$message->to($to)->subject('測試郵件');
$attachment = storage_path('app/files/test.doc');
//在郵件中上傳附件
$message->attach($attachment,['as'=>"=?UTF-8?B?".base64_encode('測試文檔')."?=.doc"]);
});
記得在MailController頂部加上use Storage,然后修改郵件視圖test.blade.php如下:
{{$name}},這是一封測試郵件
最后去瀏覽器中訪問http://laravel.app:8000/mail/send發(fā)送郵件,郵件發(fā)送成功去收件箱查看郵件內(nèi)容
如果你是Laravel 6.*+可以參考:laravel 6.7.發(fā)送郵件
原創(chuàng)文章,轉(zhuǎn)載請注明 :Laravel5.* 使用Smtp發(fā)送郵件以及常見報錯解決(騰訊企業(yè)郵箱、163、QQ、Gmail 等) - Laravel學(xué)習(xí)網(wǎng)
原文出處: https://phpartisan.cn/news/5.html
問題交流群 :168117787
總結(jié)
以上是生活随笔為你收集整理的腾讯企业邮箱发送邮件php,Laravel5.* 使用Smtp发送邮件以及常见报错解决(腾讯企业邮箱、163、QQ、Gmail 等) - Laravel学习网...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android JNI:lame库的编译
- 下一篇: java main()方法必须都写在类里