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

?>

Comments

2 responses to “EML to VCF Converter”

  1. Ronald Verheij Avatar

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

    1. matthias.kerstner Avatar
      matthias.kerstner

      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 *

This site uses Akismet to reduce spam. Learn how your comment data is processed.