A lightweight wrapper for send mail. The interface is tottaly decoupled from the sender. The motivation is create a single interface for sending mail doesn't matter the sender. There are three options available:
composer require "byjg/mailwrapper=2.0.*"
The MailWrapper has your classes totally decoupled in three parts:
MailWrapper provides a envelope class with all the basic necessary attributes to create an email. As this Envelope class are totally decoupled from the Mailer engine, you can use it also as DTO. See an example below: (do not forget require "vendor/autoload.php"
)
<?php
// Create the email envelope
$envelope = new ByJG\Mail\Envelope();
$envelope->setFrom('[email protected]', 'John Doe');
$envelope->addTo('[email protected]');
$envelope->setSubject('Email Subject');
$envelope->setBody('html text body');
Once you have created the envelope you can send the email. Basically you have to register in the fabric all mailer you intend to use and then create the mailer:
<?php
// Register the available class
\ByJG\Mail\MailerFactory::registerMailer(\ByJG\Mail\Wrapper\PHPMailerWrapper::class);
\ByJG\Mail\MailerFactory::registerMailer(\ByJG\Mail\Wrapper\MailgunApiWrapper::class);
// Create the proper mailer based on the scheme
// In the example below will find the "mailgun" scheme
$mailer = \ByJG\Mail\MailerFactory::create('mailgun://api:[email protected]_DOMAIN');
// Send the email:
$mailer->send($envelope);
You can create the mailer directly without the factory:
<?php
$mailer = new \ByJG\Mail\Wrapper\MailgunApiWrapper(
new \ByJG\Util\Uri(
'mailgun://[email protected]_DOMAIN'
)
);
// Send the email:
$mailer->send($envelope);
<?php
$envelope = new \ByJG\Mail\Envelope('[email protected]', '[email protected]', 'Subject', 'Body');
$envelope->addAttachment('name_of_attachement', '/path/to/file', 'mime/type');
$mailer->send($envelope);
Adding an image as a inline attachment (or Embed) your mail reader will not show as download but you can use it as an local image in your email.
See the example:
<?php
$envelope = new \ByJG\Mail\Envelope('[email protected]', '[email protected]', 'Subject');
$envelope->addEmbedImage('mycontentname', '/path/to/image', 'mime/type');
$envelope->setBody('<img src="cid:mycontentname" />');
$mailer->send($envelope);
To create a new sender you have to define a URL like that:
scheme://username:password/smtpserver:port
The options are:
Part | Description |
---|---|
scheme | The email scheme: smtp, ssl, tls, mandrill and ses. Note that mandrill and ses use your own private api |
username | The username |
password | The password |
smtpserver | The SMTP Host |
port | The SMTP Port |
The protocols available are:
Scheme | Description | URI Pattern | Mailer Object |
---|---|---|---|
smtp | SMTP over insecure connection | smtp://username:[email protected]:25 | PHPMailerWrapper |
tls | SMTP over secure TLS connection | tls://username:[email protected]:587 | PHPMailerWrapper |
ssl | SMTP over secure SSL connection | ssl://username:[email protected]:587 | PHPMailerWrapper |
sendmail | Sending Email using PHP mail() | sendmail://localhost | SendMailWrapper |
mailgun | Sending Email using Mailgun API | mailgun://[email protected]_DOMAIN | MailgunApiWrapper |
ses | Sending Email using Amazon AWS API | ses://ACCESS_KEY_ID:[email protected] | AmazonSesWrapper |
fakesender | Do nothing | fakesender://anything | FakeSenderWrapper |
From December 2014, Google started imposing an authentication mechanism called XOAUTH2 based on OAuth2 for access to their apps, including Gmail. This change can break both SMTP and IMAP access to gmail, and you may receive authentication failures (often "5.7.14 Please log in via your web browser") from many email clients, including PHPMailer, Apple Mail, Outlook, Thunderbird and others. The error output may include a link to https://support.google.com/mail/bin/answer.py?answer=78754, which gives a list of possible remedies.
There are two main solutions:
You have to enable the option "Allow less secure apps". It does not really make your app significantly less secure. Reportedly, changing this setting may take an hour or more to take effect, so don't expect an immediate fix. You can start changing here
The connection string for sending emails using SMTP through GMAIL is:
tls://[email protected]:[email protected]:587
This option is currently unsupported.
Further information and documentation on how to set up can be found on this wiki page.
The connection url for the AWS SES api is:
ses://ACCESS_KEY_ID:[email protected]
The access_key_id and secret_key are created at AWS Control Panel. The region can be us-east-1, etc.
The connection url for the Mailgun api is:
mailgun://[email protected]_DOMAIN
The YOUR_API_KEY and YOUR_DOMAIN are defined at Mailgun Control Panel.
The Region of the endpoint can be configured by query parameter "region" (example: mailgun://[email protected]?region=eu)
Valid values are: us and eu.
The connection url for the Sendmail is:
sendmail://localhost
You need to setup in the php.ini
the email relay.
To implement your own wrapper you have to create a class inherited from: ByJG\Mail\Wrapper\BaseWrapper
and implement how to send in the method: public function send(Envelope $envelope);
class MyWrapper extends \ByJG\Mail\Wrapper\BaseWrapper
{
public static function schema()
{
return ['mywrapper'];
}
public function send(Envelope $envelope)
{
// Do how to send the email using your library
}
// You can create your own validation methods.
public function validate(Envelope $envelope)
{
parent::validate($envelope);
}
}
vendor/bin/phpunit