Formateo de VCard en PHP

Intento generar una VCard a través de PHP y la envían por correo electrónico al usuario. Escribí una secuencia de comandos inicial con datos codificados, pero el resultado final completará la VCard de MySQL.

Al ver la VCard lado a lado con una VCard legítima (descargada y probada desde otro sitio) parecen bastante idénticas, pero cuando bash importar mi VCard generada aparece sin datos. En realidad, si lo abro en mi teléfono, ni siquiera reconoce que es una vcard, y en su lugar solo me envía a un Google Doc roto.

He tomado prestado un código de wikipedia para formatear la vcard, y todo parece estar bien. ¿Ves algún error en mi formateo? Probé diferentes saltos de línea, pero fue en vano. Ideas?

Aquí está el código para mi generación / correo:

 

Actualización 1: Esto me hace más confuso, pero quizás te ayude a depurar. He descargado mi VCard generada (mala) en mi computadora, así como una buena VCard descargada de un sitio web diferente. Como esperaba, mi generado se abre sin datos, pero el bueno funciona bien. Luego creé un tercer archivo vacío con una extensión .vcf y copié el texto de mi archivo (incorrecto) en ese archivo vacío. Abrí ese archivo y todos los datos se mostraron perfectamente. Para probar aún más, copié el texto del buen archivo VCard en mi archivo incorrecto, y todavía se abrió sin datos. Entonces, parece que es algo sobre encoding o alguna otra cosa de archivo que no entiendo. No son permisos, eso es todo idéntico.

Actualización 2: Cambié mi PHP para que me obligara a descargar la VCard y a enviarla por correo electrónico. El archivo descargado se abre perfectamente, por lo que el error puede estar sucediendo en la forma en que estoy codificando (¿la palabra correcta?) El archivo, o cómo lo está interpretando GMail.

Actualización 3: solucionado: lo resolvió. No estoy seguro de por qué es esto, porque cada otro tutorial que puedo encontrar dice lo contrario, pero hubo algunos cambios clave. Primero, cambié la encoding en el correo electrónico de base64 a 8 bits, y cambié el contenido del archivo adjunto para que solo fuera la cadena que se pasa a la función de correo electrónico (para que esté en formato de 8 bits, no en 64). Eso hizo que la VCard sea válida y legible en mi escritorio. Para que se lea en mi android tuve que cambiar la variable $ fileatt_type a “text / x-vcard”, de lo contrario, Gmail cree que es un documento.

    Tuve que conseguir vcards trabajando en Android y iPhone recientemente. Usé la siguiente función, que es una versión modificada de la lista arriba. Esto enviará vcards que tanto gmail como correo en el iphone podrán abrir. Ellos también trabajan en 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); } 

    Te falta \ n al final de cada línea. Si miras una vCard normal (con notepad ++ por ejemplo), tiene un CR y un LF al final de cada línea, la que creas solo tiene CR (‘\ r’). esto funciona para mí:

     $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"; 

    Escribí un validador de vCard basado en el RFC que podría ayudar. No está completo, pero los archivos limpios son al menos muy compatibles con las herramientas y servicios que he probado (Gmail, gnokii y algunos otros que no recuerdo). HTH.