Effortless Email Archiving: Saving Sent Emails on Server with Laravel IMAP
Tags: laravel, email, imap, php
Published: 2023-06-11 13:49:25

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.
 > **_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 
```php
$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. 
```php
$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. 
```php
$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](http://www.faqs.org/rfcs/rfc2060.html)

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](https://twitter.com/koossaayy) or comment down below.
[Original Post](https://koossaayy.tn/effortless-email-archiving-saving-sent-emails-on-server-with-laravel-imap)
Thank you again and have a nice day.