PHPackages                             zanysoft/mail-tracker - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Mail &amp; Notifications](/categories/mail)
4. /
5. zanysoft/mail-tracker

ActiveLibrary[Mail &amp; Notifications](/categories/mail)

zanysoft/mail-tracker
=====================

Logs and tracks all outgoing emails from Laravel

2.0(1mo ago)22781MITPHPPHP ^8.0

Since Dec 4Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/zanysoft/mail-tracker)[ Packagist](https://packagist.org/packages/zanysoft/mail-tracker)[ Docs](https://github.com/zanysoft/mail-tracker)[ RSS](/packages/zanysoft-mail-tracker/feed)WikiDiscussions main Synced today

READMEChangelog (2)Dependencies (12)Versions (5)Used By (0)

MailTracker
===========

[](#mailtracker)

[![Latest Version on Packagist](https://camo.githubusercontent.com/92f20275651389e3c3b3fa5d7d2cbfa743055d1aabe920d8c181a15a2702951b/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7a616e79736f66742f6d61696c2d747261636b65722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/zanysoft/mail-tracker)[![Software License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)[![Total Downloads](https://camo.githubusercontent.com/03f9d7744b755e33e61956b128b8b76efeda6d303157e2588781223e84ca51dd/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f7a616e79736f66742f6d61696c2d747261636b65722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/zanysoft/mail-tracker)[![Travis](https://camo.githubusercontent.com/7c8f7e15e8d3e077292647cf22c58c679fa415ff025436b3a3a389fcd3628061/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f7a616e79736f66742f6d61696c2d747261636b65722f6d61737465722e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/zanysoft/mail-tracker)

MailTracker will hook into all outgoing emails from Laravel and inject a tracking code into it. It will also store the rendered email in the database. There is also an interface to view sent emails.

NOTE: If you are using Laravel 9.x you MUST be on version 9.6.0 or higher.
--------------------------------------------------------------------------

[](#note-if-you-are-using-laravel-9x-you-must-be-on-version-960-or-higher)

Upgrade from 1.0
----------------

[](#upgrade-from-10)

First, upgrade to version 2.0 by running:

```
composer require zanysoft/mail-tracker ~2.0
```

If you are updating from an earlier version, you will need to update the config file and run the new migrations. For best results, make a backup copy of config/mail-tracker.php and the views in resources/views/vendor/emailTrackingViews (if they exists) to restore any values you have customized, then delete that file and run

```
php artisan vendor:publish --provider="ZanySoft\MailTracker\MailTrackerServiceProvider" --force
```

```
php artisan migrate
```

Install
-------

[](#install)

Via Composer

```
$ composer require zanysoft/mail-tracker
```

Publish the config file and migration

```
$ php artisan vendor:publish --provider="ZanySoft\MailTracker\MailTrackerServiceProvider"
```

Run the migration

```
php artisan migrate
```

Note: If you would like to use a different connection to store your models, you should update the mail-tracker.php config entry `connection` before running the migrations.

If you would like to use your own migrations, you can skip this library migrations by calling `MailTracker::ignoreMigrations()`. For example:

```
// In AppServiceProvider

public function register()
{
    MailTracker::ignoreMigrations();
}
```

Usage
-----

[](#usage)

Once installed, all outgoing mail will be logged to the database. The following config options are available in config/mail-tracker.php:

- **name**: set your App Name.
- **inject-pixel**: set to true to inject a tracking pixel into all outgoing html emails.
- **track-links**: set to true to rewrite all anchor href links to include a tracking link. The link will take the user back to your website which will then redirect them to the final destination after logging the click.
- **expire-days**: How long in days that an email should be retained in your database. If you are sending a lot of mail, you probably want it to eventually expire. Set it to zero to never purge old emails from the database.
- **route**: The route information for the tracking URLs. Set the prefix and middlware as desired.
- **admin-route**: The route information for the admin. Set the prefix and middleware.
- **admin-template**: The params for the Admin Panel and Views. You can integrate your existing Admin Panel with the MailTracker admin panel.
- **date-format**: You can define the format to show dates in the Admin Panel.
- **content-max-size**: You can overwrite default maximum length limit for `content` database field. Do not forget update it's type from `text` if you need to make it longer.

If you do not wish to have an email tracked, then you can add the `X-No-Track` header to your message. Put any random string into this header to prevent the tracking from occurring. The header will be removed from the email prior to being sent.

```
\Mail::send('email.test', [], function ($message) {
    // ... other settings here
    $message->getHeaders()->addTextHeader('X-No-Track',Str::random(10));
});
```

### Storing content of mails in filesystem

[](#storing-content-of-mails-in-filesystem)

By default, the content of an e-mail is stored in the `content` column in the database so that the e-mail can be viewed after it has been sent. If a lot of emails are sent, this can consume a lot of memory and slow down the database overall. It is possible to specify in the configuration that the content should be saved to a file in the file system.

```
    'log-content-strategy' => 'filesystem',
    'tracker-filesystem' => null
    'tracker-filesystem-folder' => 'mail-tracker',
```

To use the filesystem you need to change the `log-content-strategy` from `database` to `filesystem`. You can specify the disk with `tracker-filesystem` and the folder it should store the file in with `tracker-filesystem-folder`.

### Overriding models

[](#overriding-models)

In some cases you want to override the built-in models. You can do so easily for example in you `AppServiceProvider` with

```
MailTracker::useSentEmailModel(YourOwnSentEmailModel::class);
MailTracker::useSentEmailUrlClickedModel(YourOwnSentEmailUrlClickedModel::class);
```

Your model should implement to `SentEmailModel` or `SentEmailUrlClickedModel` interface. This package provides traits to easily implement your own models but not have to reimplement or copy existing code.

```
use Illuminate\Database\Eloquent\Model;
use ZanySoft\MailTracker\Concerns\IsSentEmailModel;
use ZanySoft\MailTracker\Contracts\SentEmailModel;

class OwnEmailSentModel extends Model implements SentEmailModel {
    use IsSentEmailModel;

    protected static $unguarded = true;

    protected $casts = [
        'meta' => 'collection',
        'opened_at' => 'datetime',
        'clicked_at' => 'datetime',
    ];
}
```

Skip Tracking for Specific Emails
---------------------------------

[](#skip-tracking-for-specific-emails)

If you have a specific email that you do not want to track, you can add the `X-No-Track` header to the email. This will prevent the email from being tracked. The header will be removed from the email prior to being sent.

In laravel 9 onwards you can introduce a headers method to your Mailable class. This will stop the tracking pixel/click tracking from applying to the Mailable

```
public function headers()
{
    return [
        'X-No-Track' => Str::random(10),
    ];
}
```

Skipping Open/Click Tracking for Anti-virus/Spam Filters
--------------------------------------------------------

[](#skipping-openclick-tracking-for-anti-virusspam-filters)

Some mail servers might scan emails before they deliver which can trigger the tracking pixel, or even clicked links. You can add an event listener to the ValidActionEvent to handle this.

```
class ValidUserListener {
    public function handle(ValidActionEvent $event)
    {
        if (in_array(request()->userAgent(), ['Mozilla/5.0', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246 Mozilla/5.0']) {
            $event->skip = true;
        }
    }
}
```

Ensure you add the listener to the `ValidActionEvent` in your `EventServiceProvider`, if you aren't using automatic event discovery.

Events
------

[](#events)

When an email is sent, viewed, or a link is clicked, its tracking information is counted in the database using the ZanySoft\\MailTracker\\Model\\SentEmail model. This processing is done via dispatched jobs to the queue in order to prevent the database from being overwhelmed in an email blast situation. You may choose the queue that these events are dispatched via the `mail-tracker.tracker-queue` config setting, or leave it `null` to use the default queue. By using a non-default queue, you can prioritize application-critical tasks above these tracking tasks.

You may want to do additional processing on these events, so an event is fired in these cases:

- ZanySoft\\MailTracker\\Events\\EmailSentEvent
    - Public attribute `sent_email` contains the `SentEmail` model
- ZanySoft\\MailTracker\\Events\\ViewEmailEvent
    - Public attribute `sent_email` contains the `SentEmail` model
    - Public attribute `ip_address` contains the IP address that was used to trigger the event
- ZanySoft\\MailTracker\\Events\\LinkClickedEvent
    - Public attribute `sent_email` contains the `SentEmail` model
    - Public attribute `ip_address` contains the IP address that was used to trigger the event
    - Public attribute `link_url` contains the clicked URL

If you are using the Amazon SNS notification system, these events are fired so you can do additional processing.

- ZanySoft\\MailTracker\\Events\\EmailDeliveredEvent (when you received a "message delivered" event, you may want to mark the email as "good" or "delivered" in your database)
    - Public attribute `sent_email` contains the `SentEmail` model
    - Public attribute `email_address` contains the specific address that was used to trigger the event
- ZanySoft\\MailTracker\\Events\\ComplaintMessageEvent (when you received a complaint, ex: marked as "spam", you may want to remove the email from your database)
    - Public attribute `sent_email` contains the `SentEmail` model
    - Public attribute `email_address` contains the specific address that was used to trigger the event
- ZanySoft\\MailTracker\\Events\\PermanentBouncedMessageEvent (when you receive a permanent bounce, you may want to mark the email as bad or remove it from your database) ZanySoft\\MailTracker\\Events\\TransientBouncedMessageEvent (when you receive a transient bounce. Check the event's public attributes for `bounce_sub_type` and `diagnostic_code` to determine if you want to do additional processing when this event is received.)
    - Public attribute `sent_email` contains the `SentEmail` model
    - Public attribute `email_address` contains the specific address that was used to trigger the event

To install an event listener, you will want to create a file like the following:

```
