Copy messages from a Thunderbird mbox file to a MySQL table using php

Written by: Maciej Grajcarek

Date July 1, 2008

If for some reason you would like to copy your messages from Thunderbird to a MySQL database, here you can find a simple PHP script which will do it for you! All you have to do is to set some variables in the php class and create a proper database table. Let’s start with the class.

var $file_name = 'some_mbox_file';
var $file_path = '/path/to/file/';

var $db_user = 'user';
var $db_password = 'pass';
var $db_host = 'localhost';
var $db_name = 'mbox';

$file_name is the name of the thunderbird mbox file and $file_path points to the folder it is located (deafult path in Windows looks sth like this: C:\\Documents and Settings\\%user%\\Application Data\\Thunderbird\\Profiles).
You should also define the database connection variables.

Next thing is to create a database table:


CREATE TABLE  `messages` (
`id` int(10) unsigned NOT NULL auto_increment,
`from` varchar(255) collate latin1_general_ci NOT NULL,
`to` varchar(255) collate latin1_general_ci NOT NULL,
`subject` varchar(255) collate latin1_general_ci NOT NULL,
`date` varchar(255) collate latin1_general_ci NOT NULL,
`message` text collate latin1_general_ci NOT NULL,
`received_ip` varchar(15) collate latin1_general_ci NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

As you can see, this script will read: from, to, subject, date, received_ip and message fields for each of messages. It will not copy attachments!

It supports also processing of big files. We have used it to parse files bigger than 3GB.

server crash

Written by: daniel

Date July 1, 2008

Hemos perdido temporalmente los datos del blog pero finalmente se ha podido restaurar todo :) Por suerte hemos tenido un backup. Así que ya estamos de vuelta.

CakePHP 1.2 Filter Component

Written by: Maciej Grajcarek

Date June 11, 2008

Tworzenie formularzy i metod służących do filtrowania danych jest bardzo częstym zadaniem w codziennej pracy programisty. Zwykle, aby osiągnąć pożądany efekt, korzystałem z kombinacji metod modelu i kontrolera . Zwykle oznacza to również pisanie wielu linii kodu i strata czasu na mało interesujące zadanie. Zacząłem więc szukać rozwiązania, które zdejmie ze mnie choć troszkę pracy. Najbardziej interesujący okazał się dla mnie kod zaprezentowany przez Pana Nik’a Chankov’a na jego blogu, który to kod stał się fundamentem do moich dalszych prac.

Read the rest of this entry »

Script de inicio de darkice para el Ubuntu

Written by: daniel

Date May 31, 2008

Darkice es uno de los programas más populares, a la hora de montar una radio online sobre el GNU/Linux. Es bastante estable y funciona bien con el Icecast2.

Sin embargo, la versión que está en los repositorios tiene dos pegas:

1) no tiene soporte para emisión en el formato mp3. Y aunque el formato libre ogg está ganando cada vez más popularidad, todavía hay mucha gente que espera tener un stream mp3.

Para resolver este problema, hay que compilar el programa desde el código fuente. Es bastante fácil y puedes encontrar una guía aquí.

2) el programa no funciona por defecto en modo de demonio. Por supuesto podríamos arrancarlo con

sudo darkice -c /etc/config.cfg &

para ponerlo en el segundo plano, pero no tenemos una opción fácil para iniciarlo automáticamente por ejemplo cuando arranca el sistema. El programa tampoco crea un archivo de identificación de proceso (ing: pid file), que podría servirnos si tenemos un sistema de monitorización de servicios como por ejemplo el monit.

Así que, tomando el archivo de aranque que viene con la instalación de icecast2 como modelo, he creado uno para el darkice.

#! /bin/sh
#
# Darkice init file
#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/darkice
NAME=darkice
DESC=darkice

test -x $DAEMON || exit 0

# Defaults
CONFIGFILE=”/etc/darkice.cfg”
USERID=root
GROUPID=root
PIDFILE=”/var/run/darkice.pid”

set -e

