Tuesday, April 20, 2010

Migrating your squirrel mail contacts to roundcube

A simple script that will convert squirrel web mail contacts of each user to vcard format that can then be imported to roundcube webmail.

#!/bin/bash
for x in `ls *.abook`
do

cat $x | while read line
do
echo "BEGIN:VCARD" >> $x.vcf
echo "VERSION:3.0" >> $x.vcf
echo -n "N:" >> $x.vcf
echo -n `echo $line | cut -d'|' -f3` >> $x.vcf
echo -n ";" >> $x.vcf
echo `echo $line | cut -d'|' -f2` >> $x.vcf
echo -n "FN:" >> $x.vcf
echo `echo $line | cut -d'|' -f1` >> $x.vcf
echo -n "EMAIL;TYPE=PREF,INTERNET:" >> $x.vcf
echo `echo $line | cut -d'|' -f4` >> $x.vcf
echo "END:VCARD" >> $x.vcf
echo >> $x.vcf

done

echo "done $x"
done
To use this script: login on the server where squirrel mail is installed and browse to squirrel mail's data directory where squirrel mail keeps its .abook and .pref and .sig files.

Next create a file by the name of "makevcard" and paste this script in that file.

Next make the file executeable by running the following command

#> chmod +x ./makevcard


Now execute the script by

#> ./makevcard

Squirrel mail saves the address book for every user in a separate file, for example name@domain.com.abook. After this script is executed, For every .abook file, you'll get .abook.vcf file that will be in vcard format.

copy all the .vcf files to any location you like and you can now use your roundcube built in "Import Contacts" Feature to import contacts of individual user;

9 comments:

  1. Hi!

    Shouldn't you use the line 2 like this?

    for x in `ls *.abook`

    There's no need to run the operation on .sig, .pref and .cal files.

    BTW, thanks for the script. It really helps a lot!

    ReplyDelete
  2. Hi oandarilho01,

    you are right, thanks for the correction.

    ReplyDelete
  3. Thanks for this great post! Really helped me out :-)

    ReplyDelete
  4. I know this is a bit old, but `ls *.abook` could be more simply just *.abook

    ReplyDelete
  5. here is my php script:

    ----
    #!/usr/bin/php -q
    <?php

    // squirrelmail data dir
    $DATA = "/var/local/squirrelmail/data/";

    // Roudncube DataBase
    $mysql_link=mysql_pconnect("localhost","root","*****");

    mysql_select_db("roundcube");
    $sql = "select user_id,username from users order by user_id";
    $Resp= mysql_query($sql);

    while( $row = mysql_fetch_array($Resp) ){

    $file = $DATA.$row["username"].".abook";

    if(file_exists( $file )){
    $handle = fopen( $file , 'r');
    while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    if(trim($buffer)){
    list($nick,$nombre,$apellido,$email,$empresa) = explode("|",$buffer);
    if( trim($email) ){
    $sql2 = "select email from contacts where user_id='".$row["user_id"]."' and email='$email' ";
    $Resp2= mysql_query($sql2);
    if(mysql_num_rows($Resp2)==0){
    print "Adding $email to ".$row["username"]." ...";
    $sql3 = "insert into contacts set name = '$nick', firstname = '$nombre',
    surname = '$apellido', email = '$email',
    user_id = '".$row["user_id"]."' ";
    $Resp3 = mysql_query($sql3);
    if($Resp3) print " Ok\n";
    else print " Fail\n";
    }
    }
    }
    }
    }
    }


    ReplyDelete
  6. Thanks for that k4b3za.
    A suggestion for those who use this script in future:

    Remove these lines:
    $sql3 = "insert into contacts set name = '$nick', firstname = '$nombre',
    surname = '$apellido', email = '$email',
    user_id = '".$row["user_id"]."' ";

    Replace with:
    $changed = date('Y-m-d H:i:s');
    $sql3 = "insert into contacts set changed = '$changed', name = '".mysql_real_escape_string($nick)."', firstname = '".mysql_real_escape_string($nombre)."',surname = '".mysql_real_escape_string($apellido)."', email = '".mysql_real_escape_string($email)."',user_id = '".$row["user_id"]."'; ";

    Also make sure you remove the line wrap from the $sql3 line above else it may not import correctly.

    What I did: Added the datestamp to correctly format that field in your Roundcube database, and used mysql_real_escape_string to fix any names with an apostrophe (eg., O'Hara), which would have broken the script. I also added a semicolon just for good form.

    Once a user edits their contact in Roundcube (eg., adding a phone number), the VCARD will be automatically populated. k4b3za's script will not create duplicates since it first checks if the user is already in their address book.

    ReplyDelete
  7. đồng tâm
    game mu
    cho thuê nhà trọ
    cho thuê phòng trọ
    nhac san cuc manh
    số điện thoại tư vấn pháp luật miễn phí
    văn phòng luật
    tổng đài tư vấn pháp luật
    dịch vụ thành lập công ty trọn gói
    nước cờ trên bàn thương lượng
    mbp
    erg
    nghịch lý
    chi square test
    nghệ thuật nói chuyện
    coase
    thuyết kỳ vọng
    chiến thắng con quỷ trong bạn
    cân bằng nash

    Triệu Quốc Đống cười nói.

    Phó Thiên đành phải nói:
    - Vậy cậu định bố trí ở đâu, sếp cũ của cậu cũng không quá kém mà?

    - Khách sạn Văn Hoa đi, hai hôm trước tôi cùng bạn ăn ở đó, tôi thấy cũng được.
    Triệu Quốc Đống nói.

    Phó Thiên ngẩn ra, khách sạn Văn Hoa không kém, được xưng không phải năm sao nhưng quá năm sao. Triệu Quốc Đống này không đơn giản, ở đó tiêu một lần không dưới vài ngàn. Nếu như giải trí thêm thì lại còn hơn nữa.

    - Được, 6h30 tuổi chúng ta tới đó, sợ rằng phải sớm đặt chỗ mới được.
    Phó Thiên nói:
    - Cậu đi thế nào, có cần chúng tôi đón không? Đừng có mà đi chiếc Mitsubish của Phòng cao tốc đó.

    - Ừ, không cần, tôi biết.
    Triệu Quốc Đống gật đầu nói.
    - Quốc Đống, Chủ tịch Tô rất hài lòng về bài viết mà chú và Lôi Hướng Đông viết. Chủ tịch rất vui vì sở ta có nhân tài. Lần này mời các tập đoàn quốc tế tới An Nguyên khảo sát mặc dù hơi đột ngột nhưng chủ tịch Tần cũng lên tiếng giúp chúng ta. Lãnh đạo sẽ không nói thêm gì nhưng về sau không được phạm sai lầm như vậy.

    - Ha ha, Thái ca, nếu đi theo con đường bình thường thì kéo đến bao giờ chứ? Em dám cược chúng ta dù đưa ra ý kiến thì một hai tháng cũng không có ý kiến. Nếu chờ đến khi báo lên Ủy ban kế hoạch phát triển quốc gia phê chuẩn, sau đó mới mời các tập đoàn đến khảo sát, em thấy sang năm đã là nhanh. Không bằng làm nhanh một chút, hơn nữa đây cũng không phải tiền trảm hậu tấu mà.

    ReplyDelete