Я получаю поврежденный файл при открытии вложения электронной почты, отправленного с версией PHP SendGrid для PHP

Я пытаюсь отправить вложения с помощью SendGrid через PHP, но получаю сообщение об ошибке поврежденного файла при открытии вложения. Сообщение об ошибке «Извините. Мы не можем открыть файл file.docx, потому что мы обнаружили проблему с его содержимым», и когда я нажимаю на детали ошибки, я вижу «Файл поврежден и не может быть открыт»

Мой код выглядит следующим образом:

$sendGridLoginInfo = $contactViaEmail->getSendGridLoginInfo();
$sendgrid = new SendGrid($sendGridLoginInfo['Username'], $sendGridLoginInfo['Password']);
$mail = new SendGrid\Mail();
//Add the tracker args
$mail->addUniqueArgument("EmailID", $emailID);
$mail->addUniqueArgument("EmailGroupID", $emailGroupID);
/*
*    INSERT THE SUBSITUTIONS FOR SEND GRID
*/
foreach ($availableSubstitutions as $availableSubstitution)
{
$mail->addSubstitution("[[" . $availableSubstitution . "]]", $substitutions[$availableSubstitution]);
}

/*
*    ADD EACH EMAIL AS A NEW ADD TO
*    This makes it BCC (because each person gets their own copy) and each person gets their own individualized email.
*/
foreach ($emailInfo['SendToEmailAddress'] as $toEmail)
{if ($sendToLoggedInUser)
{
$mail->addTo($adminEmailAddress);
}
else
{
$mail->addTo($toEmail);
}
$trashCount++;
}

//Set the subject
$mail->setSubject($emailInfo['EmailSubject']);

//Instantiate the HTML Purifier (for removing the html)
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML', 'Allowed', '');
$purifier = new HTMLPurifier($config);
$mail->setText($purifier->purify($emailBody));
$mail->setHtml($emailBody);

if ($emailInfo['AttachmentID'])
{
$sql = "SELECT
AttachmentPath
FROM
EmailAttachments
WHERE
EmailAttachments.AttachmentID = :attachmentID";
if ($query = $pdoLink->prepare($sql))
{
$bindValues = array();
$bindValues[":attachmentID"] = $emailInfo['AttachmentID'];

if ($query->execute($bindValues))
{
if ($row = $query->fetch(\PDO::FETCH_ASSOC))
{
$attachment = "";
$mail->addAttachment($sitedb . $row['AttachmentPath']);
}
}
}
}if ($sendToLoggedInUser)
{
$mail->setFrom($adminEmailAddress);
$mail->setReplyTo($adminEmailAddress);
}
else
{
$mail->setFrom($emailInfo['FromAddress']);
$mail->setReplyTo($emailInfo['ReplyTo']);
}
$mail->setFromName($emailInfo['FromName']);

$sendgrid->web->send($mail);

Я поиграл с типом контента и всем остальным, о чем я могу думать, и просто не могу выяснить, что является причиной повреждения приложений.

0

Решение

Вам нужно создать объект вложения, чтобы добавить вложение, вы не можете использовать путь напрямую, как вы. SendGrid требует, чтобы файлы отправлялись как строки в кодировке base64.

Вам нужно будет создать объект вложения, вы можете сделать это как метод:

public function getAttachment($path)
{
if (!file_exists($path)) {
return false;
}

$attachment = new SendGrid\Attachment;
$attachment->setContent(base64_encode(file_get_contents($path)));
$attachment->setType(mime_content_type($path));
$attachment->setFilename(basename($path));
$attachment->setDisposition('attachment');
return $attachment;
}

Тогда добавьте это к своей электронной почте:

$attachment = $this->getAttachment($sitedb . $row['AttachmentPath']);
if ($attachment instanceof SendGrid\Attachment) {
$mail->addAttachment($attachment);
}
1

Другие решения

Других решений пока нет …