Lumen / Laravel 使用网易邮箱 SMTP 发送邮件

简介: Lumen / Laravel 使用网易邮箱 SMTP 发送邮件

Laravel 是目前最流行的PHP框架,而Lumen 是 Laravel 的精简版,主要用于接口开发。


Laravel 邮件发送服务基于 Symfony 组件 Swift Mailer。


本文记录了在 Lumen / Laravel 5 环境中,使用网易邮箱 SMTP 发送邮件的主要步骤,希望对大家有一些参考价值。


获取网易邮箱的服务器和授权码:



登录网易邮箱: http://mail.163.com/


获取服务器地址:


点击【设置】 > 【POP3/SMTP/IMAP】选项: 可以查看到,服务器地址:


  1. POP3 服务器: pop.163.com


  1. SMTP 服务器: smtp.163.com


  1. IMAP 服务器: imap.163.com


获取客户端授权密码:


授权码 授权码是用于登录第三方邮件客户端的专用密码。适用于登录以下服务: POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。


点击【设置】 > 【客户端授权密码】 点击【开启】, 设置一个授权码, 比如本例中将授权码设置为: mailPASSWORD


配置 env 文件:


Laravel/Lumen的系统配置一般都配置项目根目录的 “.env” 文件中。 打开配置文件“.env”文件,新增以下配置:


MAIL_DRIVER=smtp MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=cnwytnet@163.com
MAIL_PASSWORD=wang123net
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=cnwytnet@163.com
MAIL_FROM_NAME=cnwytnet


添加发邮件模块



Laravel 框架已经包含了邮件模块,不需要安装。


由于 Lumen 是简化版的 Laravel, 需要添加 illuminate/mail 模块:


执行 “composer require” 命令, 安装illuminate/mail模块。


$ composer require illuminate/mail


或者,修改composer.json 文件中 require 部分,再执行 composer up 安装,文件 composer.json 的 require 部分配置如下:


"require": {
"php": ">=5.6.4",
"laravel/lumen-framework": "5.4.*",
"illuminate/mail":"5.4.*",
"guzzlehttp/guzzle": "~6.0"
}


需要增加 mail.php 配置文件:


确保 Laravel、 Luemn 项目中存在 app/config/mail.php 配置文件。


Laravel 框架已经包含了此配置文件,不需新增。Lumen 项目可能不存在,需要从 Laravel 代码中复制一份, 或者直接copy一下配置代码:


<?php
return [
// Mail Driver
‘driver’ => env(‘MAIL_DRIVER’, ‘smtp’),
//SMTP Host Address
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
// SMTP Host Port
'port' => env('MAIL_PORT', 587),
// Global "From" Address
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
// E-Mail Encryption Protocol
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
// SMTP Server Username
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
// Sendmail System Path
'sendmail' => '/usr/sbin/sendmail -bs',
// Markdown Mail Settings
'markdown' => [
'theme' => 'default',
'paths' => [
resource_path('views/vendor/mail'),
],
],
];


创建发邮件脚本



可以使用 php artisan 命令创建脚本文件:


$ php artisan make:command SendEmailCommand


该命令会在自动创建一个类名为 “SendEmailCommand” 的脚本文件。 其路径是:


app/Console/Command/SendMailCommand.php


打开文件,引入 Mail 门面 (facade), 使用 Mail::raw() 方法发送邮件:


其代码内容如下:


// 发送 纯文本邮件
Mail::raw($content, function ($message) use ($toMail, $subject) {
$message->subject($subject);
$message->to($toMail);
});


注册脚本



手动将脚本文件加入到 app/Console/Kernel.php 中:


protected $commands = [
Commands\SendEmailCommand::class, //测试发邮件脚本
];


在 Laravel 5.5以上版本中,已默认注册了所有 Commands 目录下的脚步文件了,不需要再手动添加在 Kernel.php 中了:


/**
* Register the commands.
*
* @return void
*/
protected function commands()
{
// 加载所有 Commands 下脚本
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}


执行发邮件操作



使用 php artisan 命令可以查看目前可用的脚本列表, 可以看到我们新加的脚本命令 “test:send-mail”:


$ php artisan
test
test:send-mail SendMail:测试邮件发送


执行发送邮件脚本:


$ php artisan test:send-mail


不出意外的话,邮件发送成功。


查看发件人的发件箱,或者查看收件人的收件箱,确认一下吧。


模板邮件



上边我们发送的是纯文本的邮件,但是我们常用的都是带有模板的邮件。


在 app/resources/views 目录下, 创建一个 emails 目录,创建一个 test.blade.php 邮件模板文件:


使用 Mail::send() 方法发送:


// 邮件模板文件
$view = 'emails.test';
// 模板展示数据
// $data = ['content' => $content,];
$data = [
'content' => $content,
'logo' => 'https://gitee.com/phpspace/php-demo/raw/master/laravel-demo/public/static/images/qrcode_344.jpg',
];
// 添加附件
$attach = "/Users/wangtest/code/php-demo/laravel-demo/public/robots.txt";
return Mail::send($view, $data, function ($message) use ($toMail, $subject, $attach) {
$message->subject($subject);
$message->to($toMail);
$message->attach($attach);
});


常见的报错



这里收集了一些常见的错误,可能不同的 Laravel 版本,提示信息略有不同。


报错1: 没有正常设置配置文件,报530错误 (Lavavel5.5):


In AbstractSmtpTransport.php line 419:
Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required"


报错2: 授权码认证失败:


授权码错误 (Lavavel5.5):


In AuthHandler.php line 181:
Failed to authenticate on SMTP server with username "cnwytnet@163.com" using 2 possible authenticators


不填授权码 MAIL_PASSWORD 或者 MAIL_PASSWORD 错误 (Lavavel5.4):


[Swift_TransportException]
Failed to authenticate on SMTP server with username “cnwytnet@163.com” using 2 possible authenticators


注意 MAIL_PASSWORD 不是邮箱的密码,而是授权码。


报错3: 邮件地址 MAIL_FROM_ADDRESS 必须和 MAIL_USERNAME不一致:


[Swift_TransportException]
Expected response code 250 but got code “553”, with message “553 Mail from must equal authorized user”


调试邮件:



可以在配置文件中,将邮件驱动改成 MAIL_DRIVER=log, 就可以在本地日志中看到邮件内容了,这在测试的时候会很有用。


打开配置文件 .env,修改邮件驱动为 MAIL_DRIVER=log, 执行邮件发送脚本,将会把邮件发送内容保存到 storage/logs/laravel.log 中。


比如,发送纯文本邮件时,实例内容如下:


[2018-06-13 02:52:17] local.DEBUG: Message-ID: <c75569f9a301cbb32b6ef7b0b6c78d09@swift.generated>
Date: Wed, 13 Jun 2018 02:52:17 +0000
Subject: =?utf-8?Q?=5BTEST=5D=E6=B5=8B=E8=AF=95?=
=?utf-8?Q?=E9=82=AE=E4=BB=B6=E6=A0=87=E9=A2=98?= SendMail - 2018-06-13
02:52:17
From: cnwytnet <cnwytnet@163.com>
To: wangtom365@qq.com
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Hi, 这是一封来自Laravel的测试邮件.


具体代码可以在码云查看: https://gitee.com/phpspace/php-demo


拓展内容



POP3:


POP3, 全名为 “Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。 它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。


SMTP


SMTP 全称是 “Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。


IMAP


IMAP 全称是 “Internet Mail Access Protocol”,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。


Swift Mailer


Swift Mailer, 是由 symfony 开发的一个邮件发送类库。其网址是: swiftmailer.symfony.com。


目录
相关文章
|
6月前
|
Ruby
|
6月前
|
数据安全/隐私保护 Ruby
|
6月前
|
数据安全/隐私保护 Ruby
|
22天前
|
Python
python使用smtp发送邮件
python使用smtp发送邮件
15 0
|
3月前
|
数据安全/隐私保护
【Azure Logic App】在Azure Logic App中使用SMTP发送邮件示例
【Azure Logic App】在Azure Logic App中使用SMTP发送邮件示例
|
4月前
|
JavaScript API PHP
不用SMTP实现联系表单提交后发送邮件到指定邮箱
构建网站时,联系表单可通过邮件API(如SendGrid、Mailgun、Amazon SES)或第三方自动化服务(Zapier、Integromat)无需SMTP发送邮件。这些服务提供API接口和自动化工作流程,简化邮件发送。例如,使用SendGrid API在Python中发送邮件涉及注册、获取API密钥并编写发送邮件的代码。同样,Zapier可作为表单提交的触发器,自动发送邮件。此外,后端脚本(如PHPMailer)也能实现这一功能,但需编写处理SMTP的代码。选择适合的方法能优化邮件发送流程。
|
5月前
|
网络安全 数据安全/隐私保护 Python
Python SMTP发送邮件
Python SMTP发送邮件
|
12月前
|
网络安全 数据安全/隐私保护
用smtp发送邮件,语法错误,无法识别命令。 服务器响应为:Authentication is re
用smtp发送邮件,语法错误,无法识别命令。 服务器响应为:Authentication is re
293 0
|
6月前
|
API 网络安全 数据安全/隐私保护
SMTP邮件邮箱API发送邮件的方法和步骤
使用SMTP邮件邮箱API(如AokSend)发送邮件涉及6个步骤:获取SMTP服务器地址和端口,进行身份验证,构建邮件内容,连接到服务器,发送邮件及处理结果。例如,Gmail的SMTP服务器地址是smtp.gmail.com,端口587。此方法适用于程序化发送邮件,确保安全并支持大规模发信服务。
|
Python