summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-25 14:23:31 (UTC)
committer alwin <alwin>2003-12-25 14:23:31 (UTC)
commit25ee009ceeda1a175c4604bf5afe5434e52ee838 (patch) (side-by-side diff)
treeccc6b8cfbfac74880e9bebc5be595384ccf731e9
parente0b1bc403c2792dff3aa04a00eaf58b9defc6dac (diff)
downloadopie-25ee009ceeda1a175c4604bf5afe5434e52ee838.zip
opie-25ee009ceeda1a175c4604bf5afe5434e52ee838.tar.gz
opie-25ee009ceeda1a175c4604bf5afe5434e52ee838.tar.bz2
- some memleaks
- content generation will use the libetpan code und not own dumping to a tmpfile. - bugfix while creating mails with attachments (message itself could be corrupted) - textpart will always encoded quoted-printable
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.cpp114
-rw-r--r--noncore/net/mail/libmailwrapper/smtpwrapper.h3
-rw-r--r--noncore/net/mail/smtpwrapper.cpp114
-rw-r--r--noncore/net/mail/smtpwrapper.h3
4 files changed, 52 insertions, 182 deletions
diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
index 285561c..521cd0a 100644
--- a/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/smtpwrapper.cpp
@@ -104,30 +104,28 @@ mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr )
break;
default:
break;
}
}
s = addr.mid(startpos,i-startpos);
if (!s.isEmpty()) {
list.append(s);
qDebug("Appended %s",s.latin1());
}
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); it++ ) {
- char *str = strdup( (*it).latin1() );
- int err = mailimf_address_list_add_parse( addresses, str );
+ int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() );
if ( err != MAILIMF_NO_ERROR ) {
qDebug( "Error parsing" );
qDebug( *it );
- free( str );
} else {
qDebug( "Parse success! %s",(*it).latin1());
}
}
return addresses;
}
mailimf_fields *SMTPwrapper::createImfFields(const Mail&mail )
{
mailimf_fields *fields;
mailimf_field *xmailer;
mailimf_mailbox *sender, *fromBox;
@@ -187,132 +185,124 @@ err_free:
free( subject );
qDebug( "createImfFields - error" );
return NULL; // Error :(
}
mailmime *SMTPwrapper::buildTxtPart(const QString&str )
{
mailmime *txtPart;
mailmime_fields *fields;
mailmime_content *content;
mailmime_parameter *param;
- char *txt = strdup( str.latin1() );
int err;
param = mailmime_parameter_new( strdup( "charset" ),
strdup( "iso-8859-1" ) );
if ( param == NULL ) goto err_free;
content = mailmime_content_new_with_str( "text/plain" );
if ( content == NULL ) goto err_free_param;
err = clist_append( content->ct_parameters, param );
if ( err != MAILIMF_NO_ERROR ) goto err_free_content;
- fields = mailmime_fields_new_encoding( MAILMIME_MECHANISM_8BIT );
+ fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_QUOTED_PRINTABLE);
if ( fields == NULL ) goto err_free_content;
txtPart = mailmime_new_empty( content, fields );
if ( txtPart == NULL ) goto err_free_fields;
- err = mailmime_set_body_text( txtPart, txt, strlen( txt ) );
+ err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() );
if ( err != MAILIMF_NO_ERROR ) goto err_free_txtPart;
return txtPart; // Success :)
err_free_txtPart:
mailmime_free( txtPart );
err_free_fields:
mailmime_fields_free( fields );
err_free_content:
mailmime_content_free( content );
err_free_param:
mailmime_parameter_free( param );
err_free:
- free( txt );
qDebug( "buildTxtPart - error" );
return NULL; // Error :(
}
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;
int err;
int pos = filename.findRev( '/' );
if (filename.length()>0) {
QString tmp = filename.right( filename.length() - ( pos + 1 ) );
name = strdup( tmp.latin1() ); // just filename
file = strdup( filename.latin1() ); // full name with path
}
- char *mime = strdup( mimetype.latin1() ); // mimetype -e.g. text/plain
-
+
int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT;
int mechanism = MAILMIME_MECHANISM_BASE64;
if ( mimetype.startsWith( "text/" ) ) {
param = mailmime_parameter_new( strdup( "charset" ),
strdup( "iso-8859-1" ) );
- disptype = MAILMIME_DISPOSITION_TYPE_INLINE;
mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE;
}
fields = mailmime_fields_new_filename(
disptype, name,
mechanism );
- content = mailmime_content_new_with_str( mime );
+ content = mailmime_content_new_with_str( (char*)mimetype.latin1() );
if (content!=0 && fields != 0) {
if (param) {
clist_append(content->ct_parameters,param);
param = 0;
}
if (filename.length()>0) {
QFileInfo f(filename);
param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1()));
clist_append(content->ct_parameters,param);
param = 0;
}
filePart = mailmime_new_empty( content, fields );
}
if (filePart) {
if (filename.length()>0) {
err = mailmime_set_body_file( filePart, file );
} else {
- err = mailmime_set_body_text(filePart,strdup(TextContent.ascii()),TextContent.length());
+ err = mailmime_set_body_text(filePart,strdup(TextContent.data()),TextContent.length());
}
if (err != MAILIMF_NO_ERROR) {
qDebug("Error setting body with file %s",file);
mailmime_free( filePart );
filePart = 0;
}
}
if (!filePart) {
if ( param != NULL ) {
mailmime_parameter_free( param );
}
if (content) {
mailmime_content_free( content );
- } else {
- if (mime) {
- free( mime );
- }
}
if (fields) {
mailmime_fields_free( fields );
} else {
if (name) {
free( name );
}
if (file) {
free( file );
}
}
}
@@ -350,29 +340,26 @@ mailmime *SMTPwrapper::createMimeMail(const Mail &mail )
mailmime *message, *txtPart;
mailimf_fields *fields;
int err;
fields = createImfFields( mail );
if ( fields == NULL ) goto err_free;
message = mailmime_new_message_data( NULL );
if ( message == NULL ) goto err_free_fields;
mailmime_set_imf_fields( message, fields );
- if (mail.getAttachments().count()==0) {
- txtPart = buildTxtPart( mail.getMessage() );
- } else {
- txtPart = buildFilePart("","text/plain",mail.getMessage());
- }
+ txtPart = buildTxtPart( mail.getMessage() );
+
if ( txtPart == NULL ) goto err_free_message;
err = mailmime_smart_add_part( message, txtPart );
if ( err != MAILIMF_NO_ERROR ) goto err_free_txtPart;
addFileParts( message, mail.getAttachments() );
return message; // Success :)
err_free_txtPart:
mailmime_free( txtPart );
err_free_message:
@@ -462,104 +449,48 @@ char *SMTPwrapper::getFrom( mailimf_field *ffrom)
mailimf_mailbox *mb = (mailimf_mailbox *) it->data;
from = strdup( mb->mb_addr_spec );
}
}
return from;
}
char *SMTPwrapper::getFrom( mailmime *mail )
{
/* no need to delete - its just a pointer to structure content */
mailimf_field *ffrom = 0;
- char*f = 0;
ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM );
return getFrom(ffrom);
}
SMTPaccount *SMTPwrapper::getAccount(const QString&name )
{
SMTPaccount *smtp;
QList<Account> list = settings->getAccounts();
Account *it;
for ( it = list.first(); it; it = list.next() ) {
if ( it->getType().compare( "SMTP" ) == 0 ) {
smtp = static_cast<SMTPaccount *>(it);
if ( smtp->getName()== name ) {
qDebug( "SMTPaccount found for" );
qDebug( name );
return smtp;
}
}
}
return NULL;
}
-QString SMTPwrapper::getTmpFile() {
- int num = 0;
- QString unique;
-
- QDir dir( "/tmp" );
-
- QStringList list = dir.entryList( "opiemail-tmp-*" );
-
- do {
- unique.setNum( num++ );
- } while ( list.contains( "opiemail-tmp-" + unique ) > 0 );
-
- return "/tmp/opiemail-tmp-" + unique;
-}
-
-void SMTPwrapper::writeToFile(const QString&file, mailmime *mail )
-{
- FILE *f;
- int err, col = 0;
-
- f = fopen( file.latin1(), "w" );
- if ( f == NULL ) {
- qDebug( "writeToFile: error opening file" );
- return;
- }
-
- err = mailmime_write( f, &col, mail );
- if ( err != MAILIMF_NO_ERROR ) {
- fclose( f );
- qDebug( "writeToFile: error writing mailmime" );
- return;
- }
-
- fclose( f );
-}
-
-void SMTPwrapper::readFromFile(const QString&file, char **data, size_t *size )
-{
-
- QFile msg_cache(file);
- QString msg = "";
- msg_cache.open(IO_ReadOnly);
- char*message = new char[4096];
- memset(message,0,4096);
- while (msg_cache.readBlock(message,4095)>0) {
- msg+=message;
- memset(message,0,4096);
- }
- delete message;
- *data = (char*)malloc(msg.length()+1*sizeof(char));
- memset(*data,0,msg.length()+1);
- memcpy(*data,msg.ascii(),msg.length());
- *size=msg.length();
-}
-
void SMTPwrapper::progress( size_t current, size_t maximum )
{
if (SMTPwrapper::sendProgress) {
SMTPwrapper::sendProgress->setSingleMail(current, maximum );
qApp->processEvents();
}
}
void SMTPwrapper::storeMail(char*mail, size_t length, const QString&box)
{
if (!mail) return;
QString localfolders = (QString) getenv( "HOME" ) + QString("/Applications/opiemail/localmail/");
@@ -569,33 +500,41 @@ void SMTPwrapper::storeMail(char*mail, size_t length, const QString&box)
}
void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp )
{
clist *rcpts = 0;
char *from, *data;
size_t size;
if ( smtp == NULL ) {
return;
}
from = data = 0;
-
- QString file = getTmpFile();
- writeToFile( file, mail );
- readFromFile( file, &data, &size );
- QFile f( file );
- f.remove();
-
+
+ mailmessage * msg = 0;
+ 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);
+ qDebug("Error fetching mime...");
+ return;
+ }
+ QString tmp = data;
+ tmp.replace(QRegExp("\r+",true,false),"");
+ msg = 0;
if (later) {
- storeMail(data,size,"Outgoing");
+ storeMail((char*)tmp.data(),tmp.length(),"Outgoing");
if (data) free( data );
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 );
}
int SMTPwrapper::smtpSend(char*from,clist*rcpts,char*data,size_t size, SMTPaccount *smtp )
@@ -679,29 +618,29 @@ void SMTPwrapper::sendMail(const Mail&mail,bool later )
mailmime * mimeMail;
SMTPaccount *smtp = getAccount(mail.getName());
mimeMail = createMimeMail(mail );
if ( mimeMail == NULL ) {
qDebug( "sendMail: error creating mime mail" );
} else {
sendProgress = new progressMailSend();
sendProgress->show();
sendProgress->setMaxMails(1);
smtpSend( mimeMail,later,smtp);
- mailmime_free( mimeMail );
qDebug("Clean up done");
sendProgress->hide();
delete sendProgress;
sendProgress = 0;
+ mailmime_free( mimeMail );
}
}
int SMTPwrapper::sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which)
{
char*data = 0;
size_t length = 0;
size_t curTok = 0;
mailimf_fields *fields = 0;
mailimf_field*ffrom = 0;
clist *rcpts = 0;
char*from = 0;
@@ -738,48 +677,47 @@ int SMTPwrapper::sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which)
smtp_address_list_free( rcpts );
}
return res;
}
/* this is a special fun */
bool SMTPwrapper::flushOutbox(SMTPaccount*smtp)
{
bool returnValue = true;
if (!smtp) return false;
- QString localfolders = (QString) getenv( "HOME" ) + QString("/Applications/opiemail/localmail/");
+ QString localfolders = (QString) getenv( "HOME" ) + QString("/Applications/opiemail/localmail/");
MBOXwrapper*wrap = new MBOXwrapper(localfolders);
if (!wrap) {
qDebug("memory error");
return false;
}
QList<RecMail> mailsToSend;
QList<RecMail> mailsToRemove;
QString mbox("Outgoing");
wrap->listMessages(mbox,mailsToSend);
if (mailsToSend.count()==0) {
delete wrap;
return false;
}
mailsToSend.setAutoDelete(false);
sendProgress = new progressMailSend();
sendProgress->show();
sendProgress->setMaxMails(mailsToSend.count());
while (mailsToSend.count()>0) {
if (sendQueuedMail(wrap,smtp,mailsToSend.at(0))==0) {
QMessageBox::critical(0,tr("Error sending mail"),
tr("Error sending queued mail - breaking"));
-
returnValue = false;
break;
}
mailsToRemove.append(mailsToSend.at(0));
mailsToSend.removeFirst();
sendProgress->setCurrentMails(mailsToRemove.count());
}
sendProgress->hide();
delete sendProgress;
sendProgress = 0;
wrap->deleteMails(mbox,mailsToRemove);
mailsToSend.setAutoDelete(true);
diff --git a/noncore/net/mail/libmailwrapper/smtpwrapper.h b/noncore/net/mail/libmailwrapper/smtpwrapper.h
index 66180b7..f734fa4 100644
--- a/noncore/net/mail/libmailwrapper/smtpwrapper.h
+++ b/noncore/net/mail/libmailwrapper/smtpwrapper.h
@@ -34,30 +34,27 @@ public:
protected:
mailimf_mailbox *newMailbox(const QString&name,const QString&mail );
mailimf_fields *createImfFields(const Mail &mail );
mailmime *createMimeMail(const Mail&mail );
mailimf_address_list *parseAddresses(const QString&addr );
void addFileParts( mailmime *message,const QList<Attachment>&files );
mailmime *buildTxtPart(const QString&str );
mailmime *buildFilePart(const QString&filename,const QString&mimetype,const QString&content);
void smtpSend( mailmime *mail,bool later, SMTPaccount *smtp );
clist *createRcptList( mailimf_fields *fields );
SMTPaccount *getAccount(const QString&from );
- void writeToFile(const QString&file, mailmime *mail );
- void readFromFile(const QString&file, char **data, size_t *size );
static void storeMail(char*mail, size_t length, const QString&box);
static QString mailsmtpError( int err );
- static QString getTmpFile();
static void progress( size_t current, size_t maximum );
static void addRcpts( clist *list, mailimf_address_list *addr_list );
static char *getFrom( mailmime *mail );
static char *getFrom( mailimf_field *ffrom);
static mailimf_field *getField( mailimf_fields *fields, int type );
int smtpSend(char*from,clist*rcpts,char*data,size_t size, SMTPaccount *smtp );
void storeMail(mailmime*mail, const QString&box);
Settings *settings;
int sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which);
};
diff --git a/noncore/net/mail/smtpwrapper.cpp b/noncore/net/mail/smtpwrapper.cpp
index 285561c..521cd0a 100644
--- a/noncore/net/mail/smtpwrapper.cpp
+++ b/noncore/net/mail/smtpwrapper.cpp
@@ -104,30 +104,28 @@ mailimf_address_list *SMTPwrapper::parseAddresses(const QString&addr )
break;
default:
break;
}
}
s = addr.mid(startpos,i-startpos);
if (!s.isEmpty()) {
list.append(s);
qDebug("Appended %s",s.latin1());
}
QStringList::Iterator it;
for ( it = list.begin(); it != list.end(); it++ ) {
- char *str = strdup( (*it).latin1() );
- int err = mailimf_address_list_add_parse( addresses, str );
+ int err = mailimf_address_list_add_parse( addresses, (char*)(*it).latin1() );
if ( err != MAILIMF_NO_ERROR ) {
qDebug( "Error parsing" );
qDebug( *it );
- free( str );
} else {
qDebug( "Parse success! %s",(*it).latin1());
}
}
return addresses;
}
mailimf_fields *SMTPwrapper::createImfFields(const Mail&mail )
{
mailimf_fields *fields;
mailimf_field *xmailer;
mailimf_mailbox *sender, *fromBox;
@@ -187,132 +185,124 @@ err_free:
free( subject );
qDebug( "createImfFields - error" );
return NULL; // Error :(
}
mailmime *SMTPwrapper::buildTxtPart(const QString&str )
{
mailmime *txtPart;
mailmime_fields *fields;
mailmime_content *content;
mailmime_parameter *param;
- char *txt = strdup( str.latin1() );
int err;
param = mailmime_parameter_new( strdup( "charset" ),
strdup( "iso-8859-1" ) );
if ( param == NULL ) goto err_free;
content = mailmime_content_new_with_str( "text/plain" );
if ( content == NULL ) goto err_free_param;
err = clist_append( content->ct_parameters, param );
if ( err != MAILIMF_NO_ERROR ) goto err_free_content;
- fields = mailmime_fields_new_encoding( MAILMIME_MECHANISM_8BIT );
+ fields = mailmime_fields_new_encoding(MAILMIME_MECHANISM_QUOTED_PRINTABLE);
if ( fields == NULL ) goto err_free_content;
txtPart = mailmime_new_empty( content, fields );
if ( txtPart == NULL ) goto err_free_fields;
- err = mailmime_set_body_text( txtPart, txt, strlen( txt ) );
+ err = mailmime_set_body_text( txtPart, (char*)str.data(), str.length() );
if ( err != MAILIMF_NO_ERROR ) goto err_free_txtPart;
return txtPart; // Success :)
err_free_txtPart:
mailmime_free( txtPart );
err_free_fields:
mailmime_fields_free( fields );
err_free_content:
mailmime_content_free( content );
err_free_param:
mailmime_parameter_free( param );
err_free:
- free( txt );
qDebug( "buildTxtPart - error" );
return NULL; // Error :(
}
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;
int err;
int pos = filename.findRev( '/' );
if (filename.length()>0) {
QString tmp = filename.right( filename.length() - ( pos + 1 ) );
name = strdup( tmp.latin1() ); // just filename
file = strdup( filename.latin1() ); // full name with path
}
- char *mime = strdup( mimetype.latin1() ); // mimetype -e.g. text/plain
-
+
int disptype = MAILMIME_DISPOSITION_TYPE_ATTACHMENT;
int mechanism = MAILMIME_MECHANISM_BASE64;
if ( mimetype.startsWith( "text/" ) ) {
param = mailmime_parameter_new( strdup( "charset" ),
strdup( "iso-8859-1" ) );
- disptype = MAILMIME_DISPOSITION_TYPE_INLINE;
mechanism = MAILMIME_MECHANISM_QUOTED_PRINTABLE;
}
fields = mailmime_fields_new_filename(
disptype, name,
mechanism );
- content = mailmime_content_new_with_str( mime );
+ content = mailmime_content_new_with_str( (char*)mimetype.latin1() );
if (content!=0 && fields != 0) {
if (param) {
clist_append(content->ct_parameters,param);
param = 0;
}
if (filename.length()>0) {
QFileInfo f(filename);
param = mailmime_parameter_new(strdup("name"),strdup(f.fileName().latin1()));
clist_append(content->ct_parameters,param);
param = 0;
}
filePart = mailmime_new_empty( content, fields );
}
if (filePart) {
if (filename.length()>0) {
err = mailmime_set_body_file( filePart, file );
} else {
- err = mailmime_set_body_text(filePart,strdup(TextContent.ascii()),TextContent.length());
+ err = mailmime_set_body_text(filePart,strdup(TextContent.data()),TextContent.length());
}
if (err != MAILIMF_NO_ERROR) {
qDebug("Error setting body with file %s",file);
mailmime_free( filePart );
filePart = 0;
}
}
if (!filePart) {
if ( param != NULL ) {
mailmime_parameter_free( param );
}
if (content) {
mailmime_content_free( content );
- } else {
- if (mime) {
- free( mime );
- }
}
if (fields) {
mailmime_fields_free( fields );
} else {
if (name) {
free( name );
}
if (file) {
free( file );
}
}
}
@@ -350,29 +340,26 @@ mailmime *SMTPwrapper::createMimeMail(const Mail &mail )
mailmime *message, *txtPart;
mailimf_fields *fields;
int err;
fields = createImfFields( mail );
if ( fields == NULL ) goto err_free;
message = mailmime_new_message_data( NULL );
if ( message == NULL ) goto err_free_fields;
mailmime_set_imf_fields( message, fields );
- if (mail.getAttachments().count()==0) {
- txtPart = buildTxtPart( mail.getMessage() );
- } else {
- txtPart = buildFilePart("","text/plain",mail.getMessage());
- }
+ txtPart = buildTxtPart( mail.getMessage() );
+
if ( txtPart == NULL ) goto err_free_message;
err = mailmime_smart_add_part( message, txtPart );
if ( err != MAILIMF_NO_ERROR ) goto err_free_txtPart;
addFileParts( message, mail.getAttachments() );
return message; // Success :)
err_free_txtPart:
mailmime_free( txtPart );
err_free_message:
@@ -462,104 +449,48 @@ char *SMTPwrapper::getFrom( mailimf_field *ffrom)
mailimf_mailbox *mb = (mailimf_mailbox *) it->data;
from = strdup( mb->mb_addr_spec );
}
}
return from;
}
char *SMTPwrapper::getFrom( mailmime *mail )
{
/* no need to delete - its just a pointer to structure content */
mailimf_field *ffrom = 0;
- char*f = 0;
ffrom = getField( mail->mm_data.mm_message.mm_fields, MAILIMF_FIELD_FROM );
return getFrom(ffrom);
}
SMTPaccount *SMTPwrapper::getAccount(const QString&name )
{
SMTPaccount *smtp;
QList<Account> list = settings->getAccounts();
Account *it;
for ( it = list.first(); it; it = list.next() ) {
if ( it->getType().compare( "SMTP" ) == 0 ) {
smtp = static_cast<SMTPaccount *>(it);
if ( smtp->getName()== name ) {
qDebug( "SMTPaccount found for" );
qDebug( name );
return smtp;
}
}
}
return NULL;
}
-QString SMTPwrapper::getTmpFile() {
- int num = 0;
- QString unique;
-
- QDir dir( "/tmp" );
-
- QStringList list = dir.entryList( "opiemail-tmp-*" );
-
- do {
- unique.setNum( num++ );
- } while ( list.contains( "opiemail-tmp-" + unique ) > 0 );
-
- return "/tmp/opiemail-tmp-" + unique;
-}
-
-void SMTPwrapper::writeToFile(const QString&file, mailmime *mail )
-{
- FILE *f;
- int err, col = 0;
-
- f = fopen( file.latin1(), "w" );
- if ( f == NULL ) {
- qDebug( "writeToFile: error opening file" );
- return;
- }
-
- err = mailmime_write( f, &col, mail );
- if ( err != MAILIMF_NO_ERROR ) {
- fclose( f );
- qDebug( "writeToFile: error writing mailmime" );
- return;
- }
-
- fclose( f );
-}
-
-void SMTPwrapper::readFromFile(const QString&file, char **data, size_t *size )
-{
-
- QFile msg_cache(file);
- QString msg = "";
- msg_cache.open(IO_ReadOnly);
- char*message = new char[4096];
- memset(message,0,4096);
- while (msg_cache.readBlock(message,4095)>0) {
- msg+=message;
- memset(message,0,4096);
- }
- delete message;
- *data = (char*)malloc(msg.length()+1*sizeof(char));
- memset(*data,0,msg.length()+1);
- memcpy(*data,msg.ascii(),msg.length());
- *size=msg.length();
-}
-
void SMTPwrapper::progress( size_t current, size_t maximum )
{
if (SMTPwrapper::sendProgress) {
SMTPwrapper::sendProgress->setSingleMail(current, maximum );
qApp->processEvents();
}
}
void SMTPwrapper::storeMail(char*mail, size_t length, const QString&box)
{
if (!mail) return;
QString localfolders = (QString) getenv( "HOME" ) + QString("/Applications/opiemail/localmail/");
@@ -569,33 +500,41 @@ void SMTPwrapper::storeMail(char*mail, size_t length, const QString&box)
}
void SMTPwrapper::smtpSend( mailmime *mail,bool later, SMTPaccount *smtp )
{
clist *rcpts = 0;
char *from, *data;
size_t size;
if ( smtp == NULL ) {
return;
}
from = data = 0;
-
- QString file = getTmpFile();
- writeToFile( file, mail );
- readFromFile( file, &data, &size );
- QFile f( file );
- f.remove();
-
+
+ mailmessage * msg = 0;
+ 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);
+ qDebug("Error fetching mime...");
+ return;
+ }
+ QString tmp = data;
+ tmp.replace(QRegExp("\r+",true,false),"");
+ msg = 0;
if (later) {
- storeMail(data,size,"Outgoing");
+ storeMail((char*)tmp.data(),tmp.length(),"Outgoing");
if (data) free( data );
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 );
}
int SMTPwrapper::smtpSend(char*from,clist*rcpts,char*data,size_t size, SMTPaccount *smtp )
@@ -679,29 +618,29 @@ void SMTPwrapper::sendMail(const Mail&mail,bool later )
mailmime * mimeMail;
SMTPaccount *smtp = getAccount(mail.getName());
mimeMail = createMimeMail(mail );
if ( mimeMail == NULL ) {
qDebug( "sendMail: error creating mime mail" );
} else {
sendProgress = new progressMailSend();
sendProgress->show();
sendProgress->setMaxMails(1);
smtpSend( mimeMail,later,smtp);
- mailmime_free( mimeMail );
qDebug("Clean up done");
sendProgress->hide();
delete sendProgress;
sendProgress = 0;
+ mailmime_free( mimeMail );
}
}
int SMTPwrapper::sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which)
{
char*data = 0;
size_t length = 0;
size_t curTok = 0;
mailimf_fields *fields = 0;
mailimf_field*ffrom = 0;
clist *rcpts = 0;
char*from = 0;
@@ -738,48 +677,47 @@ int SMTPwrapper::sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which)
smtp_address_list_free( rcpts );
}
return res;
}
/* this is a special fun */
bool SMTPwrapper::flushOutbox(SMTPaccount*smtp)
{
bool returnValue = true;
if (!smtp) return false;
- QString localfolders = (QString) getenv( "HOME" ) + QString("/Applications/opiemail/localmail/");
+ QString localfolders = (QString) getenv( "HOME" ) + QString("/Applications/opiemail/localmail/");
MBOXwrapper*wrap = new MBOXwrapper(localfolders);
if (!wrap) {
qDebug("memory error");
return false;
}
QList<RecMail> mailsToSend;
QList<RecMail> mailsToRemove;
QString mbox("Outgoing");
wrap->listMessages(mbox,mailsToSend);
if (mailsToSend.count()==0) {
delete wrap;
return false;
}
mailsToSend.setAutoDelete(false);
sendProgress = new progressMailSend();
sendProgress->show();
sendProgress->setMaxMails(mailsToSend.count());
while (mailsToSend.count()>0) {
if (sendQueuedMail(wrap,smtp,mailsToSend.at(0))==0) {
QMessageBox::critical(0,tr("Error sending mail"),
tr("Error sending queued mail - breaking"));
-
returnValue = false;
break;
}
mailsToRemove.append(mailsToSend.at(0));
mailsToSend.removeFirst();
sendProgress->setCurrentMails(mailsToRemove.count());
}
sendProgress->hide();
delete sendProgress;
sendProgress = 0;
wrap->deleteMails(mbox,mailsToRemove);
mailsToSend.setAutoDelete(true);
diff --git a/noncore/net/mail/smtpwrapper.h b/noncore/net/mail/smtpwrapper.h
index 66180b7..f734fa4 100644
--- a/noncore/net/mail/smtpwrapper.h
+++ b/noncore/net/mail/smtpwrapper.h
@@ -34,30 +34,27 @@ public:
protected:
mailimf_mailbox *newMailbox(const QString&name,const QString&mail );
mailimf_fields *createImfFields(const Mail &mail );
mailmime *createMimeMail(const Mail&mail );
mailimf_address_list *parseAddresses(const QString&addr );
void addFileParts( mailmime *message,const QList<Attachment>&files );
mailmime *buildTxtPart(const QString&str );
mailmime *buildFilePart(const QString&filename,const QString&mimetype,const QString&content);
void smtpSend( mailmime *mail,bool later, SMTPaccount *smtp );
clist *createRcptList( mailimf_fields *fields );
SMTPaccount *getAccount(const QString&from );
- void writeToFile(const QString&file, mailmime *mail );
- void readFromFile(const QString&file, char **data, size_t *size );
static void storeMail(char*mail, size_t length, const QString&box);
static QString mailsmtpError( int err );
- static QString getTmpFile();
static void progress( size_t current, size_t maximum );
static void addRcpts( clist *list, mailimf_address_list *addr_list );
static char *getFrom( mailmime *mail );
static char *getFrom( mailimf_field *ffrom);
static mailimf_field *getField( mailimf_fields *fields, int type );
int smtpSend(char*from,clist*rcpts,char*data,size_t size, SMTPaccount *smtp );
void storeMail(mailmime*mail, const QString&box);
Settings *settings;
int sendQueuedMail(MBOXwrapper*wrap,SMTPaccount*smtp,RecMail*which);
};