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