author | conber <conber> | 2002-06-15 09:46:14 (UTC) |
---|---|---|
committer | conber <conber> | 2002-06-15 09:46:14 (UTC) |
commit | 7f2eef29708380844922f34f59ba4e9beefbf7c3 (patch) (unidiff) | |
tree | f57125fbaabddecc35d6677f1b9e48a4594165d5 /noncore/unsupported/mail2/libmail/smtphandler.cpp | |
parent | 0acbdd392814589df303b6e50c79d9822e3db27a (diff) | |
download | opie-7f2eef29708380844922f34f59ba4e9beefbf7c3.zip opie-7f2eef29708380844922f34f59ba4e9beefbf7c3.tar.gz opie-7f2eef29708380844922f34f59ba4e9beefbf7c3.tar.bz2 |
initial checkin
Diffstat (limited to 'noncore/unsupported/mail2/libmail/smtphandler.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/unsupported/mail2/libmail/smtphandler.cpp | 172 |
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 | |||
18 | SmtpHandler::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 | |||
38 | void 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 | |||
52 | void SmtpHandler::hostFound() | ||
53 | { | ||
54 | emit status(tr("Host found.")); | ||
55 | } | ||
56 | |||
57 | void SmtpHandler::connected() | ||
58 | { | ||
59 | emit status(tr("Connected to %1").arg(_socket->peerName())); | ||
60 | } | ||
61 | |||
62 | void 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 | |||
151 | void 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 | |||
162 | void SmtpHandler::stop() | ||
163 | { | ||
164 | emit finished(); | ||
165 | QTimer::singleShot(0, this, SLOT(deleteMe())); | ||
166 | } | ||
167 | |||
168 | void SmtpHandler::deleteMe() | ||
169 | { | ||
170 | delete this; | ||
171 | } | ||
172 | |||