To obtain your SMTP credentials you can create a free outbound account with CloudMailin.
The default PHP mail function doesn't actually have SMTP support for sending email. While it will allow sending to a local system it expects a different local configuration to perform the SMTP relay. However, it's actually very simple to use a third-party solution to send email over SMTP with PHP.
A few poplular libraries are PHPMailer, Pear Mail or SwiftMailer. Here we'll cover sending an email with SwiftMailer.
In this example we'll use composer to install SwiftMailer:
composer require "swiftmailer/swiftmailer:^6.0"
composer install
With SwiftMailer installed we'll include SwiftMailer in our PHP app and then create an SMTP transport to send our mail.
<?php
require('vendor/autoload.php');
$hostname = 'hostname from account';
$username = 'username from account';
$password = 'password from account';
$transport = (new Swift_SmtpTransport($hostname, 587, 'tls'))
->setUsername($username)
->setPassword($password);
$mailer = new Swift_Mailer($transport);
When the transport is created we'll need to set 'tls' so that the connection calls STARTTLS
and
establishes a TLS encrypted connection before we perform authentication. Then we'll set the username
and password so that the AUTH
command is called to authenticate the SMTP session.
Now we have a transport we can create and send the mail message:
$message = (new Swift_Message())
->setSubject('Hello from PHP SwiftMailer')
->setFrom(['from@example.com'])
->setTo(['to@example.com' => 'User Name']);
$headers = ($message->getHeaders())
-> addTextHeader('X-CloudMTA-Class', 'standard');
$message->setBody(
'<body>'.
'<h1>hello from php</h1>'.
'</body>'
);
$message->addPart('hello from PHP', 'text/plain');
$mailer->send($message);
Any additional headers can be set using addTextHeader
to the headers of the email message.
You'll notice here we're setting the additional X-CloudMTA-Class
header.
More details around this can be found in the Setting SMTP queue priority and Tagging
documentation.
Laravel creates a config/mail.php
file with the settings used to create emails over SMTP.
All of these settings can be modified by settings your .env
file. Since Laravel inherits it's
mailer from SwiftMailer we can use similar settings to above in our ENV to set this.
// .env
MAIL_MAILER=smtp
MAIL_HOST=host from account
MAIL_USERNAME=username from account
MAIL_PASSWORD=password from account
MAIL_PORT=587
MAIL_ENCRYPTION=tls
In addition we also recommend creating a default from
address in the config you can use something
like the following for this:
// config/mail.php
'from' => ['address' => 'example@example.com', 'name' => 'App Name'],
For more information about actually creating your email in Laravel take a look at the make:mail command.
Queueing a message can then be done using something like the following:
Mail::to($request->user())
->cc($moreUsers)
->bcc($evenMoreUsers)
->queue(new OrderShipped($order));
There are lots of options to use Queues and to delay sending email messages in laravel. Take a look at the Queueing Mail documentation for more information.
We should now have received a message in our inbox. Using CloudMailin we can also track the status
of each of our emails and see the delivery details. Any tags you've added as a x-cloudmta-tags
header can be used to filter the email messages and search.
If you need any SMTP credentials you can create an account for free and get your SMTP credentials on the outbound account page.
Make sure you changed the from address to match your verified domain and set a recipient
The SMTP transaction will reply with the message-id of the message to use for bounce tracking if required.
250 Thanks! Queued as: f78b876d-dd97-4e10-9a61-067f98044cc7
Of course if there are any questions feel free to contact us and we'll do our best to help you get setup sending email.