Отправляйте изображение как вложение, а также встроенное с помощью API Sendgrid

#php #image #api #curl #sendgrid

Вопрос:

Я хочу отправить электронное письмо с изображением в качестве вложения, а также вставить его в тело.

 <?php
$email = "to@example.com";
$name = "some_name";
$img = file_get_contents('image.jpg');
$body = '<img src = "cid:image">';
$subject = "Test email";

      

$headers = array(
    'Authorization: Bearer API_KEY',
    'Content-Type: application/json'
);

$data = array(
    "personalizations" => array(
        array(
            "to" => array(
                array(
                    "email" => $email,
                    "name" => $name
                )
            )
        )
    ),
    "from" => array(
        "email" => "from@example.com"
    ),
    "subject" => $subject,
    "content" => array(
        array(
            "type" => "text/html",
            "value" => $body
        )
    ),

    "attachments" => array(
        array(
            "content" => base64_encode($img),
            "type" => "image/jpeg",
            "filename" => "image",
            "disposition" => "inline",
            "content_ID" => "image",
            //"disposition" => "attachment"
        )
    )         
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.sendgrid.com/v3/mail/send");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);

echo $response;?>
 

Проблема в том, что это либо встроенное содержимое, либо вложение, но не то и другое вместе. Я не знаю, как это решить.
Я попытался добавить два отдельных блока вложений для встроенного и вложенного, но всегда учитывается второй блок.
Кажется, ничего не работает.

Ответ №1:

Евангелист-разработчик Twilio SendGrid здесь.

Вы не хотите устанавливать два одинаковых ключа в array (как вы это делаете для disposition ) или устанавливать два attachments блока. Вместо этого вы должны добавить в attachments блок два элемента, например:

     "attachments" => array(
        array(
            "content" => base64_encode($img),
            "type" => "image/jpeg",
            "filename" => "image-inline",
            "disposition" => "inline",
            "content_ID" => "image-inline",
        ),
        array(
            "content" => base64_encode($img),
            "type" => "image/jpeg",
            "filename" => "image-attachment",
            "disposition" => "attachment",
            "content_ID" => "image-attachment",
        ),
    ) 
 

Обратите внимание, что я также предоставил разные имена файлов и идентификаторы содержимого для встроенных и вложенных файлов.

Комментарии:

1. Я не могу использовать разные имена файлов, потому что файлы автоматически загружаются с веб-сайта с интервалом в одно и то же имя. Другими словами, различные файлы загружаются автоматически, и каждый раз предыдущее изображение заменяется новым изображением.

2. Но вы могли бы добавить префикс или суффикс к этому имени файла, верно?

3. Не могли бы вы сказать мне, как это сделать? Возможно, я задаю глупый вопрос, но я новичок в этом и не знаю, как это сделать.

4. Глядя на ваш код, я не думаю, что это действительно имеет большое значение. Вы можете просто назвать имя файла «встроенное изображение» или «вложение изображения», как я сделал в приведенном выше коде, верно? Вы пробовали управлять им таким образом?