case “$1″ in
start)
echo -n “Starting $DESC: ”
start-stop-daemon –start –quiet –chuid $USERID:$GROUPID \
-b -m -p $PIDFILE –exec $DAEMON — -c $CONFIGFILE
echo “$NAME.”
;;
stop)
echo -n “Stopping $DESC: ”
start-stop-daemon –stop –oknodo –quiet -p $PIDFILE
echo “$NAME.”
;;
reload|force-reload)
echo “Reloading $DESC configuration files.”
start-stop-daemon –stop –signal 1 –quiet -p $PIDFILE
;;
restart)
echo -n “Restarting $DESC: ”
start-stop-daemon –stop –oknodo –quiet -p $PIDFILE
sleep 1
start-stop-daemon –start –quiet –chuid $USERID:$GROUPID \
-b -m -p $PIDFILE –exec $DAEMON — -c $CONFIGFILE
echo “$NAME.”
;;
*)
echo “Usage: $0 {start|stop|restart|reload|force-reload}” >&2
exit 1
;;
esac

exit 0

Ahora ya podemos ejecutar el darkice con el tradicional:

sudo /etc/init.d/darkice start

De la misma manera podemos crear scripts para otros programas que normalmente no los tienen.

upload behaviour

Written by: adziki

Date May 30, 2008

Upload behaviour jest pomocny przy wysyłaniu plików formularzem html. Kod razem z przykładem użycia można ściągnąć z naszego repozytorium svn.

Podstawowe możliwości

Jest to prosty mechanizm pozwalający na automatyczne zapisywanie plików wysłanych formularzem. Zakładamy, że mamy model Myfile, który łączy się z tabelą myfiles. W tabeli interesuje nas jedno pole myfile typu string (255). W widoku tworzymy prosty formularz który umożliwi wysłanie do interesującego nas pola plik, zamiast tekstu:

$form->create(Myfile,array('type'=>'file'));
$form->input(Myfile.myfile, array('type'=>file));
$form->end('Submit');

Do utworzenia pola uploadu plików można również skorzystać z uploadHelper

W kontrolerze nie musimy dodawac nic poza standardowym kodem który umożliwi zapisanie rekordu. Behaviour wykryje, ze dane pole zawiera plik i automatycznie go przetworzy.

W modelu wystarczy dopisać nastepujaca linie, zeby cieszyć się jego podstawowymi funkcjami.

var $actsAs = array('Upload');

Upload behaviour zapisuje pliki w katalogu APP/webroot/files/[nazwa modelu]. Nazwa pliku jest znormalizowaną nazwą pliku wysyłanego (zawiera tylko litery alfabetu łacińskiego i podkreślenia).

Jeśli nie korzystamy z walidacji, behaviour “testuje” każde pole typu string w modelu - czy nie wysłano za jego pomocą plików. Jeśli tak w polu zostaje umieszczona nazwa pliku a plik zostaje zapisany w docelowym katalogu.

Usuwanie plików

Jeśli nie korzystamy z uploadHelper, należy dodać do formularza pole:

$this->form->input('myfile_delete', array('type'=>'checkbox'));

Zaznaczając checkbox można w łatwy sposób usuwać pliki.

Dla zapewnienia spójności plików z powiązanymi rekordami w bazie danych pliki są również usuwane automatycznie:

  • przy usuwaniu rekordu,
  • oraz przy edycji rekordu połączonej z wysłaniem nowego pliku w miejsce poprzedniego.

Walidacja

Jeśli chcemy skorzystać z walidacji do modelu trzeba dołączyć konfigurację walidacji:

function __construct(){
parent::__construct();
$this->validate = array(
'myfile' => array(
array('rule'=>array('validateUpload'), 'on'=>'create',  'message'=>'', 'last'=>true, 'allowEmpty'=>false),
array('rule'=>array('validateUpload'), 'on'=>'update', 'message'=>'Nie wysłano', 'required'=>false),
array('rule'=>array('validateMime','image'), 'message'=>__("Plik musi być obrazkiem (gif, jpeg albo png)",true)),
),
);
}

Dodatkowo, żeby walidacja przebiegała bez problemów konieczne jest dodanie poniższego kodu do modelu:

function save(&$data){
if(parent::save($data)){
return true;
}
$data = $this->data;
return false;
}

Jak dotąd dostępne są dwie funkcje walidacji:

  • validateUpload - za jej pomocą można sprawdzić poprawność uploadu pliku
  • validateMime - można określić dozwolone typy plików

validateMime

W validateMime są trzy sposoby zdefiniowania zakresu dozwolonych plików:

  1. Predefiniowane ustawienie - jak narazie tylko ‘image’
    (odpowiada wyrażeniu regularnemu: '/^image\/(pjpeg|jpeg|jpg|png|gif)$/');
    użyte w powyższym przykładzie
  2. Tablica typów mime - np array('text/plain','text/css');
    (Nie może to być tablica wyrażeń regularnych)
  3. Dowolne wyrażenie regularne (Perl-Compatible)

