Effortless Email Archiving Saving Sent Emails on Server with Laravel IMAP
Hello,
Sending emails with Laravel is really one of the easiest things to do. For example, sending password resets, or account activation, but sometimes, you want to send emails to your users and leave a trail for that. In order to do so, you have 2 options, either storing the email in the database, or save it on the IMAP server.
In this tutorial we will see the second option, append the sent email to the IMAP server. So let's get started.In this tutorial we will see the second option, append the sent email to the IMAP server. So let's get started.
NOTE: : This tutorial will assume you have a Laravel installation in place already.
The first thing to do is to install laravel-imap
package
composer require webklex/laravel-imap
After installing it, we will set up the IMAP credentials in our .env
file.
After opening the .env
file, paste the following code at the end of the file.
IMAP_HOST="imaphost"
IMAP_PORT="993"
IMAP_ENCRYPTION="ssl"
IMAP_VALIDATE_CERT="true"
IMAP_USERNAME="email"
IMAP_PASSWORD="password"
IMAP_DEFAULT_ACCOUNT=default
IMAP_PROTOCOL=imap
Then change the values in according to your configuration.
The next step is to generate a Mailable so we can send it, to do so, just run this command:
php artisan make:mail TestMail
This command will generate a new mailable class called TestMail.php
.
All you need to do now is open the file and edit it (mainly adjust the view name).
NOTE: : You can see other tutorials about sending emails using Laravel.
Now after everything is in place, now we will try to send the email and save it on the IMAP server.
So to send the email, all you need to do is the following
$mail = Mail::to('hello@gmail.com')->send(new TestMail());
Note here, we saved the result in the $mail
variable, because we will use that to store the sent email.
After the email was sent, we need to connect to our IMAP server now.
$client = Client::account('default');
$client->connect();
$folder = $client->getFolderByName('Sent');
The code above will try to connect to the IMAP server using the credentials we put earlier in the .env
file. After the connection has been made, we will retrieve the Sent
folder.
NOTE: : The sent folder name is usually
Sent
, this depends on your IMAP configuration.
After successfully getting the folder, all we need now is to append it, by using the appendMessage
method.
$result = $folder->appendMessage($mail->getSymfonySentMessage()->toString(), ['\Seen'], now()->format("d-M-Y h:i:s O"));
Now let's break down this method, and see:
The first parameter, is the message in a string format.
The $mail
variable will be a SymfonySentMessage
type, so it has a method called getSymfonySentMessage()->toString()
, this method will return the string format of the message.
This is an example of the result:
From: Laravel <hello@example.com>
To: hello@gmail.com
Subject: Test Mail
Message-ID: <1259c22f78de504c28beabdb9eda5636@example.com>
MIME-Version: 1.0
Date: Sun, 11 Jun 2023 13:37:36 +0000
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
HELLO WORLD
Using this string, we will be able to append the sent message,
The second parameter is the flag, in this example, we will use the seen
flag, so it will be seen on the IMAP. You can learn more about flags on this RFC 2060
And finally, the date, we will use that to indicate when this message will be saved at IMAP.
Finally, we will check the result of the appendMessage
method.
The result will be something like that
'OK [APPENDUID 1655722943 20] Append completed (0.018 + 0.135 + 0.016 secs)';
If you have this string, then everything went okay.
I hope you liked this tutorial, and you gain information about it.
If something is not clear or you want ask about further information, you can contact me on Twitter or comment down below.
Thank you again and have a nice day.