summaryrefslogtreecommitdiff
path: root/noncore/unsupported/mail2/libmail/smtphandler.cpp
Unidiff
Diffstat (limited to 'noncore/unsupported/mail2/libmail/smtphandler.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/unsupported/mail2/libmail/smtphandler.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/noncore/unsupported/mail2/libmail/smtphandler.cpp b/noncore/unsupported/mail2/libmail/smtphandler.cpp
new file mode 100644
index 0000000..1bbad8b
--- a/dev/null
+++ b/noncore/unsupported/mail2/libmail/smtphandler.cpp
@@ -0,0 +1,172 @@
1#warning "TODO: XXX This class needs to be rewritten. XXX"
2
3#include <qsocket.h>
4#include <qtimer.h>
5#include <qfile.h>
6#include <qdatetime.h>
7#include <qdir.h>
8#include <qregexp.h>
9
10#include <qpe/mimetype.h>
11#include <qpe/config.h>
12
13#include <stdlib.h>
14
15#include "smtphandler.h"
16#include "miscfunctions.h"
17
18SmtpHandler::SmtpHandler(const QString &header, const QString &message, Account &account, const QString &to)
19 : QObject(), _header(header), _message(message), _account(account), _to(to)
20{
21 _header.replace(QRegExp("\\n"), "\r\n");
22 _message.replace(QRegExp("\\n"), "\r\n");
23 _message.replace(QRegExp("\\r\\n\\.\\r\\n"), "\r\n..\r\n");
24
25 //_state = account.esmtpAuth() ? Ehlo : Helo;
26 _state = Helo;
27
28 _socket = new QSocket(this);
29 connect(_socket, SIGNAL(hostFound()), this, SLOT(hostFound()));
30 connect(_socket, SIGNAL(connected()), this, SLOT(connected()));
31 connect(_socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
32 connect(_socket, SIGNAL(error(int)), this, SLOT(errorHandling(int)));
33
34 _socket->connectToHost(account.smtpServer(), account.smtpPort().toUInt());
35 emit status(tr("Looking up host..."));
36}
37
38void SmtpHandler::errorHandling(int err)
39{
40 if (err == QSocket::ErrConnectionRefused) {
41 emit error(tr("The server refused the connection."));
42 } else if (err == QSocket::ErrHostNotFound) {
43 emit error(tr("Host lookup failed."));
44 } else if (err == QSocket::ErrSocketRead) {
45 emit error(tr("The read from the socket failed for an unknown reason."));
46 } else {
47 emit error(tr("The sending failed for an unknown reason."));
48 }
49 stop();
50}
51
52void SmtpHandler::hostFound()
53{
54 emit status(tr("Host found."));
55}
56
57void SmtpHandler::connected()
58{
59 emit status(tr("Connected to %1").arg(_socket->peerName()));
60}
61
62void SmtpHandler::readyRead()
63{
64 if (!_socket->canReadLine()) return;
65 if (_state == Close) stop();
66
67 QString response = _socket->readLine();
68 QString temp = response;
69 temp.truncate(3);
70 int responseCode = temp.toInt();
71
72#ifndef QT_NO_DEBUG
73 qDebug(tr("SMTP > %3").arg(response.stripWhiteSpace()));
74#endif
75
76 response.replace(0, 4, "");
77 response.stripWhiteSpace();
78
79 if (_state == Ehlo && responseCode == 220) {
80 QString hostname = getenv("HOSTNAME");
81 if (hostname.stripWhiteSpace().isEmpty())
82 hostname = "opiemail";
83
84 emit status(tr("SMTP> EHLO *"));
85 sendToSocket(QString("EHLO %1\r\n").arg(hostname));
86 _state = Auth;
87 } else if (_state == Auth && responseCode == 250) {
88 QStringList capabilities;
89 while (_socket->canReadLine()) {
90 QString line = _socket->readLine().stripWhiteSpace();
91 capabilities.append(line);
92 }
93
94 // FIXME: Dirty, quick hack!
95 if (!capabilities.grep(QRegExp("^250-AUTH=LOGIN.*CRAM-MD5.*$")).isEmpty()) {
96 // emit errorOccourred(ErrAuthNotSupported);
97 _state = Mail;
98 } else {
99 emit status(tr("SMTP> AUTH CRAM-MD5"));
100 sendToSocket("AUTH CRAM-MD5\r\n");
101 _state = ReadAuth;
102 }
103 } else if (_state == ReadAuth && responseCode == 334) {
104 QString msgId = MiscFunctions::decodeBase64(response);
105
106 QString authString;
107 authString = _account.user() + " " +
108 MiscFunctions::smtpAuthCramMd5(msgId, _account.pass());
109 authString = MiscFunctions::encodeBase64(authString);
110
111 emit status(tr("SMTP> Authenticating"));
112 sendToSocket(authString + "\r\n");
113
114 _state = Mail;
115 } else if (_state == Helo && responseCode == 220) {
116 QString hostname = getenv("HOSTNAME");
117 if (hostname.stripWhiteSpace().isEmpty())
118 hostname = "opiemail";
119
120 emit status(tr("SMTP> HELO *"));
121 sendToSocket(QString("HELO %1\r\n").arg(hostname));
122 _state = Mail;
123 } else if (_state == Mail && responseCode == 250) {
124 emit status(tr("SMTP> MAIL FROM: *"));
125 sendToSocket("MAIL FROM: " + _account.email() + "\r\n");
126 _state = Rcpt;
127 } else if (_state == Rcpt && responseCode == 250) {
128 emit status(tr("SMTP> RCPT TO: *"));
129 sendToSocket("RCPT TO: " + _to + "\r\n");
130 _state = Data;
131 } else if (_state == Data && responseCode == 250) {
132 emit status(tr("SMTP> DATA"));
133 sendToSocket("DATA\r\n");
134 _state = Body;
135 } else if (_state == Body && responseCode == 354) {
136 emit status(tr("SMTP> Sending data..."));
137 sendToSocket(_header + "\r\n" + _message + "\r\n.\r\n", false);
138 _state = Quit;
139 } else if (_state == Quit) {
140 emit status(tr("SMTP> QUIT (Done)"));
141 sendToSocket("QUIT\r\n");
142 _state = Close;
143 } else if (_state == Close) {
144
145 } else {
146 emit error(tr("The server returned an error. This is the message:<br>%1").arg(response));
147 stop();
148 }
149}
150
151void SmtpHandler::sendToSocket(const QString &text, bool log)
152{
153 _socket->writeBlock(text.latin1(), text.length());
154
155 if (log) {
156#ifndef QT_NO_DEBUG
157 qDebug(tr("SMTP < %3").arg(text.stripWhiteSpace()));
158#endif
159 }
160}
161
162void SmtpHandler::stop()
163{
164 emit finished();
165 QTimer::singleShot(0, this, SLOT(deleteMe()));
166}
167
168void SmtpHandler::deleteMe()
169{
170 delete this;
171}
172