upload Helper

Jest to rozszerzenie dla standardowego formHelper, można je pobrać w naszym repozytorium svn. uploadHelper dostarcza jak dotąd tylko jedną funkcję, bardzo prosta w użyciu, utrzymana w stylu form helpera:

echo $upload->input('myfile', array('delete'=>false, 'preview'=>array('rel'=>'lightbox')));

Standardowo funkcja input generuje link do pliku (jeśli już jakiś został przesłany), pole typu file do wysłania pliku formularzem i pole checkbox do usuwania pliku. Funkcja upload::input() umożliwia dostęp do parametrów linku podglądu, oraz pola do usuwania plików poprzez elementy tablicy opcji o kluczach ‘preview’ oraz ‘delete’. W powyższym przykładzie checkbox do usuwania plików został wyłączony, a do odnośnika został dodany atrybut rel=”lightbox”.

cambios de hardware

Written by: daniel

Date May 30, 2008

Los últimos días han traído muchos cambios de hardware. Primero, después de una larga agonía, se ha muerto mi ordenador principal de trabajo. Daba tantos problemas que decidí cambiarlo por uno nuevo. Opté por algo simple pero aún así es un cohete comparado con el antiguo.

Para poder usar dos pantallas (algo indispensable, creo, a la hora de trabajar cómodamente) le añadí una tarjeta gráfica Ati Sapphire HD3650. La primera elección fue una NVidia PointOfVidew 7300GT pero por alguna estraña razón no he sido capaz hacer que funcionasen con ella los dos monitores a la vez. Así que al final la cambié. Y as ati siempre me han dado buenos resultados con Ubuntu.

Y para terminar, una sintonizadora de tv. No suelo ver mucha tele, pero a veces está bien poder ponerla en el ordenador si justamente echan algo interesante ;) Con una LifeView Trio (con tv analógica, tdt, radio y satélite) no tuve que hacer nada para que funcionase (aunque todavía estoy por probar la tv analógica y la satélite).

De paso probé también una sitonizadora usb para mi portátil, pero la LiveView LV5T no me permitió ver la tele en más de 320×240 (y sin hablar ya de la pantalla completa) y finalmente resití. No sé si es la tarjeta tv o la gráfica del portátil que no llega, pero con 3GB de memoria y dos procesadores esperaría un mínimo ;)

Con la compra de la tarjeta tv me llevé una buena sopresa cuando al abrir la caja me di cuenta que no contenía ni la tarjeta ni el mando de la distancia! Por suerte, en la tienda resultó que la habían puesto en el escaparate y a la chica que me la vendió no se le había ocurrido revisar la caja (ni a mi tampoco). Por suerte todo acabo tan sólo con un pequeño susto.

Otro cambio sorpresa fue una super pantalla Mitsubishi Diamond Pro 2045 de 22 pulgadas, regalo de mi amigo y compañero de trabajo Biel que cambiaba el mobiliario.

Así que después de unos días agitados y muchos cambios ahora otra vez podemos volver a hacer cosas :)

Servidor sms con ubuntu, smsd y nokia 6020

Written by: daniel

Date May 15, 2008

A veces lo nuevo no siempre es lo mejor. Al menos ésta es mi experiencia a la hora de conectar los teléfonos móviles con el linux. En mi casa tengo varios modelos, principalmente de nokia (n70, 6151) y he tenido varios problemas para hacerlos funcionar bien. Así que finalmente tuve que buscar un antiguo nokia 6020 para jugar un poco con los smses en mi sistema.

En el linux existe una manera relativamente simple para crear

Qué necesitamos:
- gnokii, el programa que nos permite conectarnos con el teléfono
- smsd, el servidor de recepción y envío de mensajes
- smsd-mysql, un módulo para guardar los mensajes en la base de datos

Además:
- un teléfono, yo uso un nokia 6020, comprado por tres duros en el ebay.es
- un cable de conexión usb DKU-5 (CA-42 también sirve, parece)

La configuración es bastante simple:
Una vez instalados los programas con el apt, conectamos el teléfono a un puerto usb.

En mi caso, cuando conectaba el cable al teléfono, en la pantalla del móvil aparecía el mensaje “Dispositivo no admitido”, pero comprobándolo con el dmesg en la consola, pude ver que se conectó correctamente y apareció como /dev/ttyUSB0

Ahora configuramos el gnokii, creando el archivo ~/.gnokiirc :
[global]
port = /dev/ttyUSB0
model = 6020
initlength = default
connection = dku5
use_locking = yes
smsc_timeout = 10

podemos comprobar si funciona bien, escribiendo en la consola:
gnokii –identify

esto debería mostrarnos información básica sobre el teléfono.

ahora debemos crear una base de datos para smsd.
Buscamos en el disco:
locate sms.tables.mysql.sql

en mi caso estaba en:
/usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql

y lo ejecutamos con el cliente mysql:
mysql -u root < sms.tables.mysql.sql

ahora podemos inicial el servidor sms:
smsd -u root -d smsgw -m mysql

y en unos segundos podemos ver como el programa descarga los mensajes de nuestro teléfono y los pone en la tabla inbox de la base de datos.

Servidor MMS (mensajes multimedia) en PHP

Written by: daniel

Date May 7, 2008

El otro día he encontrado este interesante proyecto de servidor de mensajes multimedia escrito en el php. Gracias a él podemos enviar archivos multimedia directamente desde nuestro móvil al servidor web y a coste de conexión a internet que suele ser bastante menor que el de envío de mms.

El sistema parece que funciona bastante bien, incluso hay una demo para probar el envío.

La única desventaja de esta solución es que nos obliga a cambiar la configuración de nuestro teléfono, lo cual la hace un poco inviable para clientes finales. Pero si buscas algo simple para blogguear desde tu móvil o tienes un grupo cerrado de usuarios (para poder reconfigurarles los dispositivos) es una solución intereasante.

Por si a alguién le interesa, pongo mi configuración del nokia n70 para intentar enviar mensajes a la apliación demo.

Vamos a la configuración de puntos de acceso y añadimos uno nuevo:
Nombre - Heyman MMS (puedes ponerle lo que quieras)
Portador de datos - paquees de datos
Nombre punto de acceso: internet
Nombre usuario: Ninguno
Petición contraseña: No
Autentificación: Normal
Página de inicio: http://heyman.info/mms/get.php

Luego vamos a ajustes avanzados y le ponemos:
Tipo de red: IPv4
Dirección de IP: Auto
Servidores nombres: Auto
Dir. Serv Proxy: Ninguno
Núm puerto proxy: 0

Una vez configurado el punto de acceso, vamos al ménu Mensajes y se lo configuramos como él por defecto para el envío de los mms.

Ahora ya podemos intentar enviar un mensaje multimedia. Le ponemos cualquier número (por ejemplo 0) y en cuestión de segundos debe aparecer en la web.

Y qué hacer si queremos recibir mensajes sin tener que reconfigurar el teléfono? No estoy seguro, pero parece que los modems que tienen los móviles permiten el acceso tan sólo a los mensajes de texto. Quizás la solución sería usar un modem gms conectado directamente al pc.

Problemas con el servicio bluetooth de puerto serie en el Ubuntu 8.04

Written by: daniel

Date May 4, 2008

Últimamente estoy jugando un poco con el python en mi nokia70. Está bastante bien, porque con relativamente poco esfuerzo se pueden hacer cosas interesantes, lo cual convierte a este lenguaje en una solución casi idónea para hacer protótipos rápidos.

Ayer estuve probando una cosa y me lleve una sorpresa bastante desagradable. Resulta que después de acutalizar al Ubuntu 8.04, dejó de funcionar la conexión de puerto serie via blutooth entre mi pc y el móvil.

A pesar de anunciar el servicio con sdptool:

sdptool add –channel=1 SP

y recibir una confirmación, el teléfono no es capaz de detectarlo y sigue dando el error “no serial ports found”.

Busqué un poco en el google y parece que hay más personas afectadas, aunque sin encontrar ninguna solución por ahora. ¿Quizás sea un bug en Ubuntu?

Lo he registrado en el launchpad. Puedes ver como evoluciona aquí.

ACTUALIZACIÓN 15.02.2008:
parece que hay más afectados. mira aquí

Error: The requested address ” was not found on this server

Written by: Maciej Grajcarek

Date May 3, 2008

Last night, during installation of the CakePHP application on clients production server, a weird problem appeared. All requests to controllers actions returned : “Error: The requested address ” was not found on this server”. At the same time, access to webroot was incessant.

If you have the same problem, try this three steps:

  • make sure you have an access to the database, and there are all necessary tables,
  • check if you tmp folder is writable,
  • delete all cache files from the temp subfolders.

That should fix the problem.