Форматирование VCard в PHP

Я пытаюсь создать 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 на 8 бит, и я изменил содержимое вложения, чтобы просто передать строку функции электронной почты (так, чтобы она была в 8-битной форме, а не 64). Это сделало VCard действительным и читаемым на моем рабочем столе. Чтобы заставить его читать мой андроид, мне пришлось изменить переменную $ fileatt_type на «text / x-vcard», иначе Gmail считает, что это документ.

    В последнее время мне пришлось запускать vcards, работающие в андроиде и iphone. Я использовал следующую функцию, которая является модифицированной версией, указанной выше. Это отправит vcards, что gmail и mail на iphone смогут открыть. Они также работают в Thunderbird.

     function mail_attachment($filename, $content, $mailto, $from_mail, $from_name, $replyto, $subject, $message) { $fileatt_type = "text/x-vcard"; $headers = "FROM: ".$from_mail; $data = $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: 8bit\n" . "Content-Disposition: attachment;\n" . " filename=\"{$filename}\"\n\n" . $data . "\n\n" . "--{$mime_boundary}--\n"; //echo "sending message"; mail($mailto, $subject, $message, $headers); } 

    Вам не хватает \ n в конце каждой строки. Если вы посмотрите на обычную vCard (например, с блокнотом ++), у нее есть CR и LF в конце каждой строки, у той, которую вы создаете, есть CR ('\ r'). это работает для меня:

     $content = "BEGIN:VCARD\r\n"; $content .= "VERSION:3.0\r\n"; $content .= "CLASS:PUBLIC\r\n"; $content .= "FN:Joe Wegner\r\n"; $content .= "N:Wegner;Joe ;;;\r\n"; $content .= "TITLE:Technology And Systems Administrator\r\n"; $content .= "ORG:Wegner Design\r\n"; $content .= "ADR;TYPE=work:;;21 W. 20th St.;Broadview ;IL;60559;\r\n"; $content .= "EMAIL;TYPE=internet,pref:joe@wegnerdesign.com\r\n"; $content .= "TEL;TYPE=work,voice:7089181512\r\n"; $content .= "TEL;TYPE=HOME,voice:8352355189\r\n"; $content .= "URL:http://www.wegnerdesign.com\r\n"; $content .= "END:VCARD\r\n"; 

    Я написал валидатор vCard на основе RFC, который мог бы помочь. Это не полно, но очищенные файлы по крайней мере хорошо совместимы с инструментами и услугами, которые я пробовал (Gmail, gnokii и некоторые другие, которые я не помню). НТН.