PHPackages                             molnix/bounced-mail-manager - 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. molnix/bounced-mail-manager

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

molnix/bounced-mail-manager
===========================

Check for bounced emails and take action on them.

v2.1.1(11mo ago)51.1k↓75%MITPHPPHP ^7.1|^8.0

Since Sep 28Pushed 11mo ago2 watchersCompare

[ Source](https://github.com/Molnix-open-source/BouncedMailManager)[ Packagist](https://packagist.org/packages/molnix/bounced-mail-manager)[ RSS](/packages/molnix-bounced-mail-manager/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (7)Dependencies (5)Versions (10)Used By (0)

Bounced mail manager
====================

[](#bounced-mail-manager)

A package can read IMAP and parse mails to check if they are bounced emails. **When used with laravel, can notifiy the original sender.**

Installation:
-------------

[](#installation)

```
composer require molnix/bounced-mail-manager
```

Add the custom headers created by the `getCustomHeaders` method to outgoing mails.

```
Molnix\BouncedMailManager\Message\Header::getCustomHeaders(
string  $sender, // Sender email to send notificaitons
string  $sentTo, // send to email
string  $subject ='' optional subject
): array
```

### Laravel

[](#laravel)

Package can be customized with optional env variables

VariableDescription`BOUNCEMAIL_HOST`IMAP host url, default: **MAIL\_HOST** from .env`BOUNCEMAIL_PORT`IMAP port, default: **993**`BOUNCEMAIL_USERNAME`IMAP username, default: **MAIL\_USERNAME** from .env`BOUNCEMAIL_PASSWORD`IMAP password, default: **MAIL\_PASSWORD** from .env`BOUNCEMAIL_MAILBOX`Mailox name, default: **INBOX**`BOUNCEMAIL_DELETE_MODE`False will use *read/unread* instead of deleting, default: **true**`BOUNCEMAIL_TYPE`Mailbox type: null. imap,o365 , default: **imap**`BOUNCEMAIL_OAUTH_CLIENT_ID`Oauth client id , default: **null**`BOUNCEMAIL_OAUTH_SECRET`Oauth secret , default: **null**`BOUNCEMAIL_AZURE_TENANT_ID`Azure tenant id if using office 365 , default: **null**#### Configuration

[](#configuration)

The package will automatically register a service provider. You can publish for further customization.

TagDescription`config`Configuration`views`Notification email markdown`translations`Bounce reason translationsOptionally publish files if further customization is required.

```
php  artisan  vendor:publish  --provider="Molnix\BouncedMailManager\BounceManagerServiceProvider"  --tag="config"
php  artisan  vendor:publish  --provider="Molnix\BouncedMailManager\BounceManagerServiceProvider"  --tag="views"
php  artisan  vendor:publish  --provider="Molnix\BouncedMailManager\BounceManagerServiceProvider"  --tag="translations"
```

### Usage

[](#usage)

Use `Molnix\BouncedMailManager\Traits\BounceMailHeaders` trait in Mailable to add headers to outgoing headers.

Option 1: With setup

```
// PostMail
use BounceMailHeaders;
public function __construct(Comment $comment)
    {
        $this->comment = $comment;
        $this->setupBounceManager();
    }
public function build(){
    $this->subject('Comment added')
                ->markdown('emails.comment')
                ->addBounceManagerHeaders();
}
```

Option 2: Without setup

```
// PostMail
use BounceMailHeaders;
public function __construct(Comment $comment, $sender)
    {
        $this->comment = $comment;
        $this->sender = $sender;
    }
public function build(){
    $this->subject('Comment added')
                ->markdown('emails.comment')
                ->addBounceManagerHeaders($this->sender);
}
```

Add this command to the scheduler.

```
php artisan bouncemanager:run
```

PHP
---

[](#php)

```
- #### Create instance
```php
use Molnix\BouncedMailManager\BounceManager;
$manager = new BounceManager(
    'imap.example.com',
    '993',
    'wind@example.com',
    'emailpassword',
    string $mailbox = 'INBOX',
    array $options = [] // extra optional options
);
```

or

```
use Molnix\BouncedMailManager\BounceManager;
use Molnix\BouncedMailManager\Clients\ImapClient;

$manager->setClient(new ImapClient(
    'imap.example.com',
    '993',
    'wind@example.com',
    'emailpassword',
    string $mailbox = 'INBOX',
    array $options = [] // extra optional options
));
```

or Office 365 way

```
use Molnix\BouncedMailManager\BounceManager;
use Molnix\BouncedMailManager\Clients\O365Client;

$manager = new BounceManager();
$manager->setClient(new O365Client('wind@example.com', $tenant_id, $client_id, $client_secret));
```

- #### Change mailbox

    [](#change-mailbox)

```
$manager->setMailbox('OtherMailbBoxName');
```

- #### Set period of days to parse

    [](#set-period-of-days-to-parse)

```
// Use -1 for all mails.
$manager->setDaysFrom(10); // Since last 10 days
```

- #### Set how to handle processed email management. Default is to mark the mail as seen. To use delete after process:

    [](#set-how-to-handle-processed-email-management-default-is-to-mark-the-mail-as-seen-to-use-delete-after-process)

```
$manager->enableDeleteMode(); // Since last 10 days
```

- #### Get data

    [](#get-data)

```
$manager->toArray(); // Returns simple array of bounces.
$manager->get(); // Returns array of bounces objects.
```

### Setup office 365 mailbox.

[](#setup-office-365-mailbox)

The setup needed to be done in two section,

1. Azure web portal
2. Powershell

Azure web portal
----------------

[](#azure-web-portal)

1. #### Register app in azure

    [](#register-app-in-azure)

[![Screenshot from 2023-12-04 17-12-11](https://private-user-images.githubusercontent.com/15659965/287743056-ff71aacb-ea6b-424b-9ecd-b576134be470.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDMwNTYtZmY3MWFhY2ItZWE2Yi00MjRiLTllY2QtYjU3NjEzNGJlNDcwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBmNjZkOTQ1YzE5ZDU0NzM3MzkyMGQwODBlZmI4NDU3MjQ2ZDVjMzY4NjY4ZDVlZDE5MTNiNzI2MTVkMGQ1NzkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.x_DQ6LeeS8kDEKMhPSeeeGpLgwp1Duf6OiADjSRo9Ow)](https://private-user-images.githubusercontent.com/15659965/287743056-ff71aacb-ea6b-424b-9ecd-b576134be470.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDMwNTYtZmY3MWFhY2ItZWE2Yi00MjRiLTllY2QtYjU3NjEzNGJlNDcwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBmNjZkOTQ1YzE5ZDU0NzM3MzkyMGQwODBlZmI4NDU3MjQ2ZDVjMzY4NjY4ZDVlZDE5MTNiNzI2MTVkMGQ1NzkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.x_DQ6LeeS8kDEKMhPSeeeGpLgwp1Duf6OiADjSRo9Ow)

2. #### Setup Permissions, Click on `API permissions` -&gt; `APIs my organization uses` tab -&gt; serach `Office 365 Exchange Online` -&gt; `Application permissions` -&gt; `IMAP.AccessAsApp`

    [](#setup-permissions-click-on-api-permissions---apis-my-organization-uses-tab---serach-office-365-exchange-online---application-permissions---imapaccessasapp)

[![Screenshot from 2023-12-04 17-20-23](https://private-user-images.githubusercontent.com/15659965/287745360-9fa418ea-d3b2-488c-a35f-b043709bc458.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDUzNjAtOWZhNDE4ZWEtZDNiMi00ODhjLWEzNWYtYjA0MzcwOWJjNDU4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYwOWRjN2M5MmY2ZDNhY2E4ZGU2NjBhYWEwMmUxYWZlMGQ4MzNmMzQwYWRkMjMzNjljMTk3NTA3YzUyNjIyOTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.BDt7iNfdVtIVxiUySAsSQboMQsMuaSualYJNXYe4Wu4)](https://private-user-images.githubusercontent.com/15659965/287745360-9fa418ea-d3b2-488c-a35f-b043709bc458.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDUzNjAtOWZhNDE4ZWEtZDNiMi00ODhjLWEzNWYtYjA0MzcwOWJjNDU4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYwOWRjN2M5MmY2ZDNhY2E4ZGU2NjBhYWEwMmUxYWZlMGQ4MzNmMzQwYWRkMjMzNjljMTk3NTA3YzUyNjIyOTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.BDt7iNfdVtIVxiUySAsSQboMQsMuaSualYJNXYe4Wu4)

3. #### `Grant admin consent` by clicking the button

    [](#grant-admin-consent-by-clicking-the-button)

[![Screenshot from 2023-12-04 17-21-44](https://private-user-images.githubusercontent.com/15659965/287745927-ecd44fa4-0599-42ab-a0db-0db1043ca3bf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDU5MjctZWNkNDRmYTQtMDU5OS00MmFiLWEwZGItMGRiMTA0M2NhM2JmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThlY2EyMTAwZjM5ZDgzNDJiOGVhN2FiNmQzNTlhZDE2MmYxOTEyZGY4ZTYyYjNhYTM4MTlkY2I1N2MwZDMyYTImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.x98LuRzWTjm1ol1y-9P8nuGgnj_uSHuw6wQVrW0SWlM)](https://private-user-images.githubusercontent.com/15659965/287745927-ecd44fa4-0599-42ab-a0db-0db1043ca3bf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDU5MjctZWNkNDRmYTQtMDU5OS00MmFiLWEwZGItMGRiMTA0M2NhM2JmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPThlY2EyMTAwZjM5ZDgzNDJiOGVhN2FiNmQzNTlhZDE2MmYxOTEyZGY4ZTYyYjNhYTM4MTlkY2I1N2MwZDMyYTImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.x98LuRzWTjm1ol1y-9P8nuGgnj_uSHuw6wQVrW0SWlM)

4. ### Create app secret. Once created, Copy the value as it shows only once.

    [](#create-app-secret-once-created-copy-the-value-as-it-shows-only-once)

[![Screenshot from 2023-12-04 17-25-49](https://private-user-images.githubusercontent.com/15659965/287747148-3cf2b84e-7337-4475-99cf-f5fb882d204a.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDcxNDgtM2NmMmI4NGUtNzMzNy00NDc1LTk5Y2YtZjVmYjg4MmQyMDRhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVhNGJkYjZjNTdkYzRiMjZjNjA5MmVmZjIyNTE0YzAzNDM5MTAxOGFjNzMxMDk3MmE5NGQwYWQ5NjNhY2YzNjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.zPYGnJctC8M9qEHbmnT60rcW2BvfUkvP2kknwZWhf9k)](https://private-user-images.githubusercontent.com/15659965/287747148-3cf2b84e-7337-4475-99cf-f5fb882d204a.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUwMTIyNzEsIm5iZiI6MTc3NTAxMTk3MSwicGF0aCI6Ii8xNTY1OTk2NS8yODc3NDcxNDgtM2NmMmI4NGUtNzMzNy00NDc1LTk5Y2YtZjVmYjg4MmQyMDRhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDAxVDAyNTI1MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWVhNGJkYjZjNTdkYzRiMjZjNjA5MmVmZjIyNTE0YzAzNDM5MTAxOGFjNzMxMDk3MmE5NGQwYWQ5NjNhY2YzNjAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.zPYGnJctC8M9qEHbmnT60rcW2BvfUkvP2kknwZWhf9k)

Powershell
----------

[](#powershell)

Run these commands in powershell in order one by one. Remember to replace values for `$AppId` with `Application (client) ID`, `$TenantId` with `Directory (tenant) ID`. These can be found in the app page in azure web. `Your email ID` with the mailbox email you grant access to.

```
Install-Module -Name AzureAD
Install-Module -Name ExchangeOnlineManagement

$AppId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
$TenantId = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

Import-module AzureAD
Connect-AzureAd -Tenant $TenantId

($Principal = Get-AzureADServicePrincipal -filter "AppId eq '$AppId'")
$PrincipalId = $Principal.ObjectId

$DisplayName = "Bounce manager IMAP Access"

Import-module ExchangeOnlineManagement
Connect-ExchangeOnline -Organization $TenantId

New-ServicePrincipal -AppId $AppId -ServiceId $PrincipalId -DisplayName $DisplayName

Add-MailboxPermission -User $PrincipalId -AccessRights FullAccess -Identity "Your email ID"
```

Usage

```
use Molnix\BouncedMailManager\BounceManager;
use Molnix\BouncedMailManager\Clients\O365;

$manager = new BounceManager();
$manager->setClient(new O365('wind@example.com', $tenant_id, $client_id, $client_secret));
$manager->get();
```

Made with ❤ in Finland by [Molnix](https://molnix.com) and [Webbhuset](https://webbhuset.fi)

###  Health Score

36

—

LowBetter than 82% of packages

Maintenance50

Moderate activity, may be stable

Popularity20

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~101 days

Recently: every ~145 days

Total

7

Last Release

355d ago

Major Versions

v1.0.3 → v2.0.02023-12-05

### Community

Maintainers

![](https://www.gravatar.com/avatar/27094e8876f8125fb8f6c5e2f6856d28019864eeb4950a56960df79aa247ac80?d=identicon)[vish404](/maintainers/vish404)

---

Top Contributors

[![vish404](https://avatars.githubusercontent.com/u/15659965?v=4)](https://github.com/vish404 "vish404 (11 commits)")

---

Tags

laravellaravel-packagemailboxlaravelemailbounce

###  Code Quality

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/molnix-bounced-mail-manager/health.svg)

```
[![Health](https://phpackages.com/badges/molnix-bounced-mail-manager/health.svg)](https://phpackages.com/packages/molnix-bounced-mail-manager)
```

###  Alternatives

[erag/laravel-disposable-email

A Laravel package to detect and block disposable email addresses.

226102.4k](/packages/erag-laravel-disposable-email)[ferdous/laravel-otp-validate

Laravel package for OTP validation with built-in features like retry and resend mechanism. Built in max retry and max resend blocking. OTP/Security Code can be send over SMS or Email of your choice with user-defined template.

7124.4k](/packages/ferdous-laravel-otp-validate)[movemoveapp/laravel-dadata

Laravel SDK for working with the DaData.RU service API

45209.8k](/packages/movemoveapp-laravel-dadata)[ashallendesign/laravel-mailboxlayer

A lightweight Laravel package for validating emails using the Mailbox Layer API.

762.0k](/packages/ashallendesign-laravel-mailboxlayer)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
