summaryrefslogtreecommitdiff
authoralwin <alwin>2004-01-11 11:45:10 (UTC)
committer alwin <alwin>2004-01-11 11:45:10 (UTC)
commitc384fb58ea944d6430777d403a6462429242c59b (patch) (unidiff)
tree16b5d69630d142f6713aff80c2a666c492728ed1
parent9edad3578862d4a3d1d85a8c311e3ace902f2f63 (diff)
downloadopie-c384fb58ea944d6430777d403a6462429242c59b.zip
opie-c384fb58ea944d6430777d403a6462429242c59b.tar.gz
opie-c384fb58ea944d6430777d403a6462429242c59b.tar.bz2
when failure sending mails them will be stored into a local folder
and a message box appears.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.cpp24
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.h1
2 files changed, 24 insertions, 1 deletions
diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
index 085d5e4..7671133 100644
--- a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
@@ -1,764 +1,786 @@
1#include <stdlib.h> 1#include <stdlib.h>
2#include <sys/stat.h> 2#include <sys/stat.h>
3#include <sys/types.h> 3#include <sys/types.h>
4#include <unistd.h> 4#include <unistd.h>
5#include <fcntl.h> 5#include <fcntl.h>
6#include <string.h> 6#include <string.h>
7#include <qdir.h> 7#include <qdir.h>
8#include <qt.h> 8#include <qt.h>
9#include <qmessagebox.h>
9 10
10#include <qpe/config.h> 11#include <qpe/config.h>
11#include <qpe/qcopenvelope_qws.h> 12#include <qpe/qcopenvelope_qws.h>
12 13
13#include <libetpan/libetpan.h> 14#include <libetpan/libetpan.h>
14 15
15#include "smtpwrapper.h" 16#include "smtpwrapper.h"
16#include "mailwrapper.h" 17#include "mailwrapper.h"
17#include "abstractmail.h" 18#include "abstractmail.h"
18#include "logindialog.h" 19#include "logindialog.h"
19#include "mailtypes.h" 20#include "mailtypes.h"
20//#include "defines.h" 21//#include "defines.h"
21#include "sendmailprogress.h" 22#include "sendmailprogress.h"
22 23
23const char* SMTPwrapper::USER_AGENT="OpieMail v0.3"; 24const char* SMTPwrapper::USER_AGENT="OpieMail v0.3";
24 25
25progressMailSend*SMTPwrapper::sendProgress = 0; 26progressMailSend*SMTPwrapper::sendProgress = 0;
26 27
27SMTPwrapper::SMTPwrapper( Settings *s ) 28SMTPwrapper::SMTPwrapper( Settings *s )
28: QObject() { 29: QObject() {
29 settings = s; 30 settings = s;
30 Config cfg( "mail" ); 31 Config cfg( "mail" );
31 cfg.setGroup( "Status" ); 32 cfg.setGroup( "Status" );
32 m_queuedMail = cfg.readNumEntry( "outgoing", 0 ); 33 m_queuedMail = cfg.readNumEntry( "outgoing", 0 );
33 emit queuedMails( m_queuedMail ); 34 emit queuedMails( m_queuedMail );
34 connect( this, SIGNAL( queuedMails( int ) ), this, SLOT( emitQCop( int ) ) ); 35 connect( this, SIGNAL( queuedMails( int ) ), this, SLOT( emitQCop( int ) ) );
35} 36}
36 37
37void SMTPwrapper::emitQCop( int queued ) { 38void SMTPwrapper::emitQCop( int queued ) {
38 QCopEnvelope env( "QPE/Pim", "outgoingMails(int)" ); 39 QCopEnvelope env( "QPE/Pim", "outgoingMails(int)" );
39 env << queued; 40 env << queued;
40} 41}
41 42
42QString SMTPwrapper::mailsmtpError( int errnum ) { 43QString SMTPwrapper::mailsmtpError( int errnum ) {
43 switch ( errnum ) { 44 switch ( errnum ) {
44 case MAILSMTP_NO_ERROR: 45 case MAILSMTP_NO_ERROR:
45 return tr( "No error" ); 46 return tr( "No error" );
46 case MAILSMTP_ERROR_UNEXPECTED_CODE: 47 case MAILSMTP_ERROR_UNEXPECTED_CODE:
47 return tr( "Unexpected error code" ); 48 return tr( "Unexpected error code" );
48 case MAILSMTP_ERROR_SERVICE_NOT_AVAILABLE: 49 case MAILSMTP_ERROR_SERVICE_NOT_AVAILABLE:
49 return tr( "Service not available" ); 50 return tr( "Service not available" );
50 case MAILSMTP_ERROR_STREAM: 51 case MAILSMTP_ERROR_STREAM:
51 return tr( "Stream error" ); 52 return tr( "Stream error" );
52 case MAILSMTP_ERROR_HOSTNAME: 53 case MAILSMTP_ERROR_HOSTNAME:
53 return tr( "gethostname() failed" ); 54 return tr( "gethostname() failed" );
54 case MAILSMTP_ERROR_NOT_IMPLEMENTED: 55 case MAILSMTP_ERROR_NOT_IMPLEMENTED:
55 return tr( "Not implemented" ); 56 return tr( "Not implemented" );
56 case MAILSMTP_ERROR_ACTION_NOT_TAKEN: 57 case MAILSMTP_ERROR_ACTION_NOT_TAKEN:
57 return tr( "Error, action not taken" ); 58 return tr( "Error, action not taken" );
58 case MAILSMTP_ERROR_EXCEED_STORAGE_ALLOCATION: 59 case MAILSMTP_ERROR_EXCEED_STORAGE_ALLOCATION:
59 return tr( "Data exceeds storage allocation" ); 60 return tr( "Data exceeds storage allocation" );
60 case MAILSMTP_ERROR_IN_PROCESSING: 61 case MAILSMTP_ERROR_IN_PROCESSING:
61 return tr( "Error in processing" ); 62 return tr( "Error in processing" );
62 // case MAILSMTP_ERROR_INSUFFISANT_SYSTEM_STORAGE: 63 // case MAILSMTP_ERROR_INSUFFISANT_SYSTEM_STORAGE:
63 // return tr( "Insufficient system storage" ); 64 // return tr( "Insufficient system storage" );
64 case MAILSMTP_ERROR_MAILBOX_UNAVAILABLE: 65 case MAILSMTP_ERROR_MAILBOX_UNAVAILABLE:
65 return tr( "Mailbox unavailable" ); 66 return tr( "Mailbox unavailable" );
66 case MAILSMTP_ERROR_MAILBOX_NAME_NOT_ALLOWED: 67 case MAILSMTP_ERROR_MAILBOX_NAME_NOT_ALLOWED:
67 return tr( "Mailbox name not allowed" ); 68 return tr( "Mailbox name not allowed" );
68 case MAILSMTP_ERROR_BAD_SEQUENCE_OF_COMMAND: 69 case MAILSMTP_ERROR_BAD_SEQUENCE_OF_COMMAND:
69 return tr( "Bad command sequence" ); 70 return tr( "Bad command sequence" );
70 case MAILSMTP_ERROR_USER_NOT_LOCAL: 71 case MAILSMTP_ERROR_USER_NOT_LOCAL:
71 return tr( "User not local" ); 72 return tr( "User not local" );
72 case MAILSMTP_ERROR_TRANSACTION_FAILED: 73 case MAILSMTP_ERROR_TRANSACTION_FAILED:
73 return tr( "Transaction failed" ); 74 return tr( "Transaction failed" );
74 case MAILSMTP_ERROR_MEMORY: 75 case MAILSMTP_ERROR_MEMORY:
75 return tr( "Memory error" ); 76 return tr( "Memory error" );
76 case MAILSMTP_ERROR_CONNECTION_REFUSED: 77 case MAILSMTP_ERROR_CONNECTION_REFUSED:
77 return tr( "Connection refused" ); 78 return tr( "Connection refused" );
78 default: 79 default:
79 return tr( "Unknown error code" ); 80 return tr( "Unknown error code" );
80 } 81 }
81} 82}
82 83
83mailimf_mailbox *SMTPwrapper::newMailbox(const QString&name, const QString&mail ) { 84mailimf_mailbox *SMTPwrapper::newMailbox(const QString&name, const QString&mail ) {
84 return mailimf_mailbox_new( strdup( name.latin1() ), 85 return mailimf_mailbox_new( strdup( name.latin1() ),
85 strdup( mail.latin1() ) ); 86 strdup( mail.latin1() ) );
86} 87}
87 88
88mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr ) { 89mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr ) {
89 mailimf_address_list *addresses; 90 mailimf_address_list *addresses;
90 91
91 if ( addr.isEmpty() ) 92 if ( addr.isEmpty() )
92 return NULL; 93 return NULL;
93 94
94 addresses = mailimf_address_list_new_empty(); 95 addresses = mailimf_address_list_new_empty();
95 96
96 bool literal_open = false; 97 bool literal_open = false;
97 unsigned int startpos = 0; 98 unsigned int startpos = 0;
98 QStringList list; 99 QStringList list;
99 QString s; 100 QString s;
100 unsigned int i = 0; 101 unsigned int i = 0;
101 for (; i < addr.length();++i) { 102 for (; i < addr.length();++i) {
102 switch (addr[i]) { 103 switch (addr[i]) {
103 case '\"': 104 case '\"':
104 literal_open = !literal_open; 105 literal_open = !literal_open;
105 break; 106 break;
106 case ',': 107 case ',':
107 if (!literal_open) { 108 if (!literal_open) {
108 s = addr.mid(startpos,i-startpos); 109 s = addr.mid(startpos,i-startpos);
109 if (!s.isEmpty()) { 110 if (!s.isEmpty()) {
110 list.append(s); 111 list.append(s);
111 qDebug("Appended %s",s.latin1()); 112 qDebug("Appended %s",s.latin1());
112 } 113 }
113 // !!!! this is a MUST BE! 114 // !!!! this is a MUST BE!
114 startpos = ++i; 115 startpos = ++i;
115 } 116 }
116 break; 117 break;
117 default: 118 default:
118 break; 119 break;
119 } 120 }
120 } 121 }
121 s = addr.mid(startpos,i-startpos); 122 s = addr.mid(startpos,i-startpos);
122 if (!s.isEmpty()) { 123 if (!s.isEmpty()) {
123 list.append(s); 124 list.append(s);
124 qDebug("Appended %s",s.latin1()); 125 qDebug("Appended %s",s.latin1());
125 } 126 }
126 QStringList::Iterator it; 127 QStringList::Iterator it;
127 for ( it = list.begin(); it != list.end(); it++ ) { 128 for ( it = list.begin(); it != list.end(); it++ ) {
128 int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() ); 129 int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() );
129 if ( err != MAILIMF_NO_ERROR ) { 130 if ( err != MAILIMF_NO_ERROR ) {
130 qDebug( "Error parsing" ); 131 qDebug( "Error parsing" );
131 qDebug( *it ); 132 qDebug( *it );
132 } else { 133 } else {
133 qDebug( "Parse success! %s",(*it).latin1()); 134 qDebug( "Parse success! %s",(*it).latin1());
134 } 135 }
135 } 136 }
136 return addresses; 137 return addresses;
137} 138}
138 139
139mailimf_fields *SMTPwrapper::createImfFields(const Mail&mail ) { 140mailimf_fields *SMTPwrapper::createImfFields(const Mail&mail ) {
140 mailimf_fields *fields; 141 mailimf_fields *fields;
141 mailimf_field *xmailer; 142 mailimf_field *xmailer;
142 mailimf_mailbox *sender=0,*fromBox=0; 143 mailimf_mailbox *sender=0,*fromBox=0;
143 mailimf_mailbox_list *from=0; 144 mailimf_mailbox_list *from=0;
144 mailimf_address_list *to=0, *cc=0, *bcc=0, *reply=0; 145 mailimf_address_list *to=0, *cc=0, *bcc=0, *reply=0;
145 char *subject = strdup( mail.getSubject().latin1() ); 146 char *subject = strdup( mail.getSubject().latin1() );
146 int err; 147 int err;
147 148
148 sender = newMailbox( mail.getName(), mail.getMail() ); 149 sender = newMailbox( mail.getName(), mail.getMail() );
149 if ( sender == NULL ) 150 if ( sender == NULL )
150 goto err_free; 151 goto err_free;
151 152
152 fromBox = newMailbox( mail.getName(), mail.getMail() ); 153 fromBox = newMailbox( mail.getName(), mail.getMail() );
153 if ( fromBox == NULL ) 154 if ( fromBox == NULL )
154 goto err_free_sender; 155 goto err_free_sender;
155 156
156 from = mailimf_mailbox_list_new_empty(); 157 from = mailimf_mailbox_list_new_empty();
157 if ( from == NULL ) 158 if ( from == NULL )
158 goto err_free_fromBox; 159 goto err_free_fromBox;
159 160
160 err = mailimf_mailbox_list_add( from, fromBox ); 161 err = mailimf_mailbox_list_add( from, fromBox );
161 if ( err != MAILIMF_NO_ERROR ) 162 if ( err != MAILIMF_NO_ERROR )
162 goto err_free_from; 163 goto err_free_from;
163 164
164 to = parseAddresses( mail.getTo() ); 165 to = parseAddresses( mail.getTo() );
165 if ( to == NULL ) 166 if ( to == NULL )
166 goto err_free_from; 167 goto err_free_from;
167 168
168 cc = parseAddresses( mail.getCC() ); 169 cc = parseAddresses( mail.getCC() );
169 bcc = parseAddresses( mail.getBCC() ); 170 bcc = parseAddresses( mail.getBCC() );
170 reply = parseAddresses( mail.getReply() ); 171 reply = parseAddresses( mail.getReply() );
171 172
172 fields = mailimf_fields_new_with_data( from, sender, reply, to, cc, bcc, 173 fields = mailimf_fields_new_with_data( from, sender, reply, to, cc, bcc,
173 NULL, NULL, subject ); 174 NULL, NULL, subject );
174 if ( fields == NULL ) 175 if ( fields == NULL )
175 goto err_free_reply; 176 goto err_free_reply;
176 177
177 xmailer = mailimf_field_new_custom( strdup( "User-Agent" ), 178 xmailer = mailimf_field_new_custom( strdup( "User-Agent" ),
178 strdup( USER_AGENT ) ); 179 strdup( USER_AGENT ) );
179 if ( xmailer == NULL ) 180 if ( xmailer == NULL )
180 goto err_free_fields; 181 goto err_free_fields;
181 182
182 err = mailimf_fields_add( fields, xmailer ); 183 err = mailimf_fields_add( fields, xmailer );
183 if ( err != MAILIMF_NO_ERROR ) 184 if ( err != MAILIMF_NO_ERROR )
184 goto err_free_xmailer; 185 goto err_free_xmailer;
185 186
186 return fields; // Success :) 187 return fields; // Success :)
187 188
188err_free_xmailer: 189err_free_xmailer:
189 if (xmailer) 190 if (xmailer)
190 mailimf_field_free( xmailer ); 191 mailimf_field_free( xmailer );
191err_free_fields: 192err_free_fields:
192 if (fields) 193 if (fields)
193 mailimf_fields_free( fields ); 194 mailimf_fields_free( fields );
194err_free_reply: 195err_free_reply:
195 if (reply) 196 if (reply)
196 mailimf_address_list_free( reply ); 197 mailimf_address_list_free( reply );
197 if (bcc) 198 if (bcc)
198 mailimf_address_list_free( bcc ); 199 mailimf_address_list_free( bcc );
199 if (cc) 200 if (cc)
200 mailimf_address_list_free( cc ); 201 mailimf_address_list_free( cc );
201 if (to) 202 if (to)
202 mailimf_address_list_free( to ); 203 mailimf_address_list_free( to );
203err_free_from: 204err_free_from:
204 if (from) 205 if (from)
205 mailimf_mailbox_list_free( from ); 206 mailimf_mailbox_list_free( from );
206err_free_fromBox: 207err_free_fromBox:
207 mailimf_mailbox_free( fromBox ); 208 mailimf_mailbox_free( fromBox );
208err_free_sender: 209err_free_sender:
209 if (sender) 210 if (sender)
210 mailimf_mailbox_free( sender ); 211 mailimf_mailbox_free( sender );
211err_free: 212err_free:
212 if (subject) 213 if (subject)
213 free( subject ); 214 free( subject );
214 qDebug( "createImfFields - error" ); 215 qDebug( "createImfFields - error" );
215 216
216 return NULL; // Error :( 217 return NULL; // Error :(
217} 218}
218 219
219mailmime *SMTPwrapper::buildTxtPart(const QString&str ) { 220mailmime *SMTPwrapper::buildTxtPart(const QString&str ) {
220 mailmime *txtPart; 221 mailmime *txtPart;
221 mailmime_fields *fields; 222 mailmime_fields *fields;
222 mailmime_content *content; 223 mailmime_content *content;
223 mailmime_parameter *param; 224 mailmime_parameter *param;
224 int err; 225 int err;
225 226
226 param = mailmime_parameter_new( strdup( "charset" ), 227 param = mailmime_parameter_new( strdup( "charset" ),
227 strdup( "iso-8859-1" ) ); 228 strdup( "iso-8859-1" ) );
228 if ( param == NULL ) 229 if ( param == NULL )
229 goto err_free; 230 goto err_free;
230 231
231 content = mailmime_content_new_with_str( "text/plain" ); 232 content = mailmime_content_new_with_str( "text/plain" );
232 if ( content == NULL ) 233 if ( content == NULL )
233 goto err_free_param; 234 goto err_free_param;
234 235
235 err = clist_append( content->ct_parameters, param ); 236 err = clist_append( content->ct_parameters, param );
236 if ( err != MAILIMF_NO_ERROR ) 237 if ( err != MAILIMF_NO_ERROR )
237 goto err_free_content; 238 goto err_free_content;
238 239
239 fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT); 240 fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT);
240 if ( fields == NULL ) 241 if ( fields == NULL )
241 goto err_free_content; 242 goto err_free_content;
242 243
243 txtPart = mailmime_new_empty( content, fields ); 244 txtPart = mailmime_new_empty( content, fields );
244 if ( txtPart == NULL ) 245 if ( txtPart == NULL )
245 goto err_free_fields; 246 goto err_free_fields;
246 247
247 err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() ); 248 err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() );
248 if ( err != MAILIMF_NO_ERROR ) 249 if ( err != MAILIMF_NO_ERROR )
249 goto err_free_txtPart; 250 goto err_free_txtPart;
250 251
251 return txtPart; // Success :) 252 return txtPart; // Success :)
252 253
253err_free_txtPart: 254err_free_txtPart:
254 mailmime_free( txtPart ); 255 mailmime_free( txtPart );
255err_free_fields: 256err_free_fields:
256 mailmime_fields_free( fields ); 257 mailmime_fields_free( fields );
257err_free_content: 258err_free_content:
258 mailmime_content_free( content ); 259 mailmime_content_free( content );
259err_free_param: 260err_free_param:
260 mailmime_parameter_free( param ); 261 mailmime_parameter_free( param );
261err_free: 262err_free:
262 qDebug( "buildTxtPart - error" ); 263 qDebug( "buildTxtPart - error" );
263 264
264 return NULL; // Error :( 265 return NULL; // Error :(
265} 266}
266 267
267mailmime *SMTPwrapper::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) { 268mailmime *SMTPwrapper::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) {
268 mailmime * filePart = 0; 269 mailmime * filePart = 0;
269 mailmime_fields * fields = 0; 270 mailmime_fields * fields = 0;
270 mailmime_content * content = 0; 271 mailmime_content * content = 0;
271 mailmime_parameter * param = 0; 272 mailmime_parameter * param = 0;
272 char*name = 0; 273 char*name = 0;
273 char*file = 0; 274 char*file = 0;
274 int err; 275 int err;
275 276
276 int pos = filename.findRev( '/' ); 277 int pos = filename.findRev( '/' );
277 278
278 if (filename.length()>0) { 279 if (filename.length()>0) {
279 QString tmp = filename.right( filename.length() - ( pos + 1 ) ); 280 QString tmp = filename.right( filename.length() - ( pos + 1 ) );
280 name = strdup( tmp.latin1() ); // just filename 281 name = strdup( tmp.latin1() ); // just filename
281 file = strdup( filename.latin1() ); // full name with path 282 file = strdup( filename.latin1() ); // full name with path
282 } 283 }
283 284
284 int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT; 285 int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT;
285 int mechanism = MAILMIME_MECHANISM_BASE64; 286 int mechanism = MAILMIME_MECHANISM_BASE64;
286 287
287 if ( mimetype.startsWith( "text/" ) ) { 288 if ( mimetype.startsWith( "text/" ) ) {
288 param = mailmime_parameter_new( strdup( "charset" ), 289 param = mailmime_parameter_new( strdup( "charset" ),
289 strdup( "iso-8859-1" ) ); 290 strdup( "iso-8859-1" ) );
290 mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE; 291 mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE;
291 } 292 }
292 293
293 fields = mailmime_fields_new_filename( 294 fields = mailmime_fields_new_filename(
294 disptype, name, 295 disptype, name,
295 mechanism ); 296 mechanism );
296 content = mailmime_content_new_with_str( (char*)mimetype.latin1() ); 297 content = mailmime_content_new_with_str( (char*)mimetype.latin1() );
297 if (content!=0 && fields != 0) { 298 if (content!=0 && fields != 0) {
298 if (param) { 299 if (param) {
299 clist_append(content->ct_parameters,param); 300 clist_append(content->ct_parameters,param);
300 param = 0; 301 param = 0;
301 } 302 }
302 if (filename.length()>0) { 303 if (filename.length()>0) {
303 QFileInfo f(filename); 304 QFileInfo f(filename);
304 param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1())); 305 param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1()));
305 clist_append(content->ct_parameters,param); 306 clist_append(content->ct_parameters,param);
306 param = 0; 307 param = 0;
307 } 308 }
308 filePart = mailmime_new_empty( content, fields ); 309 filePart = mailmime_new_empty( content, fields );
309 } 310 }
310 if (filePart) { 311 if (filePart) {
311 if (filename.length()>0) { 312 if (filename.length()>0) {
312 err = mailmime_set_body_file( filePart, file ); 313 err = mailmime_set_body_file( filePart, file );
313 } else { 314 } else {
314 err = mailmime_set_body_text(filePart,strdup(TextContent.data()),TextContent.length()); 315 err = mailmime_set_body_text(filePart,strdup(TextContent.data()),TextContent.length());
315 } 316 }
316 if (err != MAILIMF_NO_ERROR) { 317 if (err != MAILIMF_NO_ERROR) {
317 qDebug("Error setting body with file %s",file); 318 qDebug("Error setting body with file %s",file);
318 mailmime_free( filePart ); 319 mailmime_free( filePart );
319 filePart = 0; 320 filePart = 0;
320 } 321 }
321 } 322 }
322 323
323 if (!filePart) { 324 if (!filePart) {
324 if ( param != NULL ) { 325 if ( param != NULL ) {
325 mailmime_parameter_free( param ); 326 mailmime_parameter_free( param );
326 } 327 }
327 if (content) { 328 if (content) {
328 mailmime_content_free( content ); 329 mailmime_content_free( content );
329 } 330 }
330 if (fields) { 331 if (fields) {
331 mailmime_fields_free( fields ); 332 mailmime_fields_free( fields );
332 } else { 333 } else {
333 if (name) { 334 if (name) {
334 free( name ); 335 free( name );
335 } 336 }
336 if (file) { 337 if (file) {
337 free( file ); 338 free( file );
338 } 339 }
339 } 340 }
340 } 341 }
341 return filePart; // Success :) 342 return filePart; // Success :)
342 343
343} 344}
344 345
345void SMTPwrapper::addFileParts( mailmime *message,const QList<Attachment>&files ) { 346void SMTPwrapper::addFileParts( mailmime *message,const QList<Attachment>&files ) {
346 const Attachment *it; 347 const Attachment *it;
347 unsigned int count = files.count(); 348 unsigned int count = files.count();
348 qDebug("List contains %i values",count); 349 qDebug("List contains %i values",count);
349 for ( unsigned int i = 0; i < count; ++i ) { 350 for ( unsigned int i = 0; i < count; ++i ) {
350 qDebug( "Adding file" ); 351 qDebug( "Adding file" );
351 mailmime *filePart; 352 mailmime *filePart;
352 int err; 353 int err;
353 it = ((QList<Attachment>)files).at(i); 354 it = ((QList<Attachment>)files).at(i);
354 355
355 filePart = buildFilePart( it->getFileName(), it->getMimeType(),"" ); 356 filePart = buildFilePart( it->getFileName(), it->getMimeType(),"" );
356 if ( filePart == NULL ) { 357 if ( filePart == NULL ) {
357 qDebug( "addFileParts: error adding file:" ); 358 qDebug( "addFileParts: error adding file:" );
358 qDebug( it->getFileName() ); 359 qDebug( it->getFileName() );
359 continue; 360 continue;
360 } 361 }
361 err = mailmime_smart_add_part( message, filePart ); 362 err = mailmime_smart_add_part( message, filePart );
362 if ( err != MAILIMF_NO_ERROR ) { 363 if ( err != MAILIMF_NO_ERROR ) {
363 mailmime_free( filePart ); 364 mailmime_free( filePart );
364 qDebug("error smart add"); 365 qDebug("error smart add");
365 } 366 }
366 } 367 }
367} 368}
368 369
369mailmime *SMTPwrapper::createMimeMail(const Mail &mail ) { 370mailmime *SMTPwrapper::createMimeMail(const Mail &mail ) {
370 mailmime *message, *txtPart; 371 mailmime *message, *txtPart;
371 mailimf_fields *fields; 372 mailimf_fields *fields;
372 int err; 373 int err;
373 374
374 fields = createImfFields( mail ); 375 fields = createImfFields( mail );
375 if ( fields == NULL ) 376 if ( fields == NULL )
376 goto err_free; 377 goto err_free;
377 378
378 message = mailmime_new_message_data( NULL ); 379 message = mailmime_new_message_data( NULL );
379 if ( message == NULL ) 380 if ( message == NULL )
380 goto err_free_fields; 381 goto err_free_fields;
381 382
382 mailmime_set_imf_fields( message, fields ); 383 mailmime_set_imf_fields( message, fields );
383 384
384 txtPart = buildTxtPart( mail.getMessage() ); 385 txtPart = buildTxtPart( mail.getMessage() );
385 386
386 if ( txtPart == NULL ) 387 if ( txtPart == NULL )
387 goto err_free_message; 388 goto err_free_message;
388 389
389 err = mailmime_smart_add_part( message, txtPart ); 390 err = mailmime_smart_add_part( message, txtPart );
390 if ( err != MAILIMF_NO_ERROR ) 391 if ( err != MAILIMF_NO_ERROR )
391 goto err_free_txtPart; 392 goto err_free_txtPart;
392 393
393 addFileParts( message, mail.getAttachments() ); 394 addFileParts( message, mail.getAttachments() );
394 395
395 return message; // Success :) 396 return message; // Success :)
396 397
397err_free_txtPart: 398err_free_txtPart:
398 mailmime_free( txtPart ); 399 mailmime_free( txtPart );
399err_free_message: 400err_free_message:
400 mailmime_free( message ); 401 mailmime_free( message );
401err_free_fields: 402err_free_fields:
402 mailimf_fields_free( fields ); 403 mailimf_fields_free( fields );
403err_free: 404err_free:
404 qDebug( "createMimeMail: error" ); 405 qDebug( "createMimeMail: error" );
405 406
406 return NULL; // Error :( 407 return NULL; // Error :(
407} 408}
408 409
409mailimf_field *SMTPwrapper::getField( mailimf_fields *fields, int type ) { 410mailimf_field *SMTPwrapper::getField( mailimf_fields *fields, int type ) {
410 mailimf_field *field; 411 mailimf_field *field;
411 clistiter *it; 412 clistiter *it;
412 413
413 it = clist_begin( fields->fld_list ); 414 it = clist_begin( fields->fld_list );
414 while ( it ) { 415 while ( it ) {
415 field = (mailimf_field *) it->data; 416 field = (mailimf_field *) it->data;
416 if ( field->fld_type == type ) { 417 if ( field->fld_type == type ) {
417 return field; 418 return field;
418 } 419 }
419 it = it->next; 420 it = it->next;
420 } 421 }
421 422
422 return NULL; 423 return NULL;
423} 424}
424 425
425void SMTPwrapper::addRcpts( clist *list, mailimf_address_list *addr_list ) { 426void SMTPwrapper::addRcpts( clist *list, mailimf_address_list *addr_list ) {
426 clistiter *it, *it2; 427 clistiter *it, *it2;
427 428
428 for ( it = clist_begin( addr_list->ad_list ); it; it = it->next ) { 429 for ( it = clist_begin( addr_list->ad_list ); it; it = it->next ) {
429 mailimf_address *addr; 430 mailimf_address *addr;
430 addr = (mailimf_address *) it->data; 431 addr = (mailimf_address *) it->data;
431 432
432 if ( addr->ad_type == MAILIMF_ADDRESS_MAILBOX ) { 433 if ( addr->ad_type == MAILIMF_ADDRESS_MAILBOX ) {
433 esmtp_address_list_add( list, addr->ad_data.ad_mailbox->mb_addr_spec, 0, NULL ); 434 esmtp_address_list_add( list, addr->ad_data.ad_mailbox->mb_addr_spec, 0, NULL );
434 } else if ( addr->ad_type == MAILIMF_ADDRESS_GROUP ) { 435 } else if ( addr->ad_type == MAILIMF_ADDRESS_GROUP ) {
435 clist *l = addr->ad_data.ad_group->grp_mb_list->mb_list; 436 clist *l = addr->ad_data.ad_group->grp_mb_list->mb_list;
436 for ( it2 = clist_begin( l ); it2; it2 = it2->next ) { 437 for ( it2 = clist_begin( l ); it2; it2 = it2->next ) {
437 mailimf_mailbox *mbox; 438 mailimf_mailbox *mbox;
438 mbox = (mailimf_mailbox *) it2->data; 439 mbox = (mailimf_mailbox *) it2->data;
439 esmtp_address_list_add( list, mbox->mb_addr_spec, 0, NULL ); 440 esmtp_address_list_add( list, mbox->mb_addr_spec, 0, NULL );
440 } 441 }
441 } 442 }
442 } 443 }
443} 444}
444 445
445clist *SMTPwrapper::createRcptList( mailimf_fields *fields ) { 446clist *SMTPwrapper::createRcptList( mailimf_fields *fields ) {
446 clist *rcptList; 447 clist *rcptList;
447 mailimf_field *field; 448 mailimf_field *field;
448 449
449 rcptList = esmtp_address_list_new(); 450 rcptList = esmtp_address_list_new();
450 451
451 field = getField( fields, MAILIMF_FIELD_TO ); 452 field = getField( fields, MAILIMF_FIELD_TO );
452 if ( field && (field->fld_type == MAILIMF_FIELD_TO) 453 if ( field && (field->fld_type == MAILIMF_FIELD_TO)
453 && field->fld_data.fld_to->to_addr_list ) { 454 && field->fld_data.fld_to->to_addr_list ) {
454 addRcpts( rcptList, field->fld_data.fld_to->to_addr_list ); 455 addRcpts( rcptList, field->fld_data.fld_to->to_addr_list );
455 } 456 }
456 457
457 field = getField( fields, MAILIMF_FIELD_CC ); 458 field = getField( fields, MAILIMF_FIELD_CC );
458 if ( field && (field->fld_type == MAILIMF_FIELD_CC) 459 if ( field && (field->fld_type == MAILIMF_FIELD_CC)
459 && field->fld_data.fld_cc->cc_addr_list ) { 460 && field->fld_data.fld_cc->cc_addr_list ) {
460 addRcpts( rcptList, field->fld_data.fld_cc->cc_addr_list ); 461 addRcpts( rcptList, field->fld_data.fld_cc->cc_addr_list );
461 } 462 }
462 463
463 field = getField( fields, MAILIMF_FIELD_BCC ); 464 field = getField( fields, MAILIMF_FIELD_BCC );
464 if ( field && (field->fld_type == MAILIMF_FIELD_BCC) 465 if ( field && (field->fld_type == MAILIMF_FIELD_BCC)
465 && field->fld_data.fld_bcc->bcc_addr_list ) { 466 && field->fld_data.fld_bcc->bcc_addr_list ) {
466 addRcpts( rcptList, field->fld_data.fld_bcc->bcc_addr_list ); 467 addRcpts( rcptList, field->fld_data.fld_bcc->bcc_addr_list );
467 } 468 }
468 469
469 return rcptList; 470 return rcptList;
470} 471}
471 472
472char *SMTPwrapper::getFrom( mailimf_field *ffrom) { 473char *SMTPwrapper::getFrom( mailimf_field *ffrom) {
473 char *from = NULL; 474 char *from = NULL;
474 if ( ffrom && (ffrom->fld_type == MAILIMF_FIELD_FROM) 475 if ( ffrom && (ffrom->fld_type == MAILIMF_FIELD_FROM)
475 && ffrom->fld_data.fld_from->frm_mb_list && ffrom->fld_data.fld_from->frm_mb_list->mb_list ) { 476 && ffrom->fld_data.fld_from->frm_mb_list && ffrom->fld_data.fld_from->frm_mb_list->mb_list ) {
476 clist *cl = ffrom->fld_data.fld_from->frm_mb_list->mb_list; 477 clist *cl = ffrom->fld_data.fld_from->frm_mb_list->mb_list;
477 clistiter *it; 478 clistiter *it;
478 for ( it = clist_begin( cl ); it; it = it->next ) { 479 for ( it = clist_begin( cl ); it; it = it->next ) {
479 mailimf_mailbox *mb = (mailimf_mailbox *) it->data; 480 mailimf_mailbox *mb = (mailimf_mailbox *) it->data;
480 from = strdup( mb->mb_addr_spec ); 481 from = strdup( mb->mb_addr_spec );
481 } 482 }
482 } 483 }
483 484
484 return from; 485 return from;
485} 486}
486 487
487char *SMTPwrapper::getFrom( mailmime *mail ) { 488char *SMTPwrapper::getFrom( mailmime *mail ) {
488 /* no need to delete - its just a pointer to structure content */ 489 /* no need to delete - its just a pointer to structure content */
489 mailimf_field *ffrom = 0; 490 mailimf_field *ffrom = 0;
490 ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM ); 491 ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM );
491 return getFrom(ffrom); 492 return getFrom(ffrom);
492} 493}
493 494
494void SMTPwrapper::progress( size_t current, size_t maximum ) { 495void SMTPwrapper::progress( size_t current, size_t maximum ) {
495 if (SMTPwrapper::sendProgress) { 496 if (SMTPwrapper::sendProgress) {
496 SMTPwrapper::sendProgress->setSingleMail(current, maximum ); 497 SMTPwrapper::sendProgress->setSingleMail(current, maximum );
497 qApp->processEvents(); 498 qApp->processEvents();
498 } 499 }
499} 500}
500 501
501void SMTPwrapper::storeMail(const char*mail, size_t length, const QString&box) { 502void SMTPwrapper::storeMail(const char*mail, size_t length, const QString&box) {
502 if (!mail) 503 if (!mail)
503 return; 504 return;
504 QString localfolders = AbstractMail::defaultLocalfolder(); 505 QString localfolders = AbstractMail::defaultLocalfolder();
505 AbstractMail*wrap = AbstractMail::getWrapper(localfolders); 506 AbstractMail*wrap = AbstractMail::getWrapper(localfolders);
506 wrap->createMbox(box); 507 wrap->createMbox(box);
507 wrap->storeMessage(mail,length,box); 508 wrap->storeMessage(mail,length,box);
508 delete wrap; 509 delete wrap;
509} 510}
510 511
511void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ) { 512void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ) {
512 clist *rcpts = 0; 513 clist *rcpts = 0;
513 char *from, *data; 514 char *from, *data;
514 size_t size; 515 size_t size;
515 516
516 if ( smtp == NULL ) { 517 if ( smtp == NULL ) {
517 return; 518 return;
518 } 519 }
519 from = data = 0; 520 from = data = 0;
520 521
521 mailmessage * msg = 0; 522 mailmessage * msg = 0;
522 msg = mime_message_init(mail); 523 msg = mime_message_init(mail);
523 mime_message_set_tmpdir(msg,getenv( "HOME" )); 524 mime_message_set_tmpdir(msg,getenv( "HOME" ));
524 int r = mailmessage_fetch(msg,&data,&size); 525 int r = mailmessage_fetch(msg,&data,&size);
525 mime_message_detach_mime(msg); 526 mime_message_detach_mime(msg);
526 mailmessage_free(msg); 527 mailmessage_free(msg);
527 if (r != MAIL_NO_ERROR || !data) { 528 if (r != MAIL_NO_ERROR || !data) {
528 if (data) 529 if (data)
529 free(data); 530 free(data);
530 qDebug("Error fetching mime..."); 531 qDebug("Error fetching mime...");
531 return; 532 return;
532 } 533 }
533 msg = 0; 534 msg = 0;
534 if (later) { 535 if (later) {
535 storeMail(data,size,"Outgoing"); 536 storeMail(data,size,"Outgoing");
536 if (data) 537 if (data)
537 free( data ); 538 free( data );
538 Config cfg( "mail" ); 539 Config cfg( "mail" );
539 cfg.setGroup( "Status" ); 540 cfg.setGroup( "Status" );
540 cfg.writeEntry( "outgoing", ++m_queuedMail ); 541 cfg.writeEntry( "outgoing", ++m_queuedMail );
541 emit queuedMails( m_queuedMail ); 542 emit queuedMails( m_queuedMail );
542 return; 543 return;
543 } 544 }
544 from = getFrom( mail ); 545 from = getFrom( mail );
545 rcpts = createRcptList( mail->mm_data.mm_message.mm_fields ); 546 rcpts = createRcptList( mail->mm_data.mm_message.mm_fields );
546 smtpSend(from,rcpts,data,size,smtp); 547 smtpSend(from,rcpts,data,size,smtp);
547 if (data) { 548 if (data) {
548 free(data); 549 free(data);
549 } 550 }
550 if (from) { 551 if (from) {
551 free(from); 552 free(from);
552 } 553 }
553 if (rcpts) 554 if (rcpts)
554 smtp_address_list_free( rcpts ); 555 smtp_address_list_free( rcpts );
555} 556}
556 557
558void SMTPwrapper::storeFailedMail(const char*data,unsigned int size, const char*failuremessage)
559{
560 if (data) {
561 storeMail(data,size,"Sendfailed");
562 }
563 if (failuremessage) {
564 QMessageBox::critical(0,tr("Error sending mail"),
565 tr("<center>%1</center>").arg(failuremessage));
566 }
567}
568
557int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ) { 569int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ) {
558 const char *server, *user, *pass; 570 const char *server, *user, *pass;
559 bool ssl; 571 bool ssl;
560 uint16_t port; 572 uint16_t port;
561 mailsmtp *session; 573 mailsmtp *session;
562 int err,result; 574 int err,result;
563 575
564 result = 1; 576 result = 1;
565 server = user = pass = 0; 577 server = user = pass = 0;
566 server = smtp->getServer().latin1(); 578 server = smtp->getServer().latin1();
567 579
568 // FIXME: currently only TLS and Plain work. 580 // FIXME: currently only TLS and Plain work.
569 581
570 ssl = false; 582 ssl = false;
571 583
572 if ( smtp->ConnectionType() == 2 ) { 584 if ( smtp->ConnectionType() == 2 ) {
573 ssl = true; 585 ssl = true;
574 } 586 }
575 587
576 port = smtp->getPort().toUInt(); 588 port = smtp->getPort().toUInt();
577 589
578 session = mailsmtp_new( 20, &progress ); 590 session = mailsmtp_new( 20, &progress );
579 if ( session == NULL ) 591 if ( session == NULL )
580 goto free_mem; 592 goto free_mem;
581 593
582 qDebug( "Servername %s at port %i", server, port ); 594 qDebug( "Servername %s at port %i", server, port );
583 if ( ssl ) { 595 if ( ssl ) {
584 qDebug( "SSL session" ); 596 qDebug( "SSL session" );
585 err = mailsmtp_ssl_connect( session, server, port ); 597 err = mailsmtp_ssl_connect( session, server, port );
586 } else { 598 } else {
587 qDebug( "No SSL session" ); 599 qDebug( "No SSL session" );
588 err = mailsmtp_socket_connect( session, server, port ); 600 err = mailsmtp_socket_connect( session, server, port );
589 } 601 }
590 if ( err != MAILSMTP_NO_ERROR ) { 602 if ( err != MAILSMTP_NO_ERROR ) {
591 qDebug("Error init connection"); 603 qDebug("Error init connection");
604 storeFailedMail(data,size,mailsmtpError(err));
592 result = 0; 605 result = 0;
593 goto free_mem_session; 606 goto free_mem_session;
594 } 607 }
595 608
596 err = mailsmtp_init( session ); 609 err = mailsmtp_init( session );
597 if ( err != MAILSMTP_NO_ERROR ) { 610 if ( err != MAILSMTP_NO_ERROR ) {
611 storeFailedMail(data,size,mailsmtpError(err));
598 result = 0; 612 result = 0;
599 goto free_con_session; 613 goto free_con_session;
600 } 614 }
601 615
602 qDebug( "INIT OK" ); 616 qDebug( "INIT OK" );
603 617
604 if ( smtp->getLogin() ) { 618 if ( smtp->getLogin() ) {
605 qDebug("smtp with auth"); 619 qDebug("smtp with auth");
606 if ( smtp->getUser().isEmpty() || smtp->getPassword().isEmpty() ) { 620 if ( smtp->getUser().isEmpty() || smtp->getPassword().isEmpty() ) {
607 // get'em 621 // get'em
608 LoginDialog login( smtp->getUser(), smtp->getPassword(), NULL, 0, true ); 622 LoginDialog login( smtp->getUser(), smtp->getPassword(), NULL, 0, true );
609 login.show(); 623 login.show();
610 if ( QDialog::Accepted == login.exec() ) { 624 if ( QDialog::Accepted == login.exec() ) {
611 // ok 625 // ok
612 user = login.getUser().latin1(); 626 user = login.getUser().latin1();
613 pass = login.getPassword().latin1(); 627 pass = login.getPassword().latin1();
614 } else { 628 } else {
615 result = 0; 629 result = 0;
616 goto free_con_session; 630 goto free_con_session;
617 } 631 }
618 } else { 632 } else {
619 user = smtp->getUser().latin1(); 633 user = smtp->getUser().latin1();
620 pass = smtp->getPassword().latin1(); 634 pass = smtp->getPassword().latin1();
621 } 635 }
622 qDebug( "session->auth: %i", session->auth); 636 qDebug( "session->auth: %i", session->auth);
623 err = mailsmtp_auth( session, (char*)user, (char*)pass ); 637 err = mailsmtp_auth( session, (char*)user, (char*)pass );
624 if ( err == MAILSMTP_NO_ERROR ) 638 if ( err == MAILSMTP_NO_ERROR ) {
625 qDebug("auth ok"); 639 qDebug("auth ok");
640 } else {
641 storeFailedMail(data,size,tr("Authentification failed"));
642 result = 0;
643 goto free_con_session;
644 }
626 qDebug( "Done auth!" ); 645 qDebug( "Done auth!" );
627 } else { 646 } else {
628 qDebug("SMTP without auth"); 647 qDebug("SMTP without auth");
648 result = 0;
649 goto free_con_session;
629 } 650 }
630 651
631 err = mailsmtp_send( session, from, rcpts, data, size ); 652 err = mailsmtp_send( session, from, rcpts, data, size );
632 if ( err != MAILSMTP_NO_ERROR ) { 653 if ( err != MAILSMTP_NO_ERROR ) {
654 storeFailedMail(data,size,mailsmtpError(err));
633 qDebug("Error sending mail: %s",mailsmtpError(err).latin1()); 655 qDebug("Error sending mail: %s",mailsmtpError(err).latin1());
634 result = 0; 656 result = 0;
635 goto free_con_session; 657 goto free_con_session;
636 } 658 }
637 659
638 qDebug( "Mail sent." ); 660 qDebug( "Mail sent." );
639 storeMail(data,size,"Sent"); 661 storeMail(data,size,"Sent");
640 662
641free_con_session: 663free_con_session:
642 mailsmtp_quit( session ); 664 mailsmtp_quit( session );
643free_mem_session: 665free_mem_session:
644 mailsmtp_free( session ); 666 mailsmtp_free( session );
645free_mem: 667free_mem:
646 return result; 668 return result;
647} 669}
648 670
649void SMTPwrapper::sendMail(const Mail&mail,SMTPaccount*aSmtp,bool later ) { 671void SMTPwrapper::sendMail(const Mail&mail,SMTPaccount*aSmtp,bool later ) {
650 mailmime * mimeMail; 672 mailmime * mimeMail;
651 673
652 SMTPaccount *smtp = aSmtp; 674 SMTPaccount *smtp = aSmtp;
653 675
654 if (!later && !smtp) { 676 if (!later && !smtp) {
655 qDebug("Didn't get any send method - giving up"); 677 qDebug("Didn't get any send method - giving up");
656 return; 678 return;
657 } 679 }
658 mimeMail = createMimeMail(mail ); 680 mimeMail = createMimeMail(mail );
659 if ( mimeMail == NULL ) { 681 if ( mimeMail == NULL ) {
660 qDebug( "sendMail: error creating mime mail" ); 682 qDebug( "sendMail: error creating mime mail" );
661 } else { 683 } else {
662 sendProgress = new progressMailSend(); 684 sendProgress = new progressMailSend();
663 sendProgress->show(); 685 sendProgress->show();
664 sendProgress->setMaxMails(1); 686 sendProgress->setMaxMails(1);
665 smtpSend( mimeMail,later,smtp); 687 smtpSend( mimeMail,later,smtp);
666 qDebug("Clean up done"); 688 qDebug("Clean up done");
667 sendProgress->hide(); 689 sendProgress->hide();
668 delete sendProgress; 690 delete sendProgress;
669 sendProgress = 0; 691 sendProgress = 0;
670 mailmime_free( mimeMail ); 692 mailmime_free( mimeMail );
671 } 693 }
672} 694}
673 695
674int SMTPwrapper::sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which) { 696int SMTPwrapper::sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which) {
675 size_t curTok = 0; 697 size_t curTok = 0;
676 mailimf_fields *fields = 0; 698 mailimf_fields *fields = 0;
677 mailimf_field*ffrom = 0; 699 mailimf_field*ffrom = 0;
678 clist *rcpts = 0; 700 clist *rcpts = 0;
679 char*from = 0; 701 char*from = 0;
680 int res = 0; 702 int res = 0;
681 703
682 encodedString * data = wrap->fetchRawBody(*which); 704 encodedString * data = wrap->fetchRawBody(*which);
683 if (!data) 705 if (!data)
684 return 0; 706 return 0;
685 int err = mailimf_fields_parse( data->Content(), data->Length(), &curTok, &fields ); 707 int err = mailimf_fields_parse( data->Content(), data->Length(), &curTok, &fields );
686 if (err != MAILIMF_NO_ERROR) { 708 if (err != MAILIMF_NO_ERROR) {
687 delete data; 709 delete data;
688 delete wrap; 710 delete wrap;
689 return 0; 711 return 0;
690 } 712 }
691 713
692 rcpts = createRcptList( fields ); 714 rcpts = createRcptList( fields );
693 ffrom = getField(fields, MAILIMF_FIELD_FROM ); 715 ffrom = getField(fields, MAILIMF_FIELD_FROM );
694 from = getFrom(ffrom); 716 from = getFrom(ffrom);
695 717
696 if (rcpts && from) { 718 if (rcpts && from) {
697 res = smtpSend(from,rcpts,data->Content(),data->Length(),smtp ); 719 res = smtpSend(from,rcpts,data->Content(),data->Length(),smtp );
698 } 720 }
699 if (fields) { 721 if (fields) {
700 mailimf_fields_free(fields); 722 mailimf_fields_free(fields);
701 fields = 0; 723 fields = 0;
702 } 724 }
703 if (data) { 725 if (data) {
704 delete data; 726 delete data;
705 } 727 }
706 if (from) { 728 if (from) {
707 free(from); 729 free(from);
708 } 730 }
709 if (rcpts) { 731 if (rcpts) {
710 smtp_address_list_free( rcpts ); 732 smtp_address_list_free( rcpts );
711 } 733 }
712 return res; 734 return res;
713} 735}
714 736
715/* this is a special fun */ 737/* this is a special fun */
716bool SMTPwrapper::flushOutbox(SMTPaccount*smtp) { 738bool SMTPwrapper::flushOutbox(SMTPaccount*smtp) {
717 bool returnValue = true; 739 bool returnValue = true;
718 740
719 if (!smtp) 741 if (!smtp)
720 return false; 742 return false;
721 743
722 QString localfolders = AbstractMail::defaultLocalfolder(); 744 QString localfolders = AbstractMail::defaultLocalfolder();
723 AbstractMail*wrap = AbstractMail::getWrapper(localfolders); 745 AbstractMail*wrap = AbstractMail::getWrapper(localfolders);
724 if (!wrap) { 746 if (!wrap) {
725 qDebug("memory error"); 747 qDebug("memory error");
726 return false; 748 return false;
727 } 749 }
728 QList<RecMail> mailsToSend; 750 QList<RecMail> mailsToSend;
729 QList<RecMail> mailsToRemove; 751 QList<RecMail> mailsToRemove;
730 QString mbox("Outgoing"); 752 QString mbox("Outgoing");
731 wrap->listMessages(mbox,mailsToSend); 753 wrap->listMessages(mbox,mailsToSend);
732 if (mailsToSend.count()==0) { 754 if (mailsToSend.count()==0) {
733 delete wrap; 755 delete wrap;
734 return false; 756 return false;
735 } 757 }
736 mailsToSend.setAutoDelete(false); 758 mailsToSend.setAutoDelete(false);
737 sendProgress = new progressMailSend(); 759 sendProgress = new progressMailSend();
738 sendProgress->show(); 760 sendProgress->show();
739 sendProgress->setMaxMails(mailsToSend.count()); 761 sendProgress->setMaxMails(mailsToSend.count());
740 762
741 while (mailsToSend.count()>0) { 763 while (mailsToSend.count()>0) {
742 if (sendQueuedMail(wrap,smtp,mailsToSend.at(0))==0) { 764 if (sendQueuedMail(wrap,smtp,mailsToSend.at(0))==0) {
743 QMessageBox::critical(0,tr("Error sending mail"), 765 QMessageBox::critical(0,tr("Error sending mail"),
744 tr("Error sending queued mail - breaking")); 766 tr("Error sending queued mail - breaking"));
745 returnValue = false; 767 returnValue = false;
746 break; 768 break;
747 } 769 }
748 mailsToRemove.append(mailsToSend.at(0)); 770 mailsToRemove.append(mailsToSend.at(0));
749 mailsToSend.removeFirst(); 771 mailsToSend.removeFirst();
750 sendProgress->setCurrentMails(mailsToRemove.count()); 772 sendProgress->setCurrentMails(mailsToRemove.count());
751 } 773 }
752 Config cfg( "mail" ); 774 Config cfg( "mail" );
753 cfg.setGroup( "Status" ); 775 cfg.setGroup( "Status" );
754 m_queuedMail = 0; 776 m_queuedMail = 0;
755 cfg.writeEntry( "outgoing", m_queuedMail ); 777 cfg.writeEntry( "outgoing", m_queuedMail );
756 emit queuedMails( m_queuedMail ); 778 emit queuedMails( m_queuedMail );
757 sendProgress->hide(); 779 sendProgress->hide();
758 delete sendProgress; 780 delete sendProgress;
759 sendProgress = 0; 781 sendProgress = 0;
760 wrap->deleteMails(mbox,mailsToRemove); 782 wrap->deleteMails(mbox,mailsToRemove);
761 mailsToSend.setAutoDelete(true); 783 mailsToSend.setAutoDelete(true);
762 delete wrap; 784 delete wrap;
763 return returnValue; 785 return returnValue;
764} 786}
diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.h b/noncore/net/mail/libmailwrapper/smtpwrapper.h
index 7dcdbfd..89826d9 100644
--- a/noncore/net/mail/libmailwrapper/smtpwrapper.h
+++ b/noncore/net/mail/libmailwrapper/smtpwrapper.h
@@ -1,72 +1,73 @@
1#ifndef SMTPwrapper_H 1#ifndef SMTPwrapper_H
2#define SMTPwrapper_H 2#define SMTPwrapper_H
3 3
4#include <qpe/applnk.h> 4#include <qpe/applnk.h>
5 5
6#include <qbitarray.h> 6#include <qbitarray.h>
7#include <qdatetime.h> 7#include <qdatetime.h>
8#include <libetpan/clist.h> 8#include <libetpan/clist.h>
9 9
10#include "settings.h" 10#include "settings.h"
11 11
12class Mail; 12class Mail;
13class AbstractMail; 13class AbstractMail;
14class RecMail; 14class RecMail;
15class Attachment; 15class Attachment;
16struct mailimf_fields; 16struct mailimf_fields;
17struct mailimf_field; 17struct mailimf_field;
18struct mailimf_mailbox; 18struct mailimf_mailbox;
19struct mailmime; 19struct mailmime;
20struct mailimf_address_list; 20struct mailimf_address_list;
21class progressMailSend; 21class progressMailSend;
22 22
23class SMTPwrapper : public QObject 23class SMTPwrapper : public QObject
24{ 24{
25 Q_OBJECT 25 Q_OBJECT
26 26
27public: 27public:
28 SMTPwrapper( Settings *s ); 28 SMTPwrapper( Settings *s );
29 virtual ~SMTPwrapper(){} 29 virtual ~SMTPwrapper(){}
30 void sendMail(const Mail& mail,SMTPaccount*smtp,bool later=false ); 30 void sendMail(const Mail& mail,SMTPaccount*smtp,bool later=false );
31 bool flushOutbox(SMTPaccount*smtp); 31 bool flushOutbox(SMTPaccount*smtp);
32 32
33 static progressMailSend*sendProgress; 33 static progressMailSend*sendProgress;
34 34
35signals: 35signals:
36 void queuedMails( int ); 36 void queuedMails( int );
37 37
38protected: 38protected:
39 mailimf_mailbox *newMailbox(const QString&name,const QString&mail ); 39 mailimf_mailbox *newMailbox(const QString&name,const QString&mail );
40 mailimf_fields *createImfFields(const Mail &mail ); 40 mailimf_fields *createImfFields(const Mail &mail );
41 mailmime *createMimeMail(const Mail&mail ); 41 mailmime *createMimeMail(const Mail&mail );
42 42
43 mailimf_address_list *parseAddresses(const QString&addr ); 43 mailimf_address_list *parseAddresses(const QString&addr );
44 void addFileParts( mailmime *message,const QList<Attachment>&files ); 44 void addFileParts( mailmime *message,const QList<Attachment>&files );
45 mailmime *buildTxtPart(const QString&str ); 45 mailmime *buildTxtPart(const QString&str );
46 mailmime *buildFilePart(const QString&filename,const QString&mimetype,const QString&content); 46 mailmime *buildFilePart(const QString&filename,const QString&mimetype,const QString&content);
47 void smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ); 47 void smtpSend( mailmime *mail,bool later, SMTPaccount *smtp );
48 clist *createRcptList( mailimf_fields *fields ); 48 clist *createRcptList( mailimf_fields *fields );
49 49
50 static void storeMail(const char*mail, size_t length, const QString&box); 50 static void storeMail(const char*mail, size_t length, const QString&box);
51 static QString mailsmtpError( int err ); 51 static QString mailsmtpError( int err );
52 static void progress( size_t current, size_t maximum ); 52 static void progress( size_t current, size_t maximum );
53 static void addRcpts( clist *list, mailimf_address_list *addr_list ); 53 static void addRcpts( clist *list, mailimf_address_list *addr_list );
54 static char *getFrom( mailmime *mail ); 54 static char *getFrom( mailmime *mail );
55 static char *getFrom( mailimf_field *ffrom); 55 static char *getFrom( mailimf_field *ffrom);
56 static mailimf_field *getField( mailimf_fields *fields, int type ); 56 static mailimf_field *getField( mailimf_fields *fields, int type );
57 int smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ); 57 int smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp );
58 58
59 void storeMail(mailmime*mail, const QString&box); 59 void storeMail(mailmime*mail, const QString&box);
60 Settings *settings; 60 Settings *settings;
61 61
62 int sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which); 62 int sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which);
63 void storeFailedMail(const char*data,unsigned int size, const char*failuremessage);
63 64
64 int m_queuedMail; 65 int m_queuedMail;
65 static const char* USER_AGENT; 66 static const char* USER_AGENT;
66 67
67protected slots: 68protected slots:
68 void emitQCop( int queued ); 69 void emitQCop( int queued );
69 70
70}; 71};
71 72
72#endif 73#endif