dinubo/laravel-mailer 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

dinubo/laravel-mailer

最新稳定版本:v0.1.0

Composer 安装命令:

composer require dinubo/laravel-mailer

包简介

Schedule and send segmented Laravel newsletters with per-recipient placeholders, open/click tracking, unsubscribe handling, provider webhooks (Postmark, Resend), and a built-in admin UI.

README 文档

README

Latest Version on Packagist Tests Total Downloads

A Laravel newsletter / mailer package: schedule and send segmented newsletters, resolve per-recipient placeholders, track opens and clicks, handle unsubscribes, and process provider webhooks (Postmark, Resend) — with a built-in admin UI.

Installation

Via Composer:

composer require dinubo/laravel-mailer

The service provider and the package's migrations are auto-discovered. Run them:

php artisan migrate

Publish whatever you want to customise:

php artisan vendor:publish --tag=mailer.config      # config/mailer.php
php artisan vendor:publish --tag=mailer.views       # admin Blade views
php artisan vendor:publish --tag=mailer.migrations  # only if you need to edit the schema

Usage

Routes

All routes are mounted under the /mailer prefix and named with a mailer. prefix. The admin UI lives at /mailer/newsletters. Middleware is configurable per group (user, admin, callback) in config/mailer.php.

Group Examples
user mailer.open, mailer.click, mailer.unsubscribe
admin mailer.newsletters.*, mailer.newsletters.statistics.*
callback mailer.callback.postmark, mailer.callback.resend

The callback (webhook) routes verify the provider signature when the matching secret is configured (see Webhooks); the mailer.middleware.callback group is available for any additional middleware.

Recipients

By default newsletters are sent to your application's configured user provider model (config('auth.providers.users.model')). Override it in config/mailer.php via recipient_model.

Placeholders, filters & segments (registrar)

Placeholders and filters use closures, so they are registered on the Mailer class rather than stored in config (this keeps config cacheable). Register them from a service provider's boot() method:

use Dinubo\Mailer\Mailer;
use Dinubo\Mailer\Placeholder;
use Dinubo\Mailer\Filter;
use Dinubo\Mailer\Segment;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

// Available as {{name}} in a newsletter subject/body (plain substitution, not Blade).
Mailer::placeholders([
    Placeholder::make('name', fn (Model $recipient) => $recipient->name),
    Placeholder::make('site', 'Acme Inc.'),
]);

// Global recipient filter, applied to every send.
Mailer::filter(Filter::make(
    query: fn (Builder $query, $newsletter) => $query->whereNotNull('email_verified_at'),
));

// Segments power the admin dropdown. A built-in "all" (All Users, no filter) is
// always available; register more, each with an optional filter:
Mailer::segments([
    Segment::make('verified', 'Verified users')->filter(Filter::make(
        query: fn (Builder $query, $newsletter) => $query->whereNotNull('email_verified_at'),
    )),
]);

A Filter may define a query: closure (constrains the recipient query) and/or a collection: closure (post-filters the resulting collection).

Events & actions

Trigger event-scheduled newsletters from your app, and compute extra per-recipient placeholders at send time:

use Dinubo\Mailer\Mailer;
use Dinubo\Mailer\Event;
use Dinubo\Mailer\Placeholder;
use Illuminate\Database\Eloquent\Model;

Mailer::events([
    Event::make('signup', 'On signup')
        ->placeholders([Placeholder::make('plan', fn (Model $user) => $user->plan)]),
]);

// Elsewhere in your app — schedules any active newsletters bound to this event:
Mailer::event('signup', $user);

Actions work similarly (Action::make(...)->execute(...), registered via Mailer::actions([...])) for placeholders that run logic per recipient.

Admin access

The admin UI (/mailer/newsletters) is gated by the admin middleware group, which by default only allows the local environment. Authorize real users with Mailer::auth():

use Dinubo\Mailer\Mailer;
use Illuminate\Http\Request;

Mailer::auth(fn (Request $request) => (bool) $request->user()?->is_admin);

Webhooks

Bounce/complaint webhooks from Postmark and Resend update delivery state. Set the matching secret to enable signature verification (without it, requests are accepted and a warning is logged):

# Sent by Postmark as HTTP Basic Auth — set the webhook URL to
# https://user:SECRET@your-app.test/mailer/callback/postmark
MAILER_POSTMARK_WEBHOOK_SECRET=...

# Resend (Svix) signing secret
MAILER_RESEND_WEBHOOK_SECRET=whsec_...

Sending

Newsletters scheduled in the admin UI are dispatched by the scheduler command. Add it to your console schedule:

$schedule->command('mailer:newsletters')->everyFifteenMinutes();

Change log

Please see the changelog for more information on what has changed recently.

Testing

The package uses orchestra/testbench:

composer install
vendor/bin/phpunit

Contributing

Please see CONTRIBUTING.md for details.

Security

If you discover any security related issues, please email petros@dinubo.com instead of using the issue tracker.

Credits

License

MIT. Please see the license file for more information.

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 2
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-06-10

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固