diff --git a/lib/src/mime_message.dart b/lib/src/mime_message.dart index 29296bb8..1b99019c 100644 --- a/lib/src/mime_message.dart +++ b/lib/src/mime_message.dart @@ -597,6 +597,10 @@ class MimeMessage extends MimePart { this.guid = guid; } + int? xGmThrid; // X-GM-THRID + int? xGmMsgid; // X-GM-MSGID + List? xGmLabels; // X-GM-LABELS + /// The modifications sequence of this message. /// /// This is only returned by servers that support the CONDSTORE capability diff --git a/lib/src/private/imap/fetch_parser.dart b/lib/src/private/imap/fetch_parser.dart index 046281b1..29c7834d 100644 --- a/lib/src/private/imap/fetch_parser.dart +++ b/lib/src/private/imap/fetch_parser.dart @@ -177,6 +177,44 @@ class FetchParser extends ResponseParser { _parseBodyFull(message, children[i]); } break; + case 'X-GM-THRID': + if (hasNext) { + message.xGmThrid = int.tryParse(children[i + 1].value ?? ''); + i++; + } + break; + case 'X-GM-MSGID': + if (hasNext) { + message.xGmMsgid = int.tryParse(children[i + 1].value ?? ''); + i++; + } + break; + case 'X-GM-LABELS': + if (hasNext) { + final node = children[i + 1]; + final labels = []; + + final labelChildren = node.children; + if (labelChildren != null && labelChildren.isNotEmpty) { + for (final c in labelChildren) { + final v = c.valueOrDataText; + if (v != null && v.isNotEmpty) { + labels.add(v); + } + } + } else { + // Fallback if parser provides a single token + final v = node.valueOrDataText; + if (v != null && v.isNotEmpty) { + labels.add(v); + } + } + + message.xGmLabels = labels; + i++; + } + break; + default: final value = child.value; if (hasNext &&