eduardokum / laravel-mail-auto-embed
自动嵌入电子邮件中的图像库
Requires
- php: ^7.2|^8.0
- ext-curl: *
- ext-dom: *
- ext-fileinfo: *
- illuminate/contracts: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/mail: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- masterminds/html5: ^2.7
Requires (Dev)
- orchestra/testbench: ^4.0|^5.0|^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^8.5.30|^9.0|^10.0|^11.0
- squizlabs/php_codesniffer: ^3.5
README
Laravel Mail Auto Embed
自动解析您的消息并将找到的图像嵌入到邮件中,替换原始在线图像版本。
应适用于 Laravel 5.3+。已在 PHP 7.0+ 上自动测试 Laravel 5.4+。
版本兼容性
安装
您可以通过 composer 安装此包
composer require eduardokum/laravel-mail-auto-embed
此包使用 Laravel 5.5 包自动发现。对于 Laravel 的早期版本,您需要添加以下服务提供程序
$providers = [ ... \Eduardokum\LaravelMailAutoEmbed\ServiceProvider::class, ... ];
使用方法
使用非常简单,您只需正常编写 markdown
<!-- eg: resources/vendor/mail/markdown/order-shipped.blade.php --> @component('mail::message') # Order Shipped Your order has been shipped! @component('mail::button', ['url' => $url]) View Order @endcomponent Purchased product: ![product](https://domain.com/products/product-1.png) Thanks,<br> {{ config('app.name') }} @endcomponent
发送时,它将替换通常生成的链接
<img src="https://domain.com/products/product-1.png">
通过图像的嵌入内联附件
<img src="cid:[email protected]">
.
它也适用于原始 HTML
<!-- eg: resources/vendor/mail/html/header.blade.php --> <tr> <td class="header"> <a href="{{ $url }}"> <img src="https://domain.com/logo.png" class="img-header"> </a> </td> </tr>
如果您不想自动嵌入特定图像(因为它们托管在其他地方,如果您想使用某种图像跟踪器等),只需在图像标签中添加属性 data-skip-embed
<img src="https://domain.com/logo.png" data-skip-embed class="img-header">
本地资源
对于不公开提供的本地资源,请使用 file://
URL
<img src="file://{{ resource_path('assets/img/logo.png') }}" alt="Logo" border="0"/>
配置
默认值在 config/mail-auto-embed.php
中设置。您可以将此文件复制到您的配置目录以修改值,使用以下命令
php artisan vendor:publish --provider="Eduardokum\LaravelMailAutoEmbed\ServiceProvider"
显式嵌入配置
默认情况下,图像会自动嵌入,除非您添加 data-skip-embed
属性。
您还可以通过设置 MAIL_AUTO_EMBED
环境变量为 false
或修改已发布的配置中的 enabled
属性来全局禁用自动嵌入。然后,您可以使用 data-auto-embed
属性为单个图像启用嵌入。
# .env MAIL_AUTO_EMBED=false
return [ /* |-------------------------------------------------------------------------- | Mail auto embed |-------------------------------------------------------------------------- | | If true, images will be automatically embedded. | If false, only images with the 'data-auto-embed' attribute will be embedded | */ 'enabled' => false, // … ];
<p> <!-- Won't be embedded --> <img src="https://domain.com/logo.png" class="img-header"> </p> <p> <!-- Explicit embedding --> <img src="https://domain.com/item.png" data-auto-embed> </p>
Base64 嵌入
如果您更喜欢使用 Base64 而不是内联附件,您可以通过设置 MAIL_AUTO_EMBED_METHOD
环境变量或 method
配置属性为 base64
来实现。
return [ // … /* |-------------------------------------------------------------------------- | Mail embed method |-------------------------------------------------------------------------- | | Supported: "attachment", "base64" | */ 'method' => 'base64', ];
请注意,它将增加电子邮件的大小,并且它不会被某些电子邮件客户端(如 Gmail)解码。
混合嵌入方法
如果您根据图像想同时使用内联附件和 Base64,您可以指定嵌入方法作为 data-auto-embed
属性值
<p> <img src="https://domain.com/logo.png" data-auto-embed="base64"> </p> <p> <img src="https://domain.com/item.png" data-auto-embed="attachment"> </p>
嵌入实体
您可能想嵌入实际上不存在于您的文件系统中的图像(存储在数据库中)。
在这种情况下,请使您想要嵌入的实体实现 EmbeddableEntity
接口
namespace App\Models; use Eduardokum\LaravelMailAutoEmbed\Models\EmbeddableEntity; use Illuminate\Database\Eloquent\Model; class Picture extends Model implements EmbeddableEntity { /** * @param mixed $id * @return Picture */ public static function findEmbeddable($id) { return static::find($id); } /** * @return mixed */ public function getRawContent() { return $this->data; } /** * @return string */ public function getFileName() { return 'profile_'.$this->id.'.png'; } /** * @return string */ public function getMimeType() { return 'image/png'; } }
然后,您可以在电子邮件模板中使用 embed:ClassName:id
语法
<p> <img src="embed:App\Models\Picture:123"> </p>
贡献
如果您能改进或添加任何功能,请随时提交拉取请求。
我们目前正在使用 PSR-2。这很容易实现和检查,使用 PHP Coding Standards Fixer。