#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. Глядя на ваш код, я не думаю, что это действительно имеет большое значение. Вы можете просто назвать имя файла «встроенное изображение» или «вложение изображения», как я сделал в приведенном выше коде, верно? Вы пробовали управлять им таким образом?