Я чувствую, что мне не хватает чего-то глупого …
Я использую PHP SDK для нового API Gmail для получения вложения из электронной почты. Я могу получить содержимое вложения, но если это не текстовый файл, я не могу открыть файл после его сохранения. Если приложение является PDF-файлом, оно не будет отображаться. Если это файл excel, он не открывается.
Что я делаю не так?
// this works; I get the attachment body, etc $data = $g->gmail->users_messages_attachments->get($email_account, $email_message_id, $p->getBody()->getAttachmentId()); $fh = fopen(DOC_ROOT."/file.pdf", "w+"); fwrite($fh, base64_decode($data->data)); fclose($fh);
Возможно, возникла проблема с расшифровкой данных вложения. Попробуйте использовать эту строку вместо данных вложений, прежде чем записывать их в файл.
$data = $g->gmail->users_messages_attachments->get($email_account, $email_message_id, $p->getBody()->getAttachmentId()); // Converting to standard RFC 4648 base64-encoding // see http://en.wikipedia.org/wiki/Base64#Implementations_and_history $data = strtr($data, array('-' => '+', '_' => '/')); $fh = fopen(DOC_ROOT."/file.pdf", "w+"); fwrite($fh, base64_decode($data->data)); fclose($fh);
$data = $g->gmail->users_messages_attachments->get($email_account, $email_message_id, $p->getBody()->getAttachmentId()); // Converting to standard RFC 4648 base64-encoding // see http://en.wikipedia.org/wiki/Base64#Implementations_and_history $data = strtr($data, array('-' => '+', '_' => '/')); $fh = fopen(DOC_ROOT."/file.pdf", "w+"); fwrite($fh, base64_decode($data->data)); fclose($fh);
Вам также необходимо присоединиться к пути, в котором вы хотите сохранить файл с частью имени файла полезной нагрузки сообщения.
Я не очень хорошо разбираюсь в php, но в python это будет равнозначно:
path = ''.join([store_dir, part['filename']]) f = open(path, 'w') f.write(file_data) f.close()
Где file_data
– это то, что вы расшифровали (ваши $data
)
Попробуйте выполнить следующее, чтобы декодировать возвращенные данные вложений перед тем, как записать их в файл.
$attachment_data = urlsafe_b64decode(utf8_encode($data->data));
работал на меня.