---
product: Chilkat
product_version: 11.7.0
language: c
language_label: C
class: MessageSet
license: bundle
deprecated: false
reference_html: https://www.chilkatsoft.com/refdoc/c_CkMessageSetRef.html
---
# Chilkat MessageSet — C — v11.7.0

> Chilkat 11.7.0 · language=c · class=MessageSet
> Other versions: replace `11.7.0` in this URL. Other languages: `https://www.chilkatsoft.com/ai-docs/v/11.7.0/<lang>/classes/MessageSet.md`.
> Language-wide rules (install, unlock, error model, strings/bytes): `https://www.chilkatsoft.com/ai-docs/v/11.7.0/c/guide.md`.

## Purpose

**Represent and pass sets of IMAP message identifiers.**

`Chilkat.MessageSet` represents a set of IMAP message identifiers used by `Chilkat.Imap`. It is a helper object for passing groups of messages to IMAP methods and for receiving groups of message IDs returned by IMAP search, fetch, copy, delete, or flag-related operations. A `MessageSet` may contain either UIDs or sequence numbers, and the `HasUids` setting identifies which form is being used.

**IMAP message IDs**

Store the identifiers used by IMAP operations, either as message UIDs or as sequence numbers.

**Used by Chilkat.Imap**

Pass message sets to IMAP methods that operate on multiple messages, or receive them from IMAP methods that return matching messages.

**UID awareness**

Use `HasUids` to indicate whether the contained identifiers are stable IMAP UIDs or mailbox-relative sequence numbers.

**Add and remove IDs**

Insert message identifiers, remove identifiers, check whether an ID is present, and build the exact message group needed for an IMAP operation.

**Compact string formats**

Load or emit compact IMAP-style message ranges such as comma-separated lists and range expressions.

**Set operations**

Subtract one message set from another when application logic needs to exclude already-processed or unwanted messages.

**Common pattern:** Use `MessageSet` only for IMAP message identifiers, not as a general-purpose collection. Obtain a message set from an IMAP search or build one manually, confirm whether it contains UIDs or sequence numbers, then pass it to the appropriate `Chilkat.Imap` method for fetching, copying, deleting, flagging, or otherwise processing the selected messages.

For an extended overview, see [MessageSet Class Overview](https://www.chilkatsoft.com/messageset_class_overview.asp).

## Object creation, unlocking and error handling

**Create/Dispose**

```c
HCkMessageSet instance = CkMessageSet_Create();
// ...
CkMessageSet_Dispose(instance);
```

`HCkMessageSet CkMessageSet_Create(void);`

Creates an instance of the HCkMessageSet object and returns a handle ("void \*" pointer). The handle is passed in the 1st argument for the functions listed on this page.

`void CkMessageSet_Dispose(HCkMessageSet handle);`

Objects created by calling CkMessageSet_Create must be freed by calling this method. A memory leak occurs if a handle is not disposed by calling this function. Also, any handle returned by a Chilkat "C" function must also be freed by the application by calling the appropriate Dispose method, such as CkMessageSet_Dispose.

Call `Global.UnlockBundle` once at the start of the program, before using this or any other Chilkat class. Any string unlocks a fully functional 30-day trial; a purchased unlock code is used in production. See `guide.md` for the exact code in C.

## Members common to every Chilkat class

Documented once per language in `common-members.md`; listed here so this page is self-contained.

| Property | Signature | Access | Meaning |
|---|---|---|---|
| `DebugLogFilePath` | `void CkMessageSet_getDebugLogFilePath(HCkMessageSet cHandle, HCkString retval); void CkMessageSet_putDebugLogFilePath(HCkMessageSet cHandle, const char *newVal); const char *CkMessageSet_debugLogFilePath(HCkMessageSet cHandle);` | read/write | If set to a file path, this property logs the LastErrorText of each Chilkat method or property call to the specified file. |
| `LastErrorHtml` | `void CkMessageSet_getLastErrorHtml(HCkMessageSet cHandle, HCkString retval); const char *CkMessageSet_lastErrorHtml(HCkMessageSet cHandle);` | read-only | Provides HTML-formatted information about the last called method or property. |
| `LastErrorText` | `void CkMessageSet_getLastErrorText(HCkMessageSet cHandle, HCkString retval); const char *CkMessageSet_lastErrorText(HCkMessageSet cHandle);` | read-only | Provides plain text information about the last called method or property. |
| `LastErrorXml` | `void CkMessageSet_getLastErrorXml(HCkMessageSet cHandle, HCkString retval); const char *CkMessageSet_lastErrorXml(HCkMessageSet cHandle);` | read-only | Provides XML-formatted information about the last called method or property. |
| `LastMethodSuccess` | `BOOL CkMessageSet_getLastMethodSuccess(HCkMessageSet cHandle); void CkMessageSet_putLastMethodSuccess(HCkMessageSet cHandle, BOOL newVal);` | read/write | Indicates the success or failure of the most recent method call: `TRUE` means success, `FALSE` means failure. |
| `Utf8` | `BOOL CkMessageSet_getUtf8(HCkMessageSet cHandle); void CkMessageSet_putUtf8(HCkMessageSet cHandle, BOOL newVal);` | read/write | When set to `TRUE`, all `const char *` arguments and return values are interpreted as UTF-8 strings. |
| `VerboseLogging` | `BOOL CkMessageSet_getVerboseLogging(HCkMessageSet cHandle); void CkMessageSet_putVerboseLogging(HCkMessageSet cHandle, BOOL newVal);` | read/write | If set to `TRUE`, then the contents of LastErrorText (or LastErrorXml, or LastErrorHtml) may contain more verbose information. |
| `Version` | `void CkMessageSet_getVersion(HCkMessageSet cHandle, HCkString retval); const char *CkMessageSet_version(HCkMessageSet cHandle);` | read-only | Version of the component/library, such as "10.1.0" |

## Member index

| Member | Kind | Signature |
|---|---|---|
| `Count` | property, read-only | `int CkMessageSet_getCount(HCkMessageSet cHandle);` |
| `HasUids` | property, read/write | `BOOL CkMessageSet_getHasUids(HCkMessageSet cHandle); void CkMessageSet_putHasUids(HCkMessageSet cHandle, BOOL newVal);` |
| `ContainsId` | method | `BOOL CkMessageSet_ContainsId(HCkMessageSet cHandle, unsigned long msgId);` |
| `FromCompactString` | method | `BOOL CkMessageSet_FromCompactString(HCkMessageSet cHandle, const char *str);` |
| `GetId` | method | `unsigned long CkMessageSet_GetId(HCkMessageSet cHandle, int index);` |
| `InsertId` | method | `void CkMessageSet_InsertId(HCkMessageSet cHandle, unsigned long id);` |
| `LoadTaskResult` | method | `BOOL CkMessageSet_LoadTaskResult(HCkMessageSet cHandle, HCkTask task);` |
| `RemoveId` | method | `void CkMessageSet_RemoveId(HCkMessageSet cHandle, unsigned long id);` |
| `Subtract` | method | `void CkMessageSet_Subtract(HCkMessageSet cHandle, HCkMessageSet msgSet);` |
| `ToCommaSeparatedStr` | method | `BOOL CkMessageSet_ToCommaSeparatedStr(HCkMessageSet cHandle, HCkString outStr); const char *CkMessageSet_toCommaSeparatedStr(HCkMessageSet cHandle);` |
| `ToCompactString` | method | `BOOL CkMessageSet_ToCompactString(HCkMessageSet cHandle, HCkString outStr); const char *CkMessageSet_toCompactString(HCkMessageSet cHandle);` |

## Properties

### MessageSet.Count

`Chilkat 11.7.0 · c · MessageSet · Count · property · read-only`

```c
int CkMessageSet_getCount(HCkMessageSet cHandle);
```

Returns the number of unique message identifiers currently stored in the set. A newly created `MessageSet` has a count of `0`.

The identifiers are maintained in ascending numeric order. They are interpreted as UIDs when `HasUids` is `TRUE`, or as sequence numbers when it is `FALSE`.

### MessageSet.HasUids

`Chilkat 11.7.0 · c · MessageSet · HasUids · property · read/write`

```c
BOOL CkMessageSet_getHasUids(HCkMessageSet cHandle);
void CkMessageSet_putHasUids(HCkMessageSet cHandle, BOOL newVal);
```

**Full documentation for this property (same in every language):** [IMAP Sequence Numbers Explained](https://www.chilkatsoft.com/ai-docs/v/11.7.0/articles/imap_message_sequence_numbers.md)

Indicates how the numeric identifiers in this message set are interpreted:

- `TRUE` — the values are IMAP UIDs. This is the default.
- `FALSE` — the values are mailbox-relative sequence numbers.

Changing this property only changes how the existing numeric values are interpreted. It does not convert, validate, reorder, or clear the identifiers.

An IMAP UID is stable only within its mailbox and while that mailbox's `UIDVALIDITY` remains unchanged. Sequence numbers are temporary and can change when messages are added or expunged.

Set this property consistently before passing a manually constructed message set to an `Imap` method. The string formats produced by `ToCommaSeparatedStr` and `ToCompactString` contain only the numeric values and do not include this setting.

## Methods

### MessageSet.ContainsId

`Chilkat 11.7.0 · c · MessageSet · ContainsId · method`

```c
BOOL CkMessageSet_ContainsId(HCkMessageSet cHandle, unsigned long msgId);
```

Returns `TRUE` if the raw numeric value in `msgId` is present in the message set; otherwise, returns `FALSE`.

The comparison is numeric only. The `HasUids` setting does not participate in the comparison.

### MessageSet.FromCompactString

`Chilkat 11.7.0 · c · MessageSet · FromCompactString · method`

```c
BOOL CkMessageSet_FromCompactString(HCkMessageSet cHandle, const char *str);
```

Clears the identifiers currently stored in this object and loads the compact message-set representation in `str`. The existing `HasUids` setting is preserved.

**Important:** The existing set is cleared before `str` is parsed. If parsing fails, the message set remains empty.

An empty string succeeds and leaves the set empty. Valid identifiers are unsigned 32-bit decimal values from `1` through `4294967295`. The value `0` is not accepted. Values too large for an unsigned 32-bit integer cause the method to fail.

The syntax uses commas to separate values or ranges, and a colon to specify an inclusive ascending range. A single range may contain at most 500,001 identifiers; equivalently, the ending value minus the starting value cannot exceed `500000`.

**Version note:** The error-handling behavior described here was added in Chilkat version 11.6.0.

| Input | Result |
| :--- | :--- |
| `1,2,3,4,5` | Loads `1,2,3,4,5`. |
| `1:5` | Loads the inclusive range `1` through `5`. |
| `1:5,8:10` | Loads `1,2,3,4,5,8,9,10`. |
| `1,1,2,2,3` | Loads the unique values `1,2,3`. |
| `1:5,3:7` | Loads the unique values `1` through `7`. |
| `1,,3` | Empty comma-separated elements are ignored; loads `1,3`. |
| `1,2,abc,4` | Unrecognized elements are ignored; loads `1,2,4`. |
| `+1` | A leading plus sign is accepted; loads `1`. |

Whitespace is accepted around values, commas, and colons. This includes spaces, tabs, carriage returns, and line feeds. Empty comma-separated elements and unrecognized non-numeric elements are intentionally ignored. If `str` is nonempty and no valid identifier is loaded, the method returns `FALSE`.

Descending ranges, ranges containing `0`, wildcard ranges such as `1:*`, malformed range syntax, oversized ranges, and numeric overflow cause the method to return `FALSE`.

On success, duplicate identifiers are removed and the resulting identifiers are stored in ascending numeric order. The serialized form contains only the numbers and does not indicate whether they are UIDs or sequence numbers.

Use `ToCompactString` to generate the canonical compact representation.

Returns TRUE for success, FALSE for failure.

### MessageSet.GetId

`Chilkat 11.7.0 · c · MessageSet · GetId · method`

```c
unsigned long CkMessageSet_GetId(HCkMessageSet cHandle, int index);
```

Returns the message identifier at the zero-based index specified by `index`. Identifiers are returned in ascending numeric order.

If `index` is negative or is greater than or equal to `Count`, this method returns `0xFFFFFFFF`.

**Important:** The numeric value `0xFFFFFFFF` can also be stored in the set. Check `index` against `Count` before calling this method when that value could be present.

### MessageSet.InsertId

`Chilkat 11.7.0 · c · MessageSet · InsertId · method`

```c
void CkMessageSet_InsertId(HCkMessageSet cHandle, unsigned long id);
```

Adds `id` to the message set and maintains the identifiers in ascending numeric order.

- If `id` is already present, no duplicate is added.
- If `id` is `0`, the set is unchanged.
- The value `0xFFFFFFFF` is accepted.

The `HasUids` setting determines whether the stored values are interpreted as UIDs or sequence numbers.

### MessageSet.LoadTaskResult

`Chilkat 11.7.0 · c · MessageSet · LoadTaskResult · method · since 9.5.0.52`

```c
BOOL CkMessageSet_LoadTaskResult(HCkMessageSet cHandle, HCkTask task);
```

Loads the `MessageSet` result produced by a completed asynchronous operation.

`task` must be a completed `Task` returned by an asynchronous method whose result type is `MessageSet`. If `task` is not a valid completed task of the required result type, this object remains unchanged.

Returns TRUE for success, FALSE for failure.

### MessageSet.RemoveId

`Chilkat 11.7.0 · c · MessageSet · RemoveId · method`

```c
void CkMessageSet_RemoveId(HCkMessageSet cHandle, unsigned long id);
```

Removes the identifier whose raw numeric value equals `id`. If the value is not present, the set is unchanged.

The comparison is numeric only and does not depend on `HasUids`. The remaining identifiers stay in ascending numeric order.

### MessageSet.Subtract

`Chilkat 11.7.0 · c · MessageSet · Subtract · method · since 11.3.0`

```c
void CkMessageSet_Subtract(HCkMessageSet cHandle, HCkMessageSet msgSet);
```

Removes from this message set every identifier whose raw numeric value is present in `msgSet`. Values not present in this set are ignored.

The comparison is numeric only; the `HasUids` values of the two objects are not compared. This object's `HasUids` value is preserved, and the remaining identifiers stay in ascending numeric order.

Passing the same object as `msgSet` clears the set. Passing an empty set leaves this set unchanged.

For meaningful IMAP results, both objects should represent identifiers of the same type and from the same mailbox.

### MessageSet.ToCommaSeparatedStr

`Chilkat 11.7.0 · c · MessageSet · ToCommaSeparatedStr · method`

```c
BOOL CkMessageSet_ToCommaSeparatedStr(HCkMessageSet cHandle, HCkString outStr);
const char *CkMessageSet_toCommaSeparatedStr(HCkMessageSet cHandle);
```

Returns the unique identifiers as a comma-separated string in ascending numeric order. An empty set returns an empty string.

For example, a set containing the identifiers `1` through `5` returns `1,2,3,4,5`.

The returned string contains only the numeric values; it does not include the `HasUids` setting.

Returns TRUE for success, FALSE for failure.

### MessageSet.ToCompactString

`Chilkat 11.7.0 · c · MessageSet · ToCompactString · method`

```c
BOOL CkMessageSet_ToCompactString(HCkMessageSet cHandle, HCkString outStr);
const char *CkMessageSet_toCompactString(HCkMessageSet cHandle);
```

Returns the unique identifiers in ascending numeric order using compact IMAP message-set syntax. Consecutive identifiers are represented as an inclusive range. An empty set returns an empty string.

| Comma-separated form | Compact form |
| :--- | :--- |
| `1,2,3,4,5` | `1:5` |
| `1,2,3,4,5,8,9,10` | `1:5,8:10` |
| `1,3,4,5,8,9,10` | `1,3:5,8:10` |

The returned string is canonical for the current set: identifiers are unique, sorted, and consecutive runs are compacted. It contains only the numeric values and does not include the `HasUids` setting.

Use `FromCompactString` to load this format.

Returns TRUE for success, FALSE for failure.

## Related classes

[`Task`](https://www.chilkatsoft.com/ai-docs/v/11.7.0/c/classes/Task.md)

