MailBag is a simple plaintext-focused email manager. The application has been purpose-built for a fairly simple use-case. Due to limited time, I don't have much of a desire to widen the scope.
Home Dashboard | Campaign | Edit Send |
List Signup | Unsubscribe |
- One-off sends of plaintext emails.
- List management with user-signup form & email confirmation flow.
- List level & contact-level unsubscribe options via links in sends.
- RSS feed sends, sending emails every set number of days with new items from the feed.
- Auto-scheduled unsubscribed contact scrubbing.
- hCaptcha integration on sign-up forms.
- Plain text emails only, No HTML emails.
- No open/click tracking of any kind.
- No scheduled sends.
- Limited built-in customization.
- Requires SMTP service for actual email sending.
- Weak mobile support within admin interface.
Here are some much fuller-featured alternatives to MailBag:
As said above, Due to limited time I don't want to widen the scope and stack on features, especially with there already being good alternatives as listed above. However, if you find some bugs or can provide fixes to existing functionality feel free to provide them.
MailBag is built using the following great projects:
The below outlines the process for install, but it's really intended for those with a little experience with webservers and modern PHP software. It's a fairly involved process. For further help you can try searching for "Laravel install" guides since the process will be much the same due to the app being built upon Laravel.
Some guidance and a nginx example can be seen on the Laravel docs here: https://laravel.com/docs/8.x/deployment#server-requirements.
MailBag has the following requirements:
- PHP > 8.1
- Extensions: BCMath, Ctype, Fileinfo, JSON, Mbstring, OpenSSL, PDO, Tokenizer, XML, SQLite3
- SQLite > 3.30
- Composer
- Ideally Nginx, Apache or similar kind of server to handling incoming requests.
- SMTP service for sending the emails.
- NodeJS v18+ & NPM
You'll also need command-line access on the host including the ability to configure cron and process management. Using git will help with keeping the codebase versions for managing updates.
# Clone down the project files using git
git clone https://github.com/ssddanbrown/mailbag.git
# cd into the application folder and install the dependencies via composer
composer install --no-dev
# Copy the .env.example file to .env and fill with your own details
cp .env.example .env # (Then go through each option in there)
# Set the application key
php artisan key:generate
# Create the storage/database/database.sqlite file
touch storage/database/database.sqlite
# Migrate the database
php artisan migrate
# Install and build JS/CSS dependencies
npm install
npm run build
# Check the storage/ and boostrap/cache (and all subfolders) are writable by the webserver, Commands reflect ubuntu common defaults
chown -R www-data:www-data storage/ boostrap/cache/
# Set up your webserver with the root pointing at the `public/` folder. (Nginx "root" or Apache "DocumentRoot").
# Done! Login at the `/login` path of the domain you configured mailbag on. (eg. http://domain/login)
The application has some scheduled tasks such as contact cleanup and RSS feed checking. For this, you need to add a cron entry that runs evey minute like so:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
You'll need to change the path-to-your-project
to be where your mailbag folders are. It'll be wise to setup the cron as someone that'll have permission to read & write the app files, including the folders that you may have changed permissions for to grant the webserver access.
MailBag uses queues for common operations such as sending mail and processing RSS feeds. For very small setups you could get away with not using a queue, but it'd be risky due to various PHP timeouts.
The Laravel docs have some details in using supervisor
to run a queue: https://laravel.com/docs/8.x/queues#installing-supervisor
Alternatively you could create a systemd
service like so:
[Unit]
Description=MailBag Queue
[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /path-to-your-project/artisan queue:work --sleep=3 --tries=1
[Install]
WantedBy=multi-user.target
This project uses phpunit for testing. Tests are located within the tests/
directory.
You can run the tests using:
./vendor/bin/phpunit
This project uses Larastan, an extension of PHPStan, for static analysis. You can run static analysis checks using:
./vendor/bin/phpstan analyse