From 7bee193413935ca03e4936a15791fbbb534493ec Mon Sep 17 00:00:00 2001 From: Hivert Quentin Date: Mon, 28 Jul 2025 17:40:14 +0200 Subject: [PATCH] fix(mail): preoperly generates the message-id header value --- ActiveSync/SOGoMailObject+ActiveSync.m | 2 +- .../Appointments/SOGoCalendarComponent.m | 6 ++--- SoObjects/Mailer/NSString+Mail.h | 2 +- SoObjects/Mailer/NSString+Mail.m | 22 ++++++++++++++----- SoObjects/Mailer/SOGoDraftObject.m | 2 +- SoObjects/SOGo/SOGoObject.h | 4 ++++ SoObjects/SOGo/SOGoObject.m | 18 +++++++++++++++ 7 files changed, 45 insertions(+), 11 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index a975752ef..1b844ddaa 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -1627,7 +1627,7 @@ struct GlobalObjectId { [map setObject: dateReceived forKey: @"date"]; - messageId = [NSString generateMessageID]; + messageId = [NSString generateMessageID: [identity objectForKey: @"email"]]; [map setObject: messageId forKey: @"message-id"]; attachmentKeys = [self fetchFileAttachmentKeys]; diff --git a/SoObjects/Appointments/SOGoCalendarComponent.m b/SoObjects/Appointments/SOGoCalendarComponent.m index 481e8ce21..e9fca99ed 100644 --- a/SoObjects/Appointments/SOGoCalendarComponent.m +++ b/SoObjects/Appointments/SOGoCalendarComponent.m @@ -885,7 +885,7 @@ mailDate = [[NSCalendarDate date] rfc822DateString]; [headerMap setObject: mailDate forKey: @"date"]; [headerMap setObject: subject forKey: @"subject"]; - [headerMap setObject: [NSString generateMessageID] forKey: @"message-id"]; + [headerMap setObject: [NSString generateMessageID: senderEmail] forKey: @"message-id"]; if ([msgType length] > 0) [headerMap setObject: msgType forKey: @"x-sogo-message-type"]; msg = [NGMimeMessage messageWithHeader: headerMap]; @@ -974,7 +974,7 @@ [headerMap setObject: mailDate forKey: @"date"]; [headerMap setObject: [[p getSubject] asQPSubjectString: @"UTF-8"] forKey: @"subject"]; - [headerMap setObject: [NSString generateMessageID] forKey: @"message-id"]; + [headerMap setObject: [NSString generateMessageID: [[attendee mailAddress] pureEMailAddress]] forKey: @"message-id"]; [headerMap setObject: @"1.0" forKey: @"MIME-Version"]; if (textOnly) @@ -1163,7 +1163,7 @@ mailDate = [[NSCalendarDate date] rfc822DateString]; [headerMap setObject: mailDate forKey: @"date"]; [headerMap setObject: [page getSubject] forKey: @"subject"]; - [headerMap setObject: [NSString generateMessageID] forKey: @"message-id"]; + [headerMap setObject: [NSString generateMessageID: senderEmail] forKey: @"message-id"]; [headerMap setObject: @"1.0" forKey: @"MIME-Version"]; [headerMap setObject: @"text/html; charset=utf-8" forKey: @"content-type"]; diff --git a/SoObjects/Mailer/NSString+Mail.h b/SoObjects/Mailer/NSString+Mail.h index 1d7fca682..97a073d7a 100644 --- a/SoObjects/Mailer/NSString+Mail.h +++ b/SoObjects/Mailer/NSString+Mail.h @@ -25,7 +25,7 @@ @interface NSString (SOGoExtension) -+ (NSString *) generateMessageID; ++ (NSString *) generateMessageID: (NSString *) mailOrDomain; - (NSString *) htmlToText; - (NSString *) htmlByExtractingImages: (NSMutableArray *) theImages; - (NSString *) stringByConvertingCRLNToHTML; diff --git a/SoObjects/Mailer/NSString+Mail.m b/SoObjects/Mailer/NSString+Mail.m index da9c0e200..bb580b96c 100644 --- a/SoObjects/Mailer/NSString+Mail.m +++ b/SoObjects/Mailer/NSString+Mail.m @@ -560,15 +560,27 @@ @implementation NSString (SOGoExtension) -+ (NSString *) generateMessageID ++ (NSString *) generateMessageID: (NSString *) mailOrDomain { NSMutableString *messageID; - NSString *pGUID; + NSString *_domain; + NSRange r; messageID = [NSMutableString string]; - [messageID appendFormat: @"<%@", [SOGoObject globallyUniqueObjectId]]; - pGUID = [[NSProcessInfo processInfo] globallyUniqueString]; - [messageID appendFormat: @"@%u>", (unsigned int)[pGUID hash]]; + [messageID appendFormat: @"<%@", [SOGoObject mailUniqueMessageId]]; + if(mailOrDomain) + { + r = [mailOrDomain rangeOfString: @"@" options: NSBackwardsSearch]; + if (r.location != NSNotFound) + { + //Its the full email not a domain + _domain = [mailOrDomain substringFromIndex: (r.location + r.length)]; + } + else + _domain = mailOrDomain; + [messageID appendFormat: @"@%@>", _domain]; + } + return [messageID lowercaseString]; } diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index c36946cff..4310bd70e 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -222,7 +222,7 @@ static NSString *userAgent = nil; messageID = [headers objectForKey: @"message-id"]; if (!messageID) { - messageID = [NSString generateMessageID]; + messageID = [NSString generateMessageID: [[newHeaders objectForKey: @"from"] pureEMailAddress]]; [headers setObject: messageID forKey: @"message-id"]; } diff --git a/SoObjects/SOGo/SOGoObject.h b/SoObjects/SOGo/SOGoObject.h index f0633e56b..6bfd40c8c 100644 --- a/SoObjects/SOGo/SOGoObject.h +++ b/SoObjects/SOGo/SOGoObject.h @@ -48,6 +48,7 @@ @class NSException; @class NSTimeZone; @class NSURL; +@class NSUUID; @class WOContext; @class WORequest; @@ -74,6 +75,9 @@ + (NSString *) globallyUniqueObjectId; - (NSString *) globallyUniqueObjectId; ++ (NSString *) mailUniqueMessageId; +- (NSString *) mailUniqueMessageId; + + (id) objectWithName: (NSString *)_name inContainer:(id)_container; - (id) initWithName: (NSString *) _name inContainer:(id)_container; diff --git a/SoObjects/SOGo/SOGoObject.m b/SoObjects/SOGo/SOGoObject.m index af38c3c9c..a97dfa174 100644 --- a/SoObjects/SOGo/SOGoObject.m +++ b/SoObjects/SOGo/SOGoObject.m @@ -20,6 +20,7 @@ */ #import +#import #import @@ -111,11 +112,28 @@ pid, (int) f, sequence++, (int) rndm]; } + - (NSString *) globallyUniqueObjectId { return [[self class] globallyUniqueObjectId]; } ++ (NSString *) mailUniqueMessageId +{ + /* + 843F8180-4E33-7B0B-6F1B-9847CAD3E6EB + */ + return [[NSUUID UUID] UUIDString]; +} + +- (NSString *) mailUniqueMessageId +{ + /* + 843F8180-4E33-7B0B-6F1B-9847CAD3E6EB + */ + return [[self class] mailUniqueMessageId]; +} + /* containment */ + (id) objectWithName: (NSString *)_name inContainer:(id)_container