Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sendgrid sending mail with attachment using web api v3

I'm new to using sendgrid web api v3. link here

Right now. It was easy to send a plain html using there api 'POST https://api.sendgrid.com/v3/mail/send' but I have this instance where we will attach a file (csv/xls,pdf) and I can't seem to get it right.

Here is my code below:

My function postSendMail

public function postSendMail($data = [])
{
    if ( ! arrayHasValue($data) ) $this->error(__METHOD__, "Data is empty.");

    $request = Curl::to( $this->apiUrl.'mail/send' )        
        ->withHeader('Authorization: Bearer '. $this->apiKey)
        ->withData( $data )
        ->asJson(true)
        ->enableDebug(storage_path('logs/laravel-'.php_sapi_name().'.log'))
        ->post();


    return $request;
}

//my instance
$sendgrid = new Sendgrid;
    $data = [
                'personalizations' => [
                        [
                            'to' => [
                                [ 'email' => '[email protected]' ]
                            ],
                            'subject' => 'Hello, World!'
                         ]
                    ],
                'from' => [
                        'email' => '[email protected]',
                        'name' => 'my_site'
                    ],
                'content' => [
                        [
                            'type' => 'text',
                            'value' => 'Hello, World!'
                         ]
                    ],
                'track_settings' => [
                        [
                            'click_tracking' => true,
                            'open_tracking' => true
                        ]
                    ],
                'attachments' => [
                        [
                            'content' => base64_encode(config('global.UPLOAD_PATH') . '/my_file.pdf'),
                            'type' => 'application/pdf',
                            'filename' => 'my_file.pdf',
                            'disposition' => 'attachment'
                        ]
                    ]
                ];

    $lists = $sendgrid->postSendMail($data);

Mail was successfully sent but when I view the attached file, it was corrupted/unable to view. Can anyone help me? :(

Please help.

like image 310
Wondering Coder Avatar asked Aug 16 '16 05:08

Wondering Coder


People also ask

Can I send attachments with SendGrid?

Sending email with attachments via SendGrid To send emails with attachments via SendGrid, you can employ our SMTP Relay or our Web API v3.

What is SendGrid v3 API?

What is the v3 Mail Send endpoint? The v3 Mail Send endpoint is the latest version of SendGrid's Web API endpoint that allows you to send email by making a simple HTTP request. The introduction of the v3 Mail Send endpoint signifies the completion of our RESTful Web API v3.

How do I send a SendGrid API email?

Send your email using the APIPaste the curl call into your favorite text editor. Copy your API key and paste it in the "Authorization" header. In the data section, specify the "to", "from", and "reply to" names and email addresses and enter a subject. Copy the code and paste it in your terminal.

How many emails can SendGrid send per hour?

Features. SendGrid: A free plan on SendGrid allows you to send up to 100 emails per day; upgrading to a paid plan, you can send up to 1,500 emails per day and no more than 400 emails per hour. If you use the custom pricing or premier plan, you can send up to 1.5 million emails in a month with access to a dedicated IP.


2 Answers

The problem is that you are not reading the file into an object and then encoding that object; you're encoding a string containing the file path.

'content' => base64_encode(config('global.UPLOAD_PATH') . '/my_file.pdf')

All of your attachments in the tests are probably the same size, and smaller than the actual file as a result.

Try something like:

$imagedata = file_get_contents(config('global.UPLOAD_PATH') . '/my_file.pdf');
$base64 = base64_encode($imagedata);
like image 142
bwest Avatar answered Oct 10 '22 20:10

bwest


Coming to main point you need to get file content either by curl request or by file_get_content then encode the that content into attachments->content parameter, Please check following code which works for me:

'attachments' => [

                [

                        'content' => base64_encode(file_get_contents(config('global.UPLOAD_PATH') . '/my_file.pdf')),
                        'type' => 'application/pdf',
                        'filename' => 'my_file.pdf',
                        'disposition' => 'attachment'
                    ]
                ]
like image 31
Farid Abbas Avatar answered Oct 10 '22 20:10

Farid Abbas