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