Mit GMime E-Mails parsen


Coding , , ,


Habt ihr schon mal versucht mit C E-Mails zu parsen? Das kann ziemlich ekelhaft werden.
Abhilfe schafft die GMime Library.


GMime baut auf GLib auf und bietet eine Vielzahl an Funktionen um E-Mails
zu parsen bzw. einzelne Teile zu extrahieren. Will man z.B. den Body einer E-Mails auslesen, und feststellen, ob es sich hierbei um HTML Code handelt, dann könnte man es wie folgt machen:

#include <stdio.h>
#include <fcntl.h>
#include <glib.h>
#include <gmime/gmime.h>
 
int main (int argc, char const *argv[]) {
	gboolean is_html;
	GMimeMessage *message;
	GMimeParser *parser;
	GMimeStream *stream;
	char *body;
	int fd, i = 1;
 
	if (argc < 2)
		return 0;
 
	g_mime_init (0);
	if ((fd = open (argv[i], O_RDONLY)) == -1)
		return 0;
 
	stream = g_mime_stream_fs_new (fd);
	parser = g_mime_parser_new_with_stream (stream);
	g_object_unref (stream);
 
	message = g_mime_parser_construct_message (parser);
 
	body = g_mime_message_get_body (message, FALSE, &is_html);
	fprintf (stdout, "Testing get_body (looking for html...%s)\n\n%s\n\n",
		body && is_html ? "found" : "not found",
		body ? body : "No message body found");
 
	g_free (body);
 
	return 0;
}

Kompiliert wird das Programm mit

gcc -g -Wall `pkg-config --cflags gmime-2.0 glib-2.0` `pkg-config --libs gmime-2.0  glib-2.0` test.c -o test

Als erstes Argument muss der Pfad zur E-Mail angegeben werden.

Bei der Verwendung von GMime bin ich aber leider auch über einen Bug gestolpert. Will man die Absender
Adresse einer E-Mail auslesen, und diese ist z.B. angegeben mit J. Doe ,
dann vermurkst GMime die Adresse und liefert J.Doe. Das ist nur der Fall, wenn
die Adresse nicht in Anführungszeichen ist und einen Punkt enthält. Das Problem macht die
Funktion internet_address_parse_string(). Noch habe ich nicht die aktuelle Version
von GMime ausprobiert, ob es da auch noch auftritt.

Aber grundsätzlich kann man sagen, dass GMime eine hervorragende Library ist, um in C E-Mails
zu parsen. GMime wird z.B. auch von DBMail verwendet.



Kommentar hinzufügen