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 はそれをドキュメントと見なします。