diff options
Diffstat (limited to 'examples/network/mail/smtp.cpp')
-rw-r--r-- | examples/network/mail/smtp.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/examples/network/mail/smtp.cpp b/examples/network/mail/smtp.cpp new file mode 100644 index 000000000..a0256867b --- /dev/null +++ b/examples/network/mail/smtp.cpp @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ + +#include "smtp.h" + +#include <qtextstream.h> +#include <qsocket.h> +#include <qdns.h> +#include <qtimer.h> +#include <qapplication.h> +#include <qmessagebox.h> +#include <qregexp.h> + + +Smtp::Smtp( const TQString &from, const TQString &to, + const TQString &subject, + const TQString &body ) +{ + socket = new TQSocket( this ); + connect ( socket, SIGNAL( readyRead() ), + this, SLOT( readyRead() ) ); + connect ( socket, SIGNAL( connected() ), + this, SLOT( connected() ) ); + + mxLookup = new TQDns( to.mid( to.find( '@' )+1 ), TQDns::Mx ); + connect( mxLookup, SIGNAL(resultsReady()), + this, SLOT(dnsLookupHelper()) ); + + message = TQString::fromLatin1( "From: " ) + from + + TQString::fromLatin1( "\nTo: " ) + to + + TQString::fromLatin1( "\nSubject: " ) + subject + + TQString::fromLatin1( "\n\n" ) + body + "\n"; + message.replace( TQString::fromLatin1( "\n" ), + TQString::fromLatin1( "\r\n" ) ); + message.replace( TQString::fromLatin1( "\r\n.\r\n" ), + TQString::fromLatin1( "\r\n..\r\n" ) ); + + this->from = from; + rcpt = to; + + state = Init; +} + + +Smtp::~Smtp() +{ + delete t; + delete socket; +} + + +void Smtp::dnsLookupHelper() +{ + TQValueList<TQDns::MailServer> s = mxLookup->mailServers(); + if ( s.isEmpty() ) { + if ( !mxLookup->isWorking() ) + emit status( tr( "Error in MX record lookup" ) ); + return; + } + + emit status( tr( "Connecting to %1" ).arg( s.first().name ) ); + + socket->connectToHost( s.first().name, 25 ); + t = new TQTextStream( socket ); +} + + +void Smtp::connected() +{ + emit status( tr( "Connected to %1" ).arg( socket->peerName() ) ); +} + +void Smtp::readyRead() +{ + // SMTP is line-oriented + if ( !socket->canReadLine() ) + return; + + TQString responseLine; + do { + responseLine = socket->readLine(); + response += responseLine; + } while( socket->canReadLine() && responseLine[3] != ' ' ); + responseLine.truncate( 3 ); + + if ( state == Init && responseLine[0] == '2' ) { + // banner was okay, let's go on + *t << "HELO there\r\n"; + state = Mail; + } else if ( state == Mail && responseLine[0] == '2' ) { + // HELO response was okay (well, it has to be) + *t << "MAIL FROM: <" << from << ">\r\n"; + state = Rcpt; + } else if ( state == Rcpt && responseLine[0] == '2' ) { + *t << "RCPT TO: <" << rcpt << ">\r\n"; + state = Data; + } else if ( state == Data && responseLine[0] == '2' ) { + *t << "DATA\r\n"; + state = Body; + } else if ( state == Body && responseLine[0] == '3' ) { + *t << message << ".\r\n"; + state = Quit; + } else if ( state == Quit && responseLine[0] == '2' ) { + *t << "TQUIT\r\n"; + // here, we just close. + state = Close; + emit status( tr( "Message sent" ) ); + } else if ( state == Close ) { + deleteLater(); + return; + } else { + // something broke. + TQMessageBox::warning( qApp->activeWindow(), + tr( "TQt Mail Example" ), + tr( "Unexpected reply from SMTP server:\n\n" ) + + response ); + state = Close; + } + + response = ""; +} |