Archive for March, 2009

Open Enrollment Qt training in Poland

ARISE, a company I’m cooperating with, is organizing a certified Qt training in Poland. The course will be held on 4-8th May in Warsaw, Poland. It is basically dedicated for Polish speaking people but it may be conducted in English or a separate English course may be organized.

Participants will learn Qt basics and advanced topics of their choice. An incomplete list of subjects includes graphics and animation, WebKit, networking and multithreading. The training is based on the latest release of Qt – 4.5 and takes a form of lectures and workshops. After the training, participants will receive Qt Software certificates and training materials. The number of places available is limited so register early.

I will be the person giving the training, so I hope to meet you in Warsaw in May.

Details (in Polish) are available on the Arise Open Enrollment training web page. For more information and registration please send an email to arise@arise.pl or fill the registration form available under the mentioned link.

A less detailed English description of the training is also available.

QwwSmtpClient

It’s often good to improve your mood by “doing something nice for yourself” which in my case often means “implement something interesting even if it’s currently completely useless for you but provides a challenge for your brain”.

As some time ago I felt really bad, I did follow that advice and implemented a class for Qt to handle SMTP connections. Only yesterday I noticed J-P Nurmi has implemented a library to handle the IRC protocol which means the family of protocols supported by plain Qt is now at least HTTP, FTP (both internally via QHttp and QFtp), IRC (via LibIrcClient-Qt) and SMTP (QwwSmtpClient). I have plans to also implement POP3 as it’s very simple but I’m waiting for the next wave of bad mood to do it.

So… what does QwwSmtpClient do? It mimics QHttp, so it’s command-based which means you have to issue a few commands and monitor their result to be able to do something useful. I know that sucks a bit, but I wanted to have a similar architecture to QHttp and the next step is to implement a wrapper around the class to provide an interface similar to QNetworkAccessManager which should be quite easy and should not require bad mood to do it.

QwwSmtpClient currently supports:

  • plain connections to SMTP (port 25 by default),
  • SSL connections to SMTP (port 465 by default),
  • TLS connections (STARTTLS command after a plaintext connection),
  • Authentication via PLAIN or LOGIN methods,
  • sending mail using low-level commands (MAIL, RCPT, DATA),
  • HELO or EHLO conversations.

The library is not yet foul-proof nor very idiot-proof but it works allowing one to send mails directly from within Qt applications. I’ll release the code to the public soon.

Here is a small example:

#include <QApplication>
#include <QStringList>
#include "qwwsmtpclient.h"
 
int main(int argc, char **argv){
    QApplication app(argc, argv);
    QwwSmtpClient client;
    // ignore certificate errors as suggested by ssl socket docs:
    app.connect(&client, SIGNAL(sslErrors(const QList &)), 
                &client, SLOT(ignoreSslErrors())); 
    // start plain-text connection:
    client.connectToHost("mail.example.com");
    // start encryption handshake:
    client.startTls();
    // when that's done authenticate yourself to the server:
    client.authenticate("user", "pass", QwwSmtpClient::AuthLogin);
    // send an email:
    client.sendMail("sender@example.com", "receiver@example.com", 
                           "From:    sender@example.com\r\n"
                           "To:      receiver@example.com\r\n"
                           "Subject: testing QwwSmtpClient\r\n"
                           "\r\n" // blank line to denote end of headers
                           "Does it work?");
    // disconnect afterwards:
    client.disconnectFromHost();
    // quit when you're done:
    app.connect(&client, SIGNAL(disconnected()), &app, SLOT(quit()));
    return app.exec();
}

“There and back again”

Well… here I am again :) And again trying hard to resurrect this blog. I hope this time it’ll be with success. I started by pimping the looks of the site, maybe it helps me motivate myself to write here whenever I have something to say. And believe me, I do as lot has happened since my last post here.

Furthermore, I’m going to integrate all my bits of personal web activity with the blog – my bibliography, library of code snippets, etc.

Stay tuned!