From 34f3b7a0a91f23edee8a4f9964519df5405b80aa Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Mon, 26 Sep 2011 15:49:11 +0000 Subject: [PATCH] Monotone-Parent: 753e863b1e3ac69df91f82bcd8d13909de69ea5b Monotone-Revision: f5375423b8629730c6f88e76c660c389426c1f5a Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-09-26T15:49:11 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 5 ++ SoObjects/Mailer/SOGoDraftObject.h | 1 + SoObjects/Mailer/SOGoDraftObject.m | 105 +++++++++++++++-------------- 3 files changed, 62 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index 23b3f4b9d..2314f3112 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-09-26 Wolfgang Sourdeau + * SoObjects/Mailer/SOGoDraftObject.m (-sendMailAndCopyToSent:): + renamed "sendMail" and made copying the messsage to the sent + folder opetional. + (-sendMail): new method that invokes the above one with "yes". + * OpenChange/MAPIStoreMemMailMessage.m (-save): fixed "subject" header, "to" and other recipients. Fixed "content-type", that was deduced after "message" was generated. Take the client-provided diff --git a/SoObjects/Mailer/SOGoDraftObject.h b/SoObjects/Mailer/SOGoDraftObject.h index c4aab2133..a53d2a9ba 100644 --- a/SoObjects/Mailer/SOGoDraftObject.h +++ b/SoObjects/Mailer/SOGoDraftObject.h @@ -102,6 +102,7 @@ - (NSException *) delete; - (NSException *) sendMail; +- (NSException *) sendMailAndCopyToSent: (BOOL) copyToSent; /* default: YES */ - (NSException *) save; // /* fake being a SOGoMailObject */ diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index 1d11305b7..4d5cad45d 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -1515,6 +1515,11 @@ static NSString *userAgent = nil; } - (NSException *) sendMail +{ + return [self sendMailAndCopyToSent: YES]; +} + +- (NSException *) sendMailAndCopyToSent: (BOOL) copyToSent { NSMutableData *cleaned_message; SOGoMailFolder *sentFolder; @@ -1525,65 +1530,67 @@ static NSString *userAgent = nil; NSRange r1, r2; /* send mail */ - sentFolder = [[self mailAccountFolder] sentFolderInContext: context]; - if ([sentFolder isKindOfClass: [NSException class]]) - error = (NSException *) sentFolder; - else - { - // We strip the BCC fields prior sending any mails - NGMimeMessageGenerator *generator; - generator = [[[NGMimeMessageGenerator alloc] init] autorelease]; - message = [generator generateMimeFromPart: [self mimeMessageWithHeaders: nil - excluding: nil]]; + // We strip the BCC fields prior sending any mails + NGMimeMessageGenerator *generator; + + generator = [[[NGMimeMessageGenerator alloc] init] autorelease]; + message = [generator generateMimeFromPart: [self mimeMessageWithHeaders: nil + excluding: nil]]; - // - // We now look for the Bcc: header. If it is present, we remove it. - // Some servers, like qmail, do not remove it automatically. - // + // + // We now look for the Bcc: header. If it is present, we remove it. + // Some servers, like qmail, do not remove it automatically. + // #warning FIXME - we should fix the case issue when we switch to Pantomime - cleaned_message = [NSMutableData dataWithData: message]; - r1 = [cleaned_message rangeOfCString: "\r\n\r\n"]; - r1 = [cleaned_message rangeOfCString: "\r\nbcc: " - options: 0 - range: NSMakeRange(0,r1.location-1)]; + cleaned_message = [NSMutableData dataWithData: message]; + r1 = [cleaned_message rangeOfCString: "\r\n\r\n"]; + r1 = [cleaned_message rangeOfCString: "\r\nbcc: " + options: 0 + range: NSMakeRange(0,r1.location-1)]; - if (r1.location != NSNotFound) - { - // We search for the first \r\n AFTER the Bcc: header and - // replace the whole thing with \r\n. - r2 = [cleaned_message rangeOfCString: "\r\n" - options: 0 - range: NSMakeRange(NSMaxRange(r1)+1,[cleaned_message length]-NSMaxRange(r1)-1)]; - [cleaned_message replaceBytesInRange: NSMakeRange(r1.location, NSMaxRange(r2)-r1.location) - withBytes: "\r\n" - length: 2]; - } + if (r1.location != NSNotFound) + { + // We search for the first \r\n AFTER the Bcc: header and + // replace the whole thing with \r\n. + r2 = [cleaned_message rangeOfCString: "\r\n" + options: 0 + range: NSMakeRange(NSMaxRange(r1)+1,[cleaned_message length]-NSMaxRange(r1)-1)]; + [cleaned_message replaceBytesInRange: NSMakeRange(r1.location, NSMaxRange(r2)-r1.location) + withBytes: "\r\n" + length: 2]; + } - dd = [[context activeUser] domainDefaults]; - error = [[SOGoMailer mailerWithDomainDefaults: dd] + dd = [[context activeUser] domainDefaults]; + error = [[SOGoMailer mailerWithDomainDefaults: dd] sendMailData: cleaned_message toRecipients: [self allBareRecipients] sender: [self sender]]; - if (!error) - { - error = [sentFolder postData: message flags: @"seen"]; - if (!error) - { - [self imap4Connection]; - if (IMAP4ID > -1) - [imap4 markURLDeleted: [self imap4URL]]; - if (sourceURL && sourceFlag) - { - sourceIMAP4URL = [NSURL URLWithString: sourceURL]; - [imap4 addFlags: sourceFlag toURL: sourceIMAP4URL]; - } - if (![dd mailKeepDraftsAfterSend]) - error = [self delete]; - } - } + if (!error && copyToSent) + { + sentFolder = [[self mailAccountFolder] sentFolderInContext: context]; + if ([sentFolder isKindOfClass: [NSException class]]) + error = (NSException *) sentFolder; + else + { + error = [sentFolder postData: message flags: @"seen"]; + if (!error) + { + [self imap4Connection]; + if (IMAP4ID > -1) + [imap4 markURLDeleted: [self imap4URL]]; + if (sourceURL && sourceFlag) + { + sourceIMAP4URL = [NSURL URLWithString: sourceURL]; + [imap4 addFlags: sourceFlag toURL: sourceIMAP4URL]; + } + } + } } + if (!error && ![dd mailKeepDraftsAfterSend]) + [self delete]; + return error; }