铁路/ 邮件ora
用于Laravel电子邮件功能的包装器,增加了HTTP API和前端开发友好的视图创建和使用。
Requires
- php: ^8.2
- doctrine/dbal: ^3.0
- guzzlehttp/guzzle: ^7.2
- laravel/framework: ^11.9
Requires (Dev)
- orchestra/testbench: ^9.2
- phpunit/php-code-coverage: ^11.0.1
- phpunit/phpunit: ^11.0.1
README
用于Laravel电子邮件功能的包装器,增加了HTTP API和前端开发友好的视图创建和使用。
目录
1 - 安装和配置
1.1 - 安装
使用Composer运行以下命令进行安装
$ composer require railroad/mailora
或将其添加到 composer.json
{
"require": {
"railroad/mailora": "dev-master"
}
}
然后运行 composer update railroad/mailora
。
(我不确定关于指定要使用哪个版本的问题。也许只需使用 "dev-master")
将 \Railroad\Mailora\Providers\MailoraServiceProvider::class,
添加到应用程序的 config/app.php 中的 providers
数组。
运行 php artisan vendor:publish
,从生成的选项列表中选择此包。
这将注册视图和路由,并将配置文件复制到您的应用程序中。将配置文件提交到您的应用程序。配置的详细信息如下。
(关于此项目未来开发的次要说明)我们可能不需要这样做,但看起来Laravel中服务提供器可以仅在包自己的 composer.json 文件中注册的功能似乎不起作用,因此您必须将其添加到应用程序中。
1.2 - 配置
有两个配置文件。它们都位于您的应用程序的 "config" 目录中
- 'mail.php'
- 'mailora.php'
下面两个部分中提供了每个文件的更多详细信息。
请注意,两个配置文件都可以使用 Laravel的 "env()" 辅助函数。因此,您可以通过提供环境变量来覆盖配置文件中硬编码的任何值。这对于本地或测试环境的不同配置非常有用。
然后您可以使用 Laravel的配置辅助函数 调用这些配置值。
示例
// retrieve a value directly using dot notation $senderAddress = config('mail.defaults.sender-address'); // or retrieve an array and access items as needed. $mail = config('mail.defaults'); $senderName = $mail['sender-name'];
1.2.1 - Laravel本地的 'config/mail.php'
这是一个提供电子邮件发送服务详细信息的Laravel原生文件。此文件配置标准Laravel功能,您可以参考他们的文档以获取详细信息。
将您选择的电子邮件服务的密钥作为环境变量提供,不要将实际值提交到配置文件中。
您可以在配置文件中硬编码其他非敏感值。
1.2.2 - 包提供的 'config/mailora.php'
1.2.2.1 - TL;DR
提供给 config/mailora.php 的最基本内容如下
- 安全接收者
- 默认值
- 发送者地址
- 接收者地址
- 以下两者之一或两者都
- 认证中间件
- 以下两者之一或两者都
- 批准接收者
- 批准接收者域名
1.2.2.2 - 详细信息
通过运行 artisan vendor:publish
命令,此文件将从此包复制到您的应用的 "config" 目录。
有两个基本功能。一个是通过调用未受保护的路由来发送。这向全世界开放,因此只会发送到配置中明确允许的电子邮件地址(或域名)。另一个("安全")仅对认证用户开放。对于前者,您必须提供 'approved-recipients' 或 'approved-recipient-domains' 值,并使用公共路由。对于后者,您必须提供一个认证中间件以使用 "安全" 路由。
1.2.2.2.1 - 顶级值
1.2.2.2.2 - "defaults" 下嵌套的值
* 注意事项——见备注
1.2.3 - 认证中间件
作为 "auth_middleware" 提供一个字符串值。使用您的应用的 App\Http\Kernel 类中 "$routeMiddleware" 属性的键(根据 Laravel 功能配置配置)。
例如,如果您的 app/Http/Kernel.php 有
protected $routeMiddleware = [
'auth' => \WordpressAuthMiddleware::class,
'auth-special' => \WordpressSpecialAuthMiddleware::class,
'requires.edge' => \App\Http\Middleware\RequiresEdge::class,
'requires.edge-or-pack' => \App\Http\Middleware\RequiresPackOrEdge::class,
'auth.admin' => \WordpressAdminAuthMiddleware::class,
'auth.executives' => \StatisticsWhiteListFilter::class,
'auth.shippers' => \App\Http\Middleware\ShippersOrAdmin::class,
];
...那么在 config/mailora.php 中可以有以下内容
return [ // ... 'auth_middleware' => ['is-logged-in-or-something'], // ... ];
1.3 - 本地开发配置
由于 Laravel 的 env()
函数被使用,而不是在配置文件中进行更改,您可以只提供环境变量来覆盖配置文件中硬编码的任何内容。在您的应用根目录中定义一个 ".env" 文件。
至少,您应提供 "MAILORA_SAFETY_RECIPIENT",以确保您知道电子邮件发送的位置。当环境不是 "生产"(或 config('mailora.name-of-production-env') 返回的值,如果不同的话)时,电子邮件将只发送到该地址;
示例
MAILORA_SAFETY_RECIPIENT=jonathan+mailora_dev_SAFETY_RECIPIENT@drumeo.com
或提供多个值
MAILORA_SAFETY_RECIPIENT=joe+foo@foo.com
MAILORA_APPROVED_FROM_PUBLIC_RECIPIENTS=['joe+test89347832@foo.com']
MAILORA_NAME_OF_PROD_ENV='staging'
MAILORA_PUBLIC_FREE_FOR_ALL=true
MAILORA_DEFAULT_ADMIN=joe+bar@foo.com
MAIL_FROM_ADDRESS=joe+baz@foo.com
MAIL_FROM_NAME="Joe Black"
MAILORA_DEFAULT_RECIPIENT=joe+qux@foo.com
MAILORA_DEFAULT_TYPE='foo'
2 - 特性
2.1 - 通过POST请求发送电子邮件到端点
要发送电子邮件,只需按这些文档中描述的方式发送 POST 请求。您将收到一个简单的 "sent" 布尔值响应。
2.2 - 配置常用操作的默认值
始终发送到同一电子邮件地址。在配置中将其设置为默认值,然后在请求发送到该地址时,不要传递 "recipient-address" 值。将使用默认值。
事实上,端点没有必需的参数——您可以将所有必需的信息放入配置中,并在需要时只提供唯一信息。
2.3 - "一站式视图变量"
您可以轻松传递所需值,并在自定义视图中使用它们。无需 PHP。
2.3.1 - 访问传递给视图的值
在请求中传递给视图的值嵌套在 $input
变量中。
因此,如果您传递
$.ajax({ url: 'https://www.foo.com/mailora/secure/send' , type: 'get', dataType: 'json', data: { 'type': 'layouts/action', 'lines': [ 'foo_lines_bar_line_1', 'foo_lines_bar_line_2', 'foo_lines_bar_line_3', 'foo_lines_bar_line_4', 'foo_lines_bar_line_5', 'foo_lines_bar_line_6' ], 'callToAction': { 'url': 'foo_callToAction_bar', 'text': 'foo_callToAction_bar', }, 'logo': 'foo_logo_bar', 'brand': 'foo_brand_bar', 'subject': 'important action!!' }, success: function(response) { /* handle error */ }, error: function(response) { /* handle error */ } });
您可以通过在视图中使用 $input
变量来访问您传递的自定义值。例如
<table> @foreach($input['lines'] as $line) <tr><td>{{ $line }}</td></tr> @endforeach @if(!empty($input['callToAction'])) <tr><td><a href="{{ $input['callToAction']['url'] }}">{{ $input['callToAction']['text'] }}</a></td></tr> @endif <tr><td>— The {{ $input['brand'] ?? 'Musora' }} Team</td></tr> </table>
注意 $line
变量。这是在 foreach 循环中定义的,因此它不是 $input[
line]
。
2.2 - 简易自定义视图
如果在请求中未提供 'type' 值,将使用 Mailora 的通用类和 general.blade.php 视图。如果传递了类型值,Mailora 将寻找与传递的 CapitalizedCamelCase 版本匹配的类。Mailora 将在由 config('mailora.mailables-namespace')
返回的命名空间中寻找此类。如果存在此类,则使用它。如果没有使用任何类,Mailora 的 General
类将被使用。此类仅使用提供的任何视图,并将 $input
参数传递给视图,以便从其中检索所有值。
这使以下内容成为可能。
无论使用什么类——也就是说,即使没有找到与转换后的 CapitalizedCamelCase 'type' 值匹配的 Mailable
类,Mailora 也将在由 config('mailora.views-directory')
返回的目录中寻找与该类型值匹配的视图文件**。如果找到,则使用它。如果没有找到,则使用 mailora 的 general.php***。
所有这些的综合结果是,无需后端修改即可创建新的电子邮件模板。 只需创建一个视图文件,并从 $input
参数中提供和检索值。
TL;DR 关于请求数据中指定的 'type' 值。如果可能,它将解析为类。否则,将使用默认的 General
PHP Mailable
类,并且 'type' 将解析为视图,如果可能。否则,将使用默认的 'general.blade.php'。
* 值 foo-bar-baz
将使用类 FooBarBaz
和视图文件 "foo-bar-baz.blade.php"。
** 这可以在 mailora.php 配置文件中设置——因此可以更改
*** 注意此文件位于 "/your-application/vendor/railroad/mailora/resources/views/"
2.2.1 - 类和视图使用的流程图
is type defined in request? → no → use 'general' view and 'General' Mailable class
↓
yes
↓
is type defined in request as 'general'? → yes → use 'general' view and 'General' Mailable class
↓
no
↓
is there a Mailable class that matches a CapitalizedCamelCase version of the 'type' value supplied? → yes → use that
↓
no
↓
use 'General'
↓
is there a view file matching the 'type' value passed? → no → use mailora's general.blade.php
↓
yes
↓
use that
2.2.2 - 视图文件嵌套在邮件目录的子目录中
要指定子目录(电子邮件目录的子目录)中的视图,只需键入视图文件的相对路径。
例如,假设您的视图目录是: /appFoo/resources/views/emails。您可以通过将电子邮件请求的 "type" 值指定为 "fooView" 来使用视图文件 /appFoo/resources/views/emails/fooView.blade.php。但如果你在 emails/barDir 目录中有视图文件怎么办?比如可能是这样的 /appFoo/resources/views/emails/barDir/quxView.blade?那么,您只需指定类型为 barDir/quxView。
当然,所有这些都是假设您不需要任何通过自定义 Laravel Mailable
PHP 类实现的获取或特殊转换,并且您可以使用默认的 Mailora General
PHP 类。
3 - API参考
有两个端点
POST /mailora/public/send
(公开访问)POST /mailora/secure/send
(用户必须经过身份验证才能访问此端点)
以下为详细信息。
除了以下列出的参数外,还可以传递任何其他参数,并且它将在视图中可用!
例如,如果您在请求的数据中有 'foo' : 'bar'
项,在视图中,{{ $input['foo'] }}
将打印 "bar"。
另一个示例:请求中的 'foo' : 1
允许视图中使用 {{ $input['foo'] ? 'true' : 'false' }}
。
3.1 - 从任何地方发送电子邮件
POST /mailora/public/send/
可以从任何地方调用。适用于从公开访问的支持和销售页面发送电子邮件。
不能指定收件人。除非提供了 MAIL_FROM_ADDRESS_PUBLIC
,否则将发送到 MAIL_FROM_ADDRESS
。尽管如此,您可以设置 "发件人姓名"。
用户必须在配置文件 "config/mailora.php" 中定义。如果用户不在那里,则不会将电子邮件发送到指定的收件人。
3.1.1 - 请求示例
let data = { "type": "foo", "sender-address": "bar@some-domain.com", "sender-name": "Baz Qux", "recipient": [ "foo+test_0@bar.com", "foo+test_1@bar.com", { "name":"foo_test_2", "address":"foo+test_2@bar.com" }, { "name":"foo_test_3", "address":"foo+test_3@bar.com" }, { "name":"foo_test_4", "address":"foo+test_4@bar.com" } ], "subject": "Grault garply waldo", "reply-to": "bar@some-domain.com", "users-email-set-reply-to": "", "message": "Fred plugh thud, mos henk. Def." }; $.ajax({ url: 'https://www.foo.com/mailora/secure/send' , type: 'get', dataType: 'json', data: data, success: function(response) { /* handle error */ }, error: function(response) { /* handle error */ } });
或者,如果您只有一个指定项,而不是 "recipient"
,请设置 "recipient-address"
(可选地,设置 "recipient-name"
)。
let data = { "type": "foo", "sender-address": "bar@some-domain.com", "sender-name": "Baz Qux", "recipient-address": "foo+test_0@bar.com", "subject": "Grault garply waldo", "reply-to": "bar@some-domain.com", "users-email-set-reply-to": "", "message": "Fred plugh thud, mos henk. Def." };
3.1.2 - 请求参数
请将所有参数放在请求体中。
注意,没有字段是 必需的!!
注意 1:除非同时提供来自同一来源的地址,否则不会使用提供的名称。例如:假设发送者地址和发送者名称都在配置文件中设置。如果请求没有指定请求地址,则将使用配置中的地址和名称。但是,如果请求提供地址但没有名称,则将使用请求中的地址(而不是配置中的名称)。配置中的名称仅在配置中的地址使用时才使用。当在请求中提供地址时,只有请求中类似提供的名称才会使用。来自配置的名称不会使用,如果请求中提供了电子邮件地址。
注意 2:将任何数量的收件人作为数组中的项目传递,格式为 JSON 字符串。数组中的每个收件人都是一个项目。有两种方式指定数组中的每个收件人
- 作为地址的字符串。
- 作为定义了
"address"
的对象字面量,并可选地定义了"name"
示例
[ "foo+test_0@bar.com", "foo+test_1@bar.com", { "name":"foo_test_2", "address":"foo+test_2@bar.com" }, { "name":"foo_test_3", "address":"foo+test_3@bar.com" }, { "name":"foo_test_4", "address":"foo+test_4@bar.com" } ]
此外,将来将重命名为 "recipients
"。
3.1.3 - 响应示例
3.1.3.1 - {200 OK}
{"sent":true}
3.1.3.2 - {500 Internal Server Error}
{"sent":false}
或者
{"error":true}
fin
glhf