EML to VCF Converter

Dieses PHP Skript konvertiert Visitenkarten, die als .eml Dateien vorliegen in das VCARD-Format (.vcf). Diese können dann auf einfache Weise in alle gängigen Emailprogramme importiert werden.

Der Quellcode kann über die englische Version dieses Posts heruntergeladen werden: EML to VCF Converter

This PHP script converts contacts saved as .eml files to VCARDs (.vcf) that can easily be imported to any email client.

<?php

/**
 * EML2VCFConverter.php
 *
 * Converts contacts saved as .eml files to VCARDs (.vcf) that can easily be
 * imported to any email client.
 * Copyright (C) 2010 Matthias Kerstner, info@kerstner.at
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301, USA.
 *
 * DESCRIPTION:
 * Converts contacts saved as .eml files to VCARDs (.vcf) that can easily be
 * imported to any email client. Expects .eml files to be UTF-8 encoded.
 * The generated VCARD-files will be saved using UTF8-encoding by default. As
 * programs such as Windows Contacts for some strange reasons don't handle UTF-8
 * encoded VCARDs correctly you can optionally change the default encoding of
 * the generated VCARDs (UTF-8) to ISO-8859-1.
 *
 * USAGE:
 * Be sure to set SRCFOLDER. If DSTFOLDER is not specified generated .vcf files
 * will be placed inside a folder named "converted" in your SRCFOLDER. Note that
 * existing .vcf files will be overwritten! Optionally you can set DEBUG to
 * either true or false. Be sure to set PHP's execution timeout to a value high
 * enough in order to give the script time to finish.
 *
 * CHANGELOG:
 * 1.1: minor code optimizations
 * 1.0: initial release
 *
 * @filesource EML2VCFConverter.php
 * @author Matthias Kerstner, info@kerstner.at
 * @version 1.1
 */


/**
 * EDIT HERE
 */
define("SRCFOLDER", "");
define("DSTFOLDER", "");
define("UTF8DSTENCODING", true); //possible values: true, false (=ISO-8859-1)
define("DEBUG", true); //possible values: true, false


/**
 * DO NOT EDIT BELOW THIS LINE!!
 */


/**
 * Courtesy of Justin Cook
 * http://www.justin-cook.com/wp/2006/03/31/php-parse-a-string-between-two-strings/
 */
function get_string_between($string, $start, $end) {
    $string = " ".$string;
    $ini = strpos($string,$start);
    if($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

function debug($msg) {
    if(DEBUG)
        echo "debug: ".$msg."<br>";
}

debug("using source folder '".SRCFOLDER."'");

$dh = @opendir(SRCFOLDER);

if(!$dh)
    die("ERROR: failed to open source folder");

debug("reading source folder...");

if(strlen(DSTFOLDER) < 1) {
    debug("no destination folder specified, using default...");
    $dstFolder = SRCFOLDER."/converted";
} else
    $dstFolder = DSTFOLDER;

if(!file_exists($dstFolder)) {
    if(!mkdir($dstFolder, 0777, true))
        die("ERROR: could not create destination folder '$dstFolder'");
    else
        debug("created destination folder '$dstFolder'...");
} else
    debug("using existing destination folder '$dstFolder'...");

$dstFoldername = substr($dstFolder, strripos($dstFolder, "/")+1);

$i = 0;
while(($srcFile = readdir($dh)) !== false) {
    $srcFilename = basename($srcFile, ".eml");

    if($srcFilename == $dstFoldername || $srcFilename == "." || $srcFilename == "..")
        continue;
    else {
        $srcFile = SRCFOLDER."/".$srcFile;

        $handle = fopen($srcFile, "r");
        $vcfContent = fread($handle, filesize($srcFile));
        fclose($handle);

        $vcfContent = iconv("UTF-8", "ISO-8859-1", $vcfContent);
        $vcfContent = get_string_between($vcfContent, "BEGIN:VCARD", "END:VCARD");
        $vcfContent = "BEGIN:VCARD".$vcfContent."END:VCARD";
        if(UTF8DSTENCODING)
            $vcfContent = iconv("ISO-8859-1", "UTF-8", $vcfContent);

        $dstFile = $dstFolder."/".$srcFilename.".vcf";

        if(($fp = fopen($dstFile, "w+")) === false)
            die("ERROR: could not create file '$dstFile'");
        fputs($fp, $vcfContent);
        fclose($fp);

        $i++;
    }
}

closedir($dh);

debug("Files written: $i");
echo "done!";

?>

You may also like...

2 Responses

  1. Hi,
    Is it also possible to use this script for subdirectorys as well?

    • matthias.kerstner says:

      Hi Ronald,
      at this point I’m afraid not. But it’s pretty simple to add this functionality. Pleas have a look at this post. Cheers

Leave a Reply

Your email address will not be published. Required fields are marked *