Diffstat (limited to 'noncore/net/mail/libmailwrapper/smtpwrapper.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/net/mail/libmailwrapper/smtpwrapper.cpp | 206 |
1 files changed, 121 insertions, 85 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 @@ const char* SMTPwrapper::USER_AGENT="OpieMail v0.3"; progressMailSend*SMTPwrapper::sendProgress = 0; SMTPwrapper::SMTPwrapper( Settings *s ) - : QObject() -{ +: QObject() { settings = s; Config cfg( "mail" ); cfg.setGroup( "Status" ); m_queuedMail = cfg.readNumEntry( "outgoing", 0 ); emit queuedMails( m_queuedMail ); connect( this, SIGNAL( queuedMails( int ) ), this, SLOT( emitQCop( int ) ) ); @@ -37,14 +36,13 @@ SMTPwrapper::SMTPwrapper( Settings *s ) void SMTPwrapper::emitQCop( int queued ) { QCopEnvelope env( "QPE/Pim", "outgoingMails(int)" ); env << queued; } -QString SMTPwrapper::mailsmtpError( int errnum ) -{ +QString SMTPwrapper::mailsmtpError( int errnum ) { switch ( errnum ) { case MAILSMTP_NO_ERROR: return tr( "No error" ); case MAILSMTP_ERROR_UNEXPECTED_CODE: return tr( "Unexpected error code" ); case MAILSMTP_ERROR_SERVICE_NOT_AVAILABLE: @@ -79,23 +77,22 @@ QString SMTPwrapper::mailsmtpError( int errnum ) return tr( "Connection refused" ); default: return tr( "Unknown error code" ); } } -mailimf_mailbox *SMTPwrapper::newMailbox(const QString&name, const QString&mail ) -{ +mailimf_mailbox *SMTPwrapper::newMailbox(const QString&name, const QString&mail ) { return mailimf_mailbox_new( strdup( name.latin1() ), strdup( mail.latin1() ) ); } -mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr ) -{ +mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr ) { mailimf_address_list *addresses; - if ( addr.isEmpty() ) return NULL; + if ( addr.isEmpty() ) + return NULL; addresses = mailimf_address_list_new_empty(); bool literal_open = false; unsigned int startpos = 0; QStringList list; @@ -136,102 +133,123 @@ mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr ) qDebug( "Parse success! %s",(*it).latin1()); } } return addresses; } -mailimf_fields *SMTPwrapper::createImfFields(const Mail&mail ) -{ +mailimf_fields *SMTPwrapper::createImfFields(const Mail&mail ) { mailimf_fields *fields; mailimf_field *xmailer; mailimf_mailbox *sender=0,*fromBox=0; mailimf_mailbox_list *from=0; mailimf_address_list *to=0, *cc=0, *bcc=0, *reply=0; char *subject = strdup( mail.getSubject().latin1() ); int err; sender = newMailbox( mail.getName(), mail.getMail() ); - if ( sender == NULL ) goto err_free; + if ( sender == NULL ) + goto err_free; fromBox = newMailbox( mail.getName(), mail.getMail() ); - if ( fromBox == NULL ) goto err_free_sender; + if ( fromBox == NULL ) + goto err_free_sender; from = mailimf_mailbox_list_new_empty(); - if ( from == NULL ) goto err_free_fromBox; + if ( from == NULL ) + goto err_free_fromBox; err = mailimf_mailbox_list_add( from, fromBox ); - if ( err != MAILIMF_NO_ERROR ) goto err_free_from; + if ( err != MAILIMF_NO_ERROR ) + goto err_free_from; to = parseAddresses( mail.getTo() ); - if ( to == NULL ) goto err_free_from; + if ( to == NULL ) + goto err_free_from; cc = parseAddresses( mail.getCC() ); bcc = parseAddresses( mail.getBCC() ); reply = parseAddresses( mail.getReply() ); fields = mailimf_fields_new_with_data( from, sender, reply, to, cc, bcc, NULL, NULL, subject ); - if ( fields == NULL ) goto err_free_reply; + if ( fields == NULL ) + goto err_free_reply; xmailer = mailimf_field_new_custom( strdup( "User-Agent" ), strdup( USER_AGENT ) ); - if ( xmailer == NULL ) goto err_free_fields; + if ( xmailer == NULL ) + goto err_free_fields; err = mailimf_fields_add( fields, xmailer ); - if ( err != MAILIMF_NO_ERROR ) goto err_free_xmailer; + if ( err != MAILIMF_NO_ERROR ) + goto err_free_xmailer; return fields; // Success :) err_free_xmailer: - if (xmailer) mailimf_field_free( xmailer ); + if (xmailer) + mailimf_field_free( xmailer ); err_free_fields: - if (fields) mailimf_fields_free( fields ); + if (fields) + mailimf_fields_free( fields ); err_free_reply: - if (reply) mailimf_address_list_free( reply ); - if (bcc) mailimf_address_list_free( bcc ); - if (cc) mailimf_address_list_free( cc ); - if (to) mailimf_address_list_free( to ); + if (reply) + mailimf_address_list_free( reply ); + if (bcc) + mailimf_address_list_free( bcc ); + if (cc) + mailimf_address_list_free( cc ); + if (to) + mailimf_address_list_free( to ); err_free_from: - if (from) mailimf_mailbox_list_free( from ); + if (from) + mailimf_mailbox_list_free( from ); err_free_fromBox: mailimf_mailbox_free( fromBox ); err_free_sender: - if (sender) mailimf_mailbox_free( sender ); + if (sender) + mailimf_mailbox_free( sender ); err_free: - if (subject) free( subject ); + if (subject) + free( subject ); qDebug( "createImfFields - error" ); return NULL; // Error :( } -mailmime *SMTPwrapper::buildTxtPart(const QString&str ) -{ +mailmime *SMTPwrapper::buildTxtPart(const QString&str ) { mailmime *txtPart; mailmime_fields *fields; mailmime_content *content; mailmime_parameter *param; int err; param = mailmime_parameter_new( strdup( "charset" ), strdup( "iso-8859-1" ) ); - if ( param == NULL ) goto err_free; + if ( param == NULL ) + goto err_free; content = mailmime_content_new_with_str( "text/plain" ); - if ( content == NULL ) goto err_free_param; + if ( content == NULL ) + goto err_free_param; err = clist_append( content->ct_parameters, param ); - if ( err != MAILIMF_NO_ERROR ) goto err_free_content; + if ( err != MAILIMF_NO_ERROR ) + goto err_free_content; fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_8BIT); - if ( fields == NULL ) goto err_free_content; + if ( fields == NULL ) + goto err_free_content; txtPart = mailmime_new_empty( content, fields ); - if ( txtPart == NULL ) goto err_free_fields; + if ( txtPart == NULL ) + goto err_free_fields; err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() ); - if ( err != MAILIMF_NO_ERROR ) goto err_free_txtPart; + if ( err != MAILIMF_NO_ERROR ) + goto err_free_txtPart; return txtPart; // Success :) err_free_txtPart: mailmime_free( txtPart ); err_free_fields: @@ -243,14 +261,13 @@ err_free_param: err_free: qDebug( "buildTxtPart - error" ); return NULL; // Error :( } -mailmime *SMTPwrapper::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) -{ +mailmime *SMTPwrapper::buildFilePart(const QString&filename,const QString&mimetype,const QString&TextContent ) { mailmime * filePart = 0; mailmime_fields * fields = 0; mailmime_content * content = 0; mailmime_parameter * param = 0; char*name = 0; char*file = 0; @@ -322,14 +339,13 @@ mailmime *SMTPwrapper::buildFilePart(const QString&filename,const QString&mimety } } return filePart; // Success :) } -void SMTPwrapper::addFileParts( mailmime *message,const QList<Attachment>&files ) -{ +void SMTPwrapper::addFileParts( mailmime *message,const QList<Attachment>&files ) { const Attachment *it; unsigned int count = files.count(); qDebug("List contains %i values",count); for ( unsigned int i = 0; i < count; ++i ) { qDebug( "Adding file" ); mailmime *filePart; @@ -347,32 +363,35 @@ void SMTPwrapper::addFileParts( mailmime *message,const QList<Attachment>&files mailmime_free( filePart ); qDebug("error smart add"); } } } -mailmime *SMTPwrapper::createMimeMail(const Mail &mail ) -{ +mailmime *SMTPwrapper::createMimeMail(const Mail &mail ) { mailmime *message, *txtPart; mailimf_fields *fields; int err; fields = createImfFields( mail ); - if ( fields == NULL ) goto err_free; + if ( fields == NULL ) + goto err_free; message = mailmime_new_message_data( NULL ); - if ( message == NULL ) goto err_free_fields; + if ( message == NULL ) + goto err_free_fields; mailmime_set_imf_fields( message, fields ); txtPart = buildTxtPart( mail.getMessage() ); - if ( txtPart == NULL ) goto err_free_message; + if ( txtPart == NULL ) + goto err_free_message; err = mailmime_smart_add_part( message, txtPart ); - if ( err != MAILIMF_NO_ERROR ) goto err_free_txtPart; + if ( err != MAILIMF_NO_ERROR ) + goto err_free_txtPart; addFileParts( message, mail.getAttachments() ); return message; // Success :) err_free_txtPart: @@ -384,14 +403,13 @@ err_free_fields: err_free: qDebug( "createMimeMail: error" ); return NULL; // Error :( } -mailimf_field *SMTPwrapper::getField( mailimf_fields *fields, int type ) -{ +mailimf_field *SMTPwrapper::getField( mailimf_fields *fields, int type ) { mailimf_field *field; clistiter *it; it = clist_begin( fields->fld_list ); while ( it ) { field = (mailimf_field *) it->data; @@ -401,14 +419,13 @@ mailimf_field *SMTPwrapper::getField( mailimf_fields *fields, int type ) it = it->next; } return NULL; } -void SMTPwrapper::addRcpts( clist *list, mailimf_address_list *addr_list ) -{ +void SMTPwrapper::addRcpts( clist *list, mailimf_address_list *addr_list ) { clistiter *it, *it2; for ( it = clist_begin( addr_list->ad_list ); it; it = it->next ) { mailimf_address *addr; addr = (mailimf_address *) it->data; @@ -422,14 +439,13 @@ void SMTPwrapper::addRcpts( clist *list, mailimf_address_list *addr_list ) esmtp_address_list_add( list, mbox->mb_addr_spec, 0, NULL ); } } } } -clist *SMTPwrapper::createRcptList( mailimf_fields *fields ) -{ +clist *SMTPwrapper::createRcptList( mailimf_fields *fields ) { clist *rcptList; mailimf_field *field; rcptList = esmtp_address_list_new(); field = getField( fields, MAILIMF_FIELD_TO ); @@ -450,14 +466,13 @@ clist *SMTPwrapper::createRcptList( mailimf_fields *fields ) addRcpts( rcptList, field->fld_data.fld_bcc->bcc_addr_list ); } return rcptList; } -char *SMTPwrapper::getFrom( mailimf_field *ffrom) -{ +char *SMTPwrapper::getFrom( mailimf_field *ffrom) { char *from = NULL; if ( ffrom && (ffrom->fld_type == MAILIMF_FIELD_FROM) && ffrom->fld_data.fld_from->frm_mb_list && ffrom->fld_data.fld_from->frm_mb_list->mb_list ) { clist *cl = ffrom->fld_data.fld_from->frm_mb_list->mb_list; clistiter *it; for ( it = clist_begin( cl ); it; it = it->next ) { @@ -466,40 +481,37 @@ char *SMTPwrapper::getFrom( mailimf_field *ffrom) } } return from; } -char *SMTPwrapper::getFrom( mailmime *mail ) -{ +char *SMTPwrapper::getFrom( mailmime *mail ) { /* no need to delete - its just a pointer to structure content */ mailimf_field *ffrom = 0; ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM ); return getFrom(ffrom); } -void SMTPwrapper::progress( size_t current, size_t maximum ) -{ +void SMTPwrapper::progress( size_t current, size_t maximum ) { if (SMTPwrapper::sendProgress) { SMTPwrapper::sendProgress->setSingleMail(current, maximum ); qApp->processEvents(); } } -void SMTPwrapper::storeMail(const char*mail, size_t length, const QString&box) -{ - if (!mail) return; +void SMTPwrapper::storeMail(const char*mail, size_t length, const QString&box) { + if (!mail) + return; QString localfolders = AbstractMail::defaultLocalfolder(); AbstractMail*wrap = AbstractMail::getWrapper(localfolders); wrap->createMbox(box); wrap->storeMessage(mail,length,box); delete wrap; } -void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ) -{ +void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ) { clist *rcpts = 0; char *from, *data; size_t size; if ( smtp == NULL ) { return; @@ -510,63 +522,85 @@ void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp ) msg = mime_message_init(mail); mime_message_set_tmpdir(msg,getenv( "HOME" )); int r = mailmessage_fetch(msg,&data,&size); mime_message_detach_mime(msg); mailmessage_free(msg); if (r != MAIL_NO_ERROR || !data) { - if (data) free(data); + if (data) + free(data); qDebug("Error fetching mime..."); return; } msg = 0; if (later) { storeMail(data,size,"Outgoing"); - if (data) free( data ); + if (data) + free( data ); Config cfg( "mail" ); cfg.setGroup( "Status" ); cfg.writeEntry( "outgoing", ++m_queuedMail ); emit queuedMails( m_queuedMail ); return; } from = getFrom( mail ); rcpts = createRcptList( mail->mm_data.mm_message.mm_fields ); smtpSend(from,rcpts,data,size,smtp); - if (data) {free(data);} - if (from) {free(from);} - if (rcpts) smtp_address_list_free( rcpts ); + if (data) { + free(data); + } + if (from) { + free(from); + } + if (rcpts) + smtp_address_list_free( rcpts ); } -int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ) -{ +int SMTPwrapper::smtpSend(char*from,clist*rcpts,const char*data,size_t size, SMTPaccount *smtp ) { const char *server, *user, *pass; bool ssl; uint16_t port; mailsmtp *session; int err,result; result = 1; server = user = pass = 0; server = smtp->getServer().latin1(); - ssl = smtp->getSSL(); + + // FIXME: currently only TLS and Plain work. + + ssl = false; + + if ( smtp->ConnectionType() == 2 ) { + ssl = true; + } + port = smtp->getPort().toUInt(); session = mailsmtp_new( 20, &progress ); - if ( session == NULL ) goto free_mem; + if ( session == NULL ) + goto free_mem; qDebug( "Servername %s at port %i", server, port ); if ( ssl ) { qDebug( "SSL session" ); err = mailsmtp_ssl_connect( session, server, port ); } else { qDebug( "No SSL session" ); err = mailsmtp_socket_connect( session, server, port ); } - if ( err != MAILSMTP_NO_ERROR ) {qDebug("Error init connection");result = 0;goto free_mem_session;} + if ( err != MAILSMTP_NO_ERROR ) { + qDebug("Error init connection"); + result = 0; + goto free_mem_session; + } err = mailsmtp_init( session ); - if ( err != MAILSMTP_NO_ERROR ) {result = 0; goto free_con_session;} + if ( err != MAILSMTP_NO_ERROR ) { + result = 0; + goto free_con_session; + } qDebug( "INIT OK" ); if ( smtp->getLogin() ) { qDebug("smtp with auth"); 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 login.show(); if ( QDialog::Accepted == login.exec() ) { // ok user = login.getUser().latin1(); pass = login.getPassword().latin1(); } else { - result = 0; goto free_con_session; + result = 0; + goto free_con_session; } } else { user = smtp->getUser().latin1(); pass = smtp->getPassword().latin1(); } qDebug( "session->auth: %i", session->auth); err = mailsmtp_auth( session, (char*)user, (char*)pass ); - if ( err == MAILSMTP_NO_ERROR ) qDebug("auth ok"); + if ( err == MAILSMTP_NO_ERROR ) + qDebug("auth ok"); qDebug( "Done auth!" ); } else { qDebug("SMTP without auth"); } err = mailsmtp_send( session, from, rcpts, data, size ); if ( err != MAILSMTP_NO_ERROR ) { qDebug("Error sending mail: %s",mailsmtpError(err).latin1()); - result = 0; goto free_con_session; + result = 0; + goto free_con_session; } qDebug( "Mail sent." ); storeMail(data,size,"Sent"); free_con_session: @@ -606,14 +643,13 @@ free_con_session: free_mem_session: mailsmtp_free( session ); free_mem: return result; } -void SMTPwrapper::sendMail(const Mail&mail,SMTPaccount*aSmtp,bool later ) -{ +void SMTPwrapper::sendMail(const Mail&mail,SMTPaccount*aSmtp,bool later ) { mailmime * mimeMail; SMTPaccount *smtp = aSmtp; if (!later && !smtp) { qDebug("Didn't get any send method - giving up"); @@ -632,23 +668,23 @@ void SMTPwrapper::sendMail(const Mail&mail,SMTPaccount*aSmtp,bool later ) delete sendProgress; sendProgress = 0; mailmime_free( mimeMail ); } } -int SMTPwrapper::sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which) -{ +int SMTPwrapper::sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which) { size_t curTok = 0; mailimf_fields *fields = 0; mailimf_field*ffrom = 0; clist *rcpts = 0; char*from = 0; int res = 0; encodedString * data = wrap->fetchRawBody(*which); - if (!data) return 0; + if (!data) + return 0; int err = mailimf_fields_parse( data->Content(), data->Length(), &curTok, &fields ); if (err != MAILIMF_NO_ERROR) { delete data; delete wrap; return 0; } @@ -674,17 +710,17 @@ int SMTPwrapper::sendQueuedMail(AbstractMail*wrap,SMTPaccount*smtp,RecMail*which smtp_address_list_free( rcpts ); } return res; } /* this is a special fun */ -bool SMTPwrapper::flushOutbox(SMTPaccount*smtp) -{ +bool SMTPwrapper::flushOutbox(SMTPaccount*smtp) { bool returnValue = true; - if (!smtp) return false; + if (!smtp) + return false; QString localfolders = AbstractMail::defaultLocalfolder(); AbstractMail*wrap = AbstractMail::getWrapper(localfolders); if (!wrap) { qDebug("memory error"); return false; |