Я пытаюсь сгенерировать VCard через PHP, и они отправляют его по электронной почте пользователю.Я написал первоначальный сценарий с жестко закодированными данными, но конечный результат заполнит VCard из MySQL.
При одновременном просмотре VCard с допустимой VCard (загруженной и протестированной с другого сайта)они выглядят практически одинаково, но когда я пытаюсь импортировать сгенерированную VCard, она появляется без данных.На самом деле, если я открою его на своем телефоне, он даже не узнает, что это vcard, а вместо этого просто отправит меня на сломанный Google Doc.
Я позаимствовал некоторый код из Википедии для форматированияvcard, и все вроде нормально.Вы видите ошибки в моем форматировании?Я пробовал разные разрывы строк - безрезультатно.Идеи?
Вот код моего поколения / почты:
<?php
$content = "BEGIN:VCARD\r";
$content .= "VERSION:3.0\r";
$content .= "CLASS:PUBLIC\r";
$content .= "FN:Joe Wegner\r";
$content .= "N:Wegner;Joe ;;;\r";
$content .= "TITLE:Technology And Systems Administrator\r";
$content .= "ORG:Wegner Design\r";
$content .= "ADR;TYPE=work:;;21 W. 20th St.;Broadview ;IL;60559;\r";
$content .= "EMAIL;TYPE=internet,pref:__munged__@wegnerdesign.com\r";
$content .= "TEL;TYPE=work,voice:__munged__\r";
$content .= "TEL;TYPE=HOME,voice:__munged__\r";
$content .= "URL:http://www.wegnerdesign.com\r";
$content .= "END:VCARD";
mail_attachment("Joe Wegner.vcf", $content, "__munged__@wegnerdesign.com", "__munged__@wegnerdesign.com", "Wegner Design Contacts", "__munged__@wegnerdesign.com", "Joe Wegner's Contact Info", "");
function mail_attachment($filename, $content, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
$fileatt_type = "application/octet-stream";
$headers = "FROM: ".$from_mail;
$data = chunk_split(base64_encode($content));
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";
$message .= "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type:text/html; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";
$message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt_type};\n" .
" name=\"{$filename}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";
echo "sending message";
mail($mailto, $subject, $message, $headers);
}
?>
Обновление 1: Это делает меня более запутанным, но, возможно, это поможет вам отладить.Я загрузил (плохо) сгенерированную VCard на свой компьютер, а также хорошую VCard, загруженную с другого веб-сайта.Как и ожидалось, мой сгенерированный открывается без данных, но хороший работает нормально.Затем я создал третий пустой файл с расширением .vcf и скопировал текст из моего (плохого) файла в этот пустой файл.Я открыл этот файл, и все данные показали отлично.Чтобы проверить еще больше, я скопировал текст из хорошего файла VCard в мой плохой файл, и он все еще открывался без данных.Итак, похоже, что это что-то из-за кодирования или чего-то другого, что я не понимаю.Это не права доступа - все они идентичны.
Обновление 2: Я изменил свой PHP так, чтобы он заставил меня загрузить VCard, а также отправить его по электронной почте.Загруженный файл открывается совершенно нормально, поэтому ошибка либо в том, как я кодирую (правильное слово?) Файл, либо в том, как GMail интерпретирует его.
Обновление 3: исправлено: Разобрался.Я не уверен, почему это так - потому что каждый другой учебник, который я могу найти, говорит об обратном - но было несколько ключевых изменений.Во-первых, я изменил кодировку в письме с base64 на 8bit, и я изменил содержимое вложения, чтобы оно было просто строкой, передаваемой в функцию электронной почты (чтобы она была в 8-битной форме, а не 64).Это сделало VCard действительным и читабельным на моем рабочем столе.Чтобы он читался на моем андроиде, мне пришлось изменить переменную $ fileatt_type на «text / x-vcard», в противном случае Gmail считает, что это документ.