Форматирование VCard в PHP - PullRequest
1 голос
/ 31 мая 2011

Я пытаюсь сгенерировать 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 считает, что это документ.

Ответы [ 3 ]

2 голосов
/ 08 октября 2011

Мне недавно пришлось заставить работать vcards в android и iphone.Я использовал следующую функцию, которая является модифицированной версией перечисленной выше.Это отправит vcards, которые смогут открыть как gmail, так и почта на 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);
}
1 голос
/ 31 мая 2011

Вам не хватает \ n в конце каждой строки.Если вы посмотрите на обычную vCard (например, с notepad ++), в конце каждой строки есть 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";
0 голосов
/ 01 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...