1

PHP 経由で VCard を生成しようとしていますが、ユーザーにメールで送信されます。ハードコーディングされたデータを使用して最初のスクリプトを作成しましたが、最終結果は MySQL からの VCard に入力されます。

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 をコンピューターにダウンロードしました。また、別の Web サイトから正常な VCard をダウンロードしました。予想どおり、生成されたものはデータなしで開きますが、良いものは正常に動作します。次に、拡張子が .vcf の 3 つ目の空のファイルを作成し、(不良) ファイルからテキストをその空のファイルにコピーしました。そのファイルを開くと、すべてのデータが完全に表示されました。さらにテストするために、正常な VCard ファイルから不良ファイルにテキストをコピーしましたが、それでもデータなしで開かれました。だから、私が理解していないエンコーディングまたはその他のファイルに関するものであるようです。それはパーミッションではありません - それはすべて同じです。

更新 2: PHP を変更して、VCard をダウンロードするだけでなく、電子メールで送信するように強制するようにしました。ダウンロードしたファイルは問題なく開くので、ファイルのエンコード方法 (正しい言葉ですか?)、または GMail の解釈方法でエラーが発生しています。

更新 3: 修正済み : 解決しました。これがなぜなのかはわかりません - 私が見つけることができる他のすべてのチュートリアルは反対のことを言っているからです - しかし、いくつかの重要な変更がありました. まず、メールのエンコーディングを base64 から 8 ビットに変更し、添付ファイルのコンテンツをメール関数に渡される文字列だけに変更しました (64 形式ではなく 8 ビット形式になるように)。これにより、デスクトップで VCard が有効になり、読み取り可能になりました。Android で読み取れるようにするには、$fileatt_type 変数を「text/x-vcard」に変更する必要がありました。そうしないと、Gmail はそれをドキュメントと見なします。

4

3 に答える 3

2

最近、AndroidとiPhoneでvcardを動作させる必要がありました。上記の関数を修正した次の関数を使用しました。これにより、iPhoneのGmailとメールの両方で開くことができるvcardが送信されます。彼らは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);
}
于 2011-10-08T02:27:10.593 に答える
1

各行の末尾に \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";
于 2011-05-31T16:37:49.583 に答える
0

役立つ可能性のある RFC に基づいてvCardバリデーターを作成しました。完全ではありませんが、クリーンアップされたファイルは、私が試したツールやサービス (Gmail、gnokii など、覚えていないもの) と少なくともうまく互換性があります。HTH。

于 2011-06-01T13:01:01.940 に答える