Перейти к документации
C#

client.Calendar

Каждый метод этого пространства имён: его сигнатура, параметры, что он возвращает, и пример.

Методы

Calendar events found in mail or put on the calendar here, expanded into occurrences, with invitations, changes, cancellations and answers sent by email.

Calendar.ListEventsAsync

List one page of event occurrences inside a time window

Разрешенияcalendar:readПостранично перебирает результаты
Сигнатура
Task<Page> ListEventsAsync(    DateTimeOffset from,    DateTimeOffset to,    string? timezone = null,    int? limit = null,    string? cursor = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Expands every event in the workspace into its occurrences between from and to and returns one page of them, sorted by start time and then by event id. A recurring series gives one row per instance in the window, with its excluded dates left out, and every row points back to its event through eventId. The window is required because a repeating series has no end to list up to. Follow nextCursor while hasMore is true, with the same from, to and timezone:, to read every occurrence, or let ListAllEventsAsync and IterateEventsAsync do that walk.

to must be after from and at most 366 days later. A missing from or to is a 422 invalid_parameter, while a value that does not parse, a reversed or overlong window, or an unknown zone is a 400 invalid_parameter naming the field. Both bounds take a DateTimeOffset or an ISO 8601 string, and the SDK sends a DateTimeOffset as an ISO 8601 instant in UTC.

timezone is an IANA zone and defaults to UTC on the server. It is used to expand any event stored without a zone of its own, which is what decides the day an all day event lands on.

Параметры

fromDateTimeOffsetОбязательно

Start of the window.

toDateTimeOffsetОбязательно

End of the window, after from and at most 366 days later.

timezonestring?

IANA zone such as Europe/London, at most 64 characters. Defaults to UTC.

limitint?

Occurrences per page, a whole number from 1 to 100. The server defaults to 25.

cursorstring?

The nextCursor of the previous page, sent with the same window. It is opaque, so never build one yourself.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A Page of occurrence objects with items, hasMore and nextCursor. Each item has eventId, uid, start, end, allDay, summary, location, status, transparency, isOrganizer, organizerEmail, recurring, myPartstat and attendeeCount.

Пример

var today = new DateTimeOffset(DateTime.UtcNow.Date, TimeSpan.Zero); var page = await client.Calendar.ListEventsAsync(today, today.AddDays(7), timezone: "Europe/London", limit: 50); foreach (var occurrence in page){    Console.WriteLine($"{occurrence["start"]} {occurrence["summary"]} {occurrence["myPartstat"]?.ToString() ?? "not invited"}");} if (page.HasMore){    Console.WriteLine($"More from cursor {page.NextCursor}");}

Примечания

  • myPartstat is the response recorded for any address this workspace holds on its own domains, or for the addresses a narrowed key covers, and null when none of them is an attendee. A workspace with no address on its own domains matches no attendee, so every row reads null.

  • A narrowed key only sees occurrences whose organiser is one of the addresses it covers or where one of them is an attendee.

  • Cancelled events are not filtered out. Check status for CANCELLED.

  • Nothing in the window is dropped. A series repeats at most once a day, so one series gives at most one row per day of the window, and every one of them is reachable through the pages.

  • The cursor holds the start time and event id of the last row, so an event deleted or moved between pages never breaks the walk. A cursor this list did not hand out is a 400 invalid_cursor.

Также доступно в

API
GET /calendar/events
TypeScript
calendar.listEvents()
Python
calendar.list_events()
Ruby
calendar.list_events
PHP
calendar->listEvents
Go
Calendar.ListEvents
Java
calendar().listEvents
CLI
openemail calendar list-events

Calendar.ListAllEventsAsync

Collect every occurrence inside a time window into one object

Разрешенияcalendar:readПостранично перебирает результаты
Сигнатура
Task<IReadOnlyList<JsonObject>> ListAllEventsAsync(    DateTimeOffset from,    DateTimeOffset to,    string? timezone = null,    int? limit = null,    string? cursor = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Walks every page of ListEventsAsync for one window and returns all of its occurrences, sorted by start time and then by event id. It follows nextCursor until hasMore is false, sending the same from, to and timezone: with each request.

A window of up to 366 days of a busy calendar can hold thousands of occurrences, so prefer IterateEventsAsync when you can stop early.

Параметры

fromDateTimeOffsetОбязательно

Start of the window.

toDateTimeOffsetОбязательно

End of the window, after from and at most 366 days later.

timezonestring?

IANA zone such as Europe/London, at most 64 characters. Defaults to UTC.

limitint?

Page size for each request, 1 to 100. The server defaults to 25.

cursorstring?

Starts the walk from this cursor instead of the start of the window.

apiKeystring?

Overrides the client API key for every page of this walk.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A list of occurrence objects holding every occurrence in the window, earliest first.

Пример

using OpenEmail.Constants; var occurrences = await client.Calendar.ListAllEventsAsync(DateTimeOffset.Parse("2026-10-01T00:00:00Z"), DateTimeOffset.Parse("2026-11-01T00:00:00Z"), limit: 100); foreach (var occurrence in occurrences){    if ((string?)occurrence["transparency"] == CalendarTransparencies.Opaque)    {        Console.WriteLine($"Busy {occurrence["start"]} to {occurrence["end"]}");    }}

Примечания

  • If any page fails the call throws and the occurrences already fetched are discarded.

Также доступно в

API
GET /calendar/events
TypeScript
calendar.listAllEvents()
Python
calendar.list_all_events()
Ruby
calendar.list_all_events
PHP
calendar->listAllEvents
Go
Calendar.ListAllEvents
Java
calendar().listAllEvents

Calendar.IterateEventsAsync

Stream the occurrences inside a time window one at a time

Разрешенияcalendar:readПостранично перебирает результаты
Сигнатура
IAsyncEnumerable<JsonObject> IterateEventsAsync(    DateTimeOffset from,    DateTimeOffset to,    string? timezone = null,    int? limit = null,    string? cursor = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns an IAsyncEnumerable<JsonObject> over the occurrences in one window that yields them individually, earliest first, and fetches the next page only when the current one is drained. Nothing is requested until you consume it, and breaking out of the loop stops further requests, which makes it the way to find the next free slot or the next meeting without reading the whole window.

The walk ends when hasMore is false, when a page carries no nextCursor, or when the server repeats a cursor.

Параметры

fromDateTimeOffsetОбязательно

Start of the window.

toDateTimeOffsetОбязательно

End of the window, after from and at most 366 days later.

timezonestring?

IANA zone such as Europe/London, at most 64 characters. Defaults to UTC.

limitint?

Page size per request, 1 to 100. The server defaults to 25.

cursorstring?

Starts the walk from this cursor instead of the start of the window.

apiKeystring?

Overrides the client API key for every page of this walk.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

An IAsyncEnumerable<JsonObject> that yields one occurrence per step.

Пример

var from = DateTimeOffset.UtcNow;var to = DateTimeOffset.UtcNow.AddDays(30); await foreach (var occurrence in client.Calendar.IterateEventsAsync(from, to)){    if (occurrence["myPartstat"] is not null)    {        Console.WriteLine($"Next meeting: {occurrence["start"]} {occurrence["summary"]}");         break;    }}

Примечания

  • A page request that fails throws out of the foreach loop, after every occurrence of the pages before it has been yielded.

Также доступно в

API
GET /calendar/events
TypeScript
calendar.iterateEvents()
Python
calendar.iterate_events()
Ruby
calendar.iterate_events
PHP
calendar->iterateEvents
Go
Calendar.IterateEvents
Java
calendar().iterateEvents

Calendar.GetEventAsync

Read an event with its attendees

Разрешенияcalendar:read
Сигнатура
Task<JsonObject> GetEventAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns a stored event with its attendees and their responses. What the server understood from the iCalendar data is structured here: recurrence holds the RRULE text, exdates the excluded instances, organizer the organiser and alarms the reminders, each an object with minutesBefore and action. The raw iCalendar source is not included, and GetEventIcsAsync serves the event as a document.

id is the event id, the eventId on an occurrence, and not the iCalendar uid. A recurring series is one event however many occurrences it has, so start and end describe its first instance. messageId and threadId link the event to mail in the mailbox when there is any.

Attendees come back in the order they were added, each with partstat, role, rsvp, cutype and respondedAt. A narrowed key gets a 404 unless one of the addresses it covers organises the event or is on the attendee list, and a key that holds a whole domain covers every address on it.

Параметры

idstringОбязательно

Event id, the eventId of an occurrence, such as cal_ followed by 24 hex characters.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject with id, uid, sequence, summary, description, location, url, start, end, allDay, timezone, recurrence, exdates, status, transparency, visibility, organizer, isOrganizer, source, messageId, threadId, alarms, attendees, createdAt and updatedAt.

Пример

var entry = await client.Calendar.GetEventAsync("cal_3f9a1c7e5b2d48a06c1e9f4b"); Console.WriteLine($"{entry["summary"]}, {entry["recurrence"]?.ToString() ?? "one off"}"); foreach (var attendee in entry["attendees"]?.AsArray() ?? []){    Console.WriteLine($"{attendee?["email"]}: {attendee?["partstat"]}");}

Примечания

  • status, transparency and visibility carry iCalendar values, and default to CONFIRMED, OPAQUE and PUBLIC.

  • An attendee's partstat defaults to NEEDS-ACTION and role to REQ-PARTICIPANT until a response is recorded.

Также доступно в

API
GET /calendar/events/{id}
TypeScript
calendar.getEvent()
Python
calendar.get_event()
Ruby
calendar.get_event
PHP
calendar->getEvent
Go
Calendar.GetEvent
Java
calendar().getEvent
CLI
openemail calendar get-event

Calendar.GetEventIcsAsync

Download an event as an iCalendar document

Разрешенияcalendar:read
Сигнатура
Task<string> GetEventIcsAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns the event serialised as an .ics document, as a raw string rather than parsed JSON. The server sends it as text/calendar; charset=utf-8 with a download filename built from the event's uid, and the SDK requests that type and returns the body untouched.

The document declares METHOD:PUBLISH, and the content type carries no method parameter. That is deliberate: a REQUEST document makes a calendar client offer accept and decline and reply to the organiser, and this endpoint has no authority to invite anyone. Import it to show what the event currently is, not to send an invitation.

It holds one VEVENT with the attendees and their participation status, the recurrence rule, excluded dates and alarms. Lines end in CRLF and long lines are folded. DTSTAMP is the time of the request, so two downloads of an unchanged event differ on that line.

Параметры

idstringОбязательно

Event id, the eventId of an occurrence.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A string, the iCalendar text from BEGIN:VCALENDAR to END:VCALENDAR.

Пример

var ics = (await client.Calendar.GetEventIcsAsync("cal_8d3f0a2b9c4e41f7a6b5c2d1")); Console.WriteLine(ics);

Примечания

  • Errors still come back as JSON and throw OpenEmailApiException, so a failure never comes back as a string.

  • Timed events are written in the zone they were created in, as local times with a TZID and a VTIMEZONE that carries the rules of that zone, and all day events as DATE values.

  • A narrowed key gets a 404 on the same terms as GetEventAsync.

Также доступно в

API
GET /calendar/events/{id}/ics
TypeScript
calendar.getEventIcs()
Python
calendar.get_event_ics()
Ruby
calendar.get_event_ics
PHP
calendar->getEventIcs
Go
Calendar.GetEventIcs
Java
calendar().getEventIcs
CLI
openemail calendar get-event-ics

Calendar.CreateEventAsync

Put an event on the calendar

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> CreateEventAsync(    IReadOnlyDictionary<string, object?> body,    string? apiKey = null,    CancellationToken cancellationToken = default)

Creates an event, as New event on the Calendar page of the app does. start and end take a DateTimeOffset or ISO 8601 with a zone, and the SDK sends a DateTimeOffset as a UTC instant. timezone is the IANA zone the event belongs to, which decides what an all-day event means.

With attendees, an invitation goes to each of them by email from from, which has to be an address the key may send as, so the call also needs emails:send. Send ["sendInvites"] = false to keep it to your own calendar.

Параметры

summarystringОбязательно

The title, 1 to 255 characters.

startDateTimeOffset or stringОбязательно

When it starts, a DateTimeOffset or ISO 8601 with a zone. A DateTimeOffset is sent as an instant in UTC.

endDateTimeOffset or stringОбязательно

When it ends, after start and at most two years later.

descriptionstring

Notes about the event, up to 8,000 characters.

locationstring

Where it is: a room, an address or a link.

urlstring

A link that belongs to the event.

allDaybool

Whether it fills whole days. start and end then mark the days.

timezonestring

The IANA zone the event belongs to, UTC unless you say.

recurrencestring

An RRULE such as FREQ=WEEKLY;BYDAY=MO when it repeats.

attendeeslist

Up to 200 people to invite, each a dictionary with email and, if you like, name and optional.

reminderslist

Up to five reminders, each a dictionary with minutesBefore and, if you like, action (DISPLAY, EMAIL or AUDIO, as in OpenEmail\Constants\CalendarReminderActions).

transparencystring

OPAQUE shows you busy and TRANSPARENT free, as in OpenEmail\Constants\CalendarTransparencies.

visibilitystring

PUBLIC, PRIVATE or CONFIDENTIAL, as in OpenEmail\Constants\CalendarVisibilities.

sendInvitesbool

False keeps the change to your own calendar, and sends nothing.

fromstring

The address the invitations come from. It has to be one the key may send as.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the new event, shaped like the one Calendar.GetEventAsync returns, with its attendees and their responses.

Пример

var entry = await client.Calendar.CreateEventAsync(new Body{    ["summary"] = "Planning",    ["start"] = DateTimeOffset.Parse("2026-10-12 09:00Z"),    ["end"] = DateTimeOffset.Parse("2026-10-12 09:30Z"),    ["timezone"] = "Europe/London",    ["attendees"] = new[] { new Body { ["email"] = "[email protected]", ["name"] = "Ada Lovelace" } },    ["reminders"] = new[] { new Body { ["minutesBefore"] = 10 } },    ["from"] = "[email protected]",}); Console.WriteLine($"{entry["id"]} {entry["start"]}");

Примечания

  • The SDK does not retry it, because a second call makes a second event and invites everybody again.

  • A key that may not send as from is refused with 403 from_address_forbidden, and an event with attendees and no from with 422 invalid_parameter. Invitations without emails:send are a 403 insufficient_scope.

Также доступно в

API
POST /calendar/events
TypeScript
calendar.createEvent()
Python
calendar.create_event()
Ruby
calendar.create_event
PHP
calendar->createEvent
Go
Calendar.CreateEvent
Java
calendar().createEvent
CLI
openemail calendar create-event

Calendar.UpdateEventAsync

Change an event

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> UpdateEventAsync(    string id,    IReadOnlyDictionary<string, object?> patch,    string? apiKey = null,    CancellationToken cancellationToken = default)

Changes an event you organise. A field you leave out keeps its value, and attendees replaces the whole list. Everyone invited gets the updated invitation by email from from, so a change to an event with attendees needs emails:send too, unless sendInvites is false.

Параметры

idstringОбязательно

Event id, the eventId of an occurrence, such as cal_ followed by 24 hex characters.

summarystring

The title, 1 to 255 characters.

startDateTimeOffset or string

When it starts, a DateTimeOffset or ISO 8601 with a zone. A DateTimeOffset is sent as an instant in UTC.

endDateTimeOffset or string

When it ends, after start and at most two years later.

descriptionstring

Notes about the event, up to 8,000 characters.

locationstring

Where it is: a room, an address or a link.

urlstring

A link that belongs to the event.

allDaybool

Whether it fills whole days. start and end then mark the days.

timezonestring

The IANA zone the event belongs to, UTC unless you say.

recurrencestring

An RRULE such as FREQ=WEEKLY;BYDAY=MO when it repeats.

attendeeslist

Up to 200 people to invite, each a dictionary with email and, if you like, name and optional. It replaces the whole list.

reminderslist

Up to five reminders, each a dictionary with minutesBefore and, if you like, action (DISPLAY, EMAIL or AUDIO, as in OpenEmail\Constants\CalendarReminderActions).

transparencystring

OPAQUE shows you busy and TRANSPARENT free, as in OpenEmail\Constants\CalendarTransparencies.

visibilitystring

PUBLIC, PRIVATE or CONFIDENTIAL, as in OpenEmail\Constants\CalendarVisibilities.

sendInvitesbool

False keeps the change to your own calendar, and sends nothing.

fromstring

The address the invitations come from. It has to be one the key may send as.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the event as it stands after the change, shaped like the one Calendar.GetEventAsync returns, with sequence one higher.

Пример

var entry = await client.Calendar.UpdateEventAsync("cal_3f9a1c7e5b2d48a06c1e9f4b", new Body{    ["start"] = "2026-10-12T10:00:00Z",    ["end"] = "2026-10-12T10:30:00Z",    ["from"] = "[email protected]",}); Console.WriteLine($"{entry["start"]}, sequence {entry["sequence"]}");

Примечания

  • The SDK does not retry it, because a retry after a lost response sends the update to everybody again.

  • An event organised by somebody else is refused with 403 not_organizer: answer it with RespondToEventAsync instead. An event the key does not reach is a 404.

Также доступно в

API
PATCH /calendar/events/{id}
TypeScript
calendar.updateEvent()
Python
calendar.update_event()
Ruby
calendar.update_event
PHP
calendar->updateEvent
Go
Calendar.UpdateEvent
Java
calendar().updateEvent
CLI
openemail calendar update-event

Calendar.DeleteEventAsync

Remove an event from the calendar

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> DeleteEventAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Removes an event for good, as Remove does in the app. Nobody else is told, so call off a meeting with others in it with CancelEventAsync instead.

Параметры

idstringОбязательно

Event id, the eventId of an occurrence, such as cal_ followed by 24 hex characters.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject with object, id and deleted set to true.

Пример

var deleted = await client.Calendar.DeleteEventAsync("cal_3f9a1c7e5b2d48a06c1e9f4b"); Console.WriteLine($"{deleted["id"]} is off the calendar");

Примечания

  • An event organised by somebody else is refused with 403 not_organizer, and an event that is gone or that the key does not reach is a 404.

Также доступно в

API
DELETE /calendar/events/{id}
TypeScript
calendar.deleteEvent()
Python
calendar.delete_event()
Ruby
calendar.delete_event
PHP
calendar->deleteEvent
Go
Calendar.DeleteEvent
Java
calendar().deleteEvent
CLI
openemail calendar delete-event

Calendar.CancelEventAsync

Call off a meeting

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> CancelEventAsync(    string id,    IReadOnlyDictionary<string, object?>? body = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Cancels a meeting you organise, as Cancel meeting does in the app. It stays on the calendar with status CANCELLED, and everyone invited is told it is off by email from from, so a meeting with attendees also needs emails:send.

Параметры

idstringОбязательно

Event id, the eventId of an occurrence, such as cal_ followed by 24 hex characters.

fromstring

The address the cancellation comes from. It has to be one the key may send as.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the event, shaped like the one Calendar.GetEventAsync returns, with status set to CANCELLED.

Пример

var entry = await client.Calendar.CancelEventAsync("cal_3f9a1c7e5b2d48a06c1e9f4b", body: new Body { ["from"] = "[email protected]" }); Console.WriteLine($"{entry["summary"]} is now {entry["status"]}");

Примечания

  • The SDK does not retry it, because a retry sends the cancellation again.

  • An event organised by somebody else is refused with 403 not_organizer.

Также доступно в

API
POST /calendar/events/{id}/cancel
TypeScript
calendar.cancelEvent()
Python
calendar.cancel_event()
Ruby
calendar.cancel_event
PHP
calendar->cancelEvent
Go
Calendar.CancelEvent
Java
calendar().cancelEvent
CLI
openemail calendar cancel-event

Calendar.RespondToEventAsync

Answer an invitation

Разрешенияcalendar:writeemails:send
Сигнатура
Task<JsonObject> RespondToEventAsync(    string id,    IReadOnlyDictionary<string, object?> body,    string? apiKey = null,    CancellationToken cancellationToken = default)

Accepts, declines or tentatively accepts an invitation, as the buttons of an invitation do in the app. The answer goes to the organiser by email from the invited address the key may send as, or from respondingAs when the invitation went to more than one of yours, so it needs emails:send as well.

Параметры

idstringОбязательно

Event id, the eventId of an occurrence, such as cal_ followed by 24 hex characters.

responsestringОбязательно

ACCEPTED, DECLINED or TENTATIVE, as in OpenEmail\Constants\CalendarResponses.

respondingAsstring

Which of your invited addresses answers, when there is more than one.

proposedStartDateTimeOffset or string

A new start to propose with your answer, a DateTimeOffset or ISO 8601 with a zone, sent together with proposedEnd. A DateTimeOffset is sent as an instant in UTC.

proposedEndDateTimeOffset or string

The end of the proposed time.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the event, shaped like the one Calendar.GetEventAsync returns, with your answer on your attendee row.

Пример

using OpenEmail.Constants; var entry = await client.Calendar.RespondToEventAsync("cal_3f9a1c7e5b2d48a06c1e9f4b", new Body { ["response"] = CalendarResponses.Accepted }); foreach (var attendee in entry["attendees"]?.AsArray() ?? []){    Console.WriteLine($"{attendee?["email"]}: {attendee?["partstat"]}");}

Примечания

  • An event that invited none of the addresses the key may send as is refused with 403 not_invited, and a cancelled meeting with 409 event_cancelled.

  • When the organiser cannot be reached, nothing changes and the call is a 409 reply_not_sent.

  • With proposedStart and proposedEnd the organiser gets a counter-proposal, as Propose a new time sends from Google Calendar and Outlook, and decides whether to move the meeting.

Также доступно в

API
POST /calendar/events/{id}/respond
TypeScript
calendar.respondToEvent()
Python
calendar.respond_to_event()
Ruby
calendar.respond_to_event
PHP
calendar->respondToEvent
Go
Calendar.RespondToEvent
Java
calendar().respondToEvent
CLI
openemail calendar respond-to-event

Calendar.DeclineProposalAsync

Decline a proposed time

Разрешенияcalendar:writeemails:send
Сигнатура
Task<JsonObject> DeclineProposalAsync(    string id,    IReadOnlyDictionary<string, object?> body,    string? apiKey = null,    CancellationToken cancellationToken = default)

Keeps the original time of a meeting you organise after a guest proposed another one, as Keep the original does on the event in the app. The guest is told by email from from, or from the organising address, so it needs emails:send as well. To take the proposed time instead, change the event with Calendar.UpdateEventAsync.

Параметры

idstringОбязательно

Event id, the eventId of an occurrence, such as cal_ followed by 24 hex characters.

attendeestringОбязательно

The guest whose proposal you decline, by email address.

fromstring

The address the answer is sent from, when it is not the organising address.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the event, shaped like the one Calendar.GetEventAsync returns, with the guest's proposedStart and proposedEnd cleared.

Пример

var entry = await client.Calendar.DeclineProposalAsync("cal_3f9a1c7e5b2d48a06c1e9f4b", new Body { ["attendee"] = "[email protected]" }); Console.WriteLine($"{entry["summary"]} keeps its time");

Примечания

Также доступно в

API
POST /calendar/events/{id}/decline-proposal
TypeScript
calendar.declineProposal()
Python
calendar.decline_proposal()
Ruby
calendar.decline_proposal
PHP
calendar->declineProposal
Go
Calendar.DeclineProposal
Java
calendar().declineProposal
CLI
openemail calendar decline-proposal

Calendar.ListFeedsAsync

List calendar links

Разрешенияcalendar:read
Сигнатура
Task<IReadOnlyList<JsonObject>> ListFeedsAsync(    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns the secret links that publish your calendar to other calendar apps, as the Share tab of the calendar settings in the app lists them. Anyone with a link can read what it shows, so treat url and webcalUrl like passwords.

Параметры

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A list of JsonObject items, each with id, name, mode, url, webcalUrl and when calendar apps last read it.

Пример

foreach (var feed in (await client.Calendar.ListFeedsAsync())){    Console.WriteLine($"{feed["name"]} ({feed["mode"]}): {feed["url"]}");}

Примечания

  • A key limited to particular addresses or domains is refused with 422 capability_unsupported, because a link covers the whole calendar.

Также доступно в

API
GET /calendar/feeds
TypeScript
calendar.listFeeds()
Python
calendar.list_feeds()
Ruby
calendar.list_feeds
PHP
calendar->listFeeds
Go
Calendar.ListFeeds
Java
calendar().listFeeds
CLI
openemail calendar list-feeds

Calendar.CreateFeedAsync

Create a calendar link

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> CreateFeedAsync(    IReadOnlyDictionary<string, object?> body,    string? apiKey = null,    CancellationToken cancellationToken = default)

Makes a secret link that publishes your calendar as an iCalendar feed, for Google Calendar (From URL), Outlook (Subscribe from web) or Apple Calendar (New subscription). full shows every detail, busy only the times you are busy. The calendar app reads the link again on its own schedule, usually every few hours.

Параметры

namestringОбязательно

The name calendar apps show for the calendar, up to 100 characters.

modestringОбязательно

full for every detail, busy for busy times only, as in OpenEmail\Constants\CalendarFeedModes.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the link with the new url and webcalUrl.

Пример

using OpenEmail.Constants; var feed = await client.Calendar.CreateFeedAsync(new Body { ["name"] = "Work (busy)", ["mode"] = CalendarFeedModes.Busy }); Console.WriteLine($"Paste into Google Calendar: {feed["url"]}");

Примечания

Также доступно в

API
POST /calendar/feeds
TypeScript
calendar.createFeed()
Python
calendar.create_feed()
Ruby
calendar.create_feed
PHP
calendar->createFeed
Go
Calendar.CreateFeed
Java
calendar().createFeed
CLI
openemail calendar create-feed

Calendar.ResetFeedAsync

Reset a calendar link

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> ResetFeedAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Replaces the secret in a calendar link, so the old address stops working everywhere it was shared. Paste the new address into the calendar apps you still want to update.

Параметры

idstringОбязательно

Calendar link id, cfd_ followed by 24 hex characters.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the link with its new url and webcalUrl.

Пример

var feed = await client.Calendar.ResetFeedAsync("cfd_3f9a1c7e5b2d48a06c1e9f4b"); Console.WriteLine($"{feed["url"]}");

Примечания

Также доступно в

API
POST /calendar/feeds/{id}/reset
TypeScript
calendar.resetFeed()
Python
calendar.reset_feed()
Ruby
calendar.reset_feed
PHP
calendar->resetFeed
Go
Calendar.ResetFeed
Java
calendar().resetFeed
CLI
openemail calendar reset-feed

Calendar.DeleteFeedAsync

Delete a calendar link

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> DeleteFeedAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Turns a calendar link off for good. Calendar apps that subscribed to it stop getting updates.

Параметры

idstringОбязательно

Calendar link id, cfd_ followed by 24 hex characters.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject with object, id and deleted set to true.

Пример

var deleted = await client.Calendar.DeleteFeedAsync("cfd_3f9a1c7e5b2d48a06c1e9f4b"); Console.WriteLine($"{deleted["id"]}");

Примечания

Также доступно в

API
DELETE /calendar/feeds/{id}
TypeScript
calendar.deleteFeed()
Python
calendar.delete_feed()
Ruby
calendar.delete_feed
PHP
calendar->deleteFeed
Go
Calendar.DeleteFeed
Java
calendar().deleteFeed
CLI
openemail calendar delete-feed

Calendar.ListSubscriptionsAsync

List calendar subscriptions

Разрешенияcalendar:read
Сигнатура
Task<IReadOnlyList<JsonObject>> ListSubscriptionsAsync(    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns the other calendars you subscribe to by link, such as a Google or Outlook calendar address, a team rota or public holidays, as Other calendars in the app lists them. Their events show on your calendar, read-only.

Параметры

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A list of JsonObject items, each with name, url, color, status, lastError and how many events it holds.

Пример

foreach (var subscription in (await client.Calendar.ListSubscriptionsAsync())){    Console.WriteLine($"{subscription["name"]}: {subscription["status"]}, {subscription["eventCount"]} events");}

Примечания

  • status is failing while reads fail and are retried, and stopped after ten failures in a row until you refresh it.

Также доступно в

API
GET /calendar/subscriptions
TypeScript
calendar.listSubscriptions()
Python
calendar.list_subscriptions()
Ruby
calendar.list_subscriptions
PHP
calendar->listSubscriptions
Go
Calendar.ListSubscriptions
Java
calendar().listSubscriptions
CLI
openemail calendar list-subscriptions

Calendar.CreateSubscriptionAsync

Subscribe to a calendar

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> CreateSubscriptionAsync(    IReadOnlyDictionary<string, object?> body,    string? apiKey = null,    CancellationToken cancellationToken = default)

Adds a calendar by its iCalendar link, an https, http or webcal address, such as the secret address of a Google calendar or a published Outlook calendar. It is read at once, then again about every half hour. name defaults to the name the calendar gives itself.

Параметры

urlstringОбязательно

The calendar link, https, http or webcal.

namestring

The name to show, up to 100 characters.

colorstring

The colour of its events, as in OpenEmail\Constants\CalendarColors.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the subscription with its first events read.

Пример

using OpenEmail.Constants; var holidays = await client.Calendar.CreateSubscriptionAsync(new Body { ["url"] = "webcal://example.com/holidays.ics", ["color"] = CalendarColors.Green }); Console.WriteLine($"{holidays["name"]}: {holidays["eventCount"]} events");

Примечания

Также доступно в

API
POST /calendar/subscriptions
TypeScript
calendar.createSubscription()
Python
calendar.create_subscription()
Ruby
calendar.create_subscription
PHP
calendar->createSubscription
Go
Calendar.CreateSubscription
Java
calendar().createSubscription
CLI
openemail calendar create-subscription

Calendar.UpdateSubscriptionAsync

Change a calendar subscription

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> UpdateSubscriptionAsync(    string id,    IReadOnlyDictionary<string, object?> patch,    string? apiKey = null,    CancellationToken cancellationToken = default)

Renames a subscription or gives it another colour.

Параметры

idstringОбязательно

Subscription id, csb_ followed by 24 hex characters.

namestring

The new name, up to 100 characters.

colorstring

The new colour, as in OpenEmail\Constants\CalendarColors.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the subscription as it stands now.

Пример

using OpenEmail.Constants; var subscription = await client.Calendar.UpdateSubscriptionAsync("csb_3f9a1c7e5b2d48a06c1e9f4b", new Body { ["name"] = "Team rota", ["color"] = CalendarColors.Purple }); Console.WriteLine($"{subscription["name"]}");

Примечания

Также доступно в

API
PATCH /calendar/subscriptions/{id}
TypeScript
calendar.updateSubscription()
Python
calendar.update_subscription()
Ruby
calendar.update_subscription
PHP
calendar->updateSubscription
Go
Calendar.UpdateSubscription
Java
calendar().updateSubscription
CLI
openemail calendar update-subscription

Calendar.RefreshSubscriptionAsync

Refresh a calendar subscription

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> RefreshSubscriptionAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Reads a subscribed calendar again now instead of waiting for the next half-hourly read, and restarts one that stopped after repeated failures.

Параметры

idstringОбязательно

Subscription id, csb_ followed by 24 hex characters.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject for the subscription after the read, with status and lastError.

Пример

var subscription = await client.Calendar.RefreshSubscriptionAsync("csb_3f9a1c7e5b2d48a06c1e9f4b"); if (subscription["lastError"] is not null){    Console.WriteLine($"Could not read it: {subscription["lastError"]}");}

Примечания

Также доступно в

API
POST /calendar/subscriptions/{id}/refresh
TypeScript
calendar.refreshSubscription()
Python
calendar.refresh_subscription()
Ruby
calendar.refresh_subscription
PHP
calendar->refreshSubscription
Go
Calendar.RefreshSubscription
Java
calendar().refreshSubscription
CLI
openemail calendar refresh-subscription

Calendar.DeleteSubscriptionAsync

Unsubscribe from a calendar

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> DeleteSubscriptionAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Removes a subscription and every event it brought onto your calendar.

Параметры

idstringОбязательно

Subscription id, csb_ followed by 24 hex characters.

apiKeystring?

Overrides the client's API key for this call only.

cancellationTokenCancellationToken

Cancels the request.

Возвращает

A JsonObject with object, id and deleted set to true.

Пример

var deleted = await client.Calendar.DeleteSubscriptionAsync("csb_3f9a1c7e5b2d48a06c1e9f4b"); Console.WriteLine($"{deleted["id"]}");

Примечания

Также доступно в

API
DELETE /calendar/subscriptions/{id}
TypeScript
calendar.deleteSubscription()
Python
calendar.delete_subscription()
Ruby
calendar.delete_subscription
PHP
calendar->deleteSubscription
Go
Calendar.DeleteSubscription
Java
calendar().deleteSubscription
CLI
openemail calendar delete-subscription

Calendar.ImportIcsAsync

Import a calendar file

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> ImportIcsAsync(    Stream data,    string? filename = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Sends an iCalendar (.ics) file as the request body and queues it. Its events become events of your own that you can edit, and nobody on them is sent anything, now or when you change them later, unless you ask for that on the change. Poll GetImportAsync until status is completed.

The file may be 10 MB and hold 25,000 events. Several calendars in one file are merged, and the report keeps their names. An event whose UID is already in the workspace is skipped and counted, never overwritten, so sending the same file twice adds nothing.

data is a readable Stream, and it goes out as text/calendar.

Параметры

dataStreamОбязательно

The .ics file: a readable Stream.

filenamestring?

The name to show for the file in the list of imports, at most 255 characters.

cancellationTokenCancellationToken

Cancels the request.

apiKeystring?

Overrides the client API key for this call only.

Возвращает

A JsonObject with status: queued.

Пример

await using var file = File.OpenRead("calendar.ics"); var import = await client.Calendar.ImportIcsAsync(file, filename: "calendar.ics"); Console.WriteLine($"{import["id"]} is {import["status"]}");

Примечания

  • A body that is not an iCalendar file is a 400 not_a_calendar_file, an empty one a 400 item_import_empty, and one holding more than 25,000 events a 400 too_many_events.

  • A file over 10 MB is a 413 item_import_too_large.

  • To send text you already hold, such as what GetEventIcsAsync returns, encode it first with new TextEncoder().encode(text).

  • An upload that outlasts the client Timeout fails as a network error, so raise it on the client for a large file on a slow connection.

  • Not retried automatically.

Также доступно в

API
POST /calendar/imports
TypeScript
calendar.importIcs()
Python
calendar.import_ics()
Ruby
calendar.import_ics
PHP
calendar->importIcs
Go
Calendar.ImportIcs
Java
calendar().importIcs
CLI
openemail calendar import-ics

Calendar.ListImportsAsync

List calendar imports

Разрешенияcalendar:readПостранично перебирает результаты
Сигнатура
Task<Page> ListImportsAsync(    int? limit = null,    string? cursor = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns one page of the calendar files and calendars brought in, newest first, each with what it added and what it left out. Beside the files sent with ImportIcsAsync it lists the calendars that came with a mailbox import, and those carry the id of that import in parentImportId.

Paging is keyset. limit: takes 1 to 100 and defaults to 25, and nextCursor goes back as cursor: while hasMore is true. ListAllImportsAsync and IterateImportsAsync do that walk for you.

Параметры

limitint?

Imports per page, a whole number from 1 to 100. The server defaults to 25.

cursorstring?

The nextCursor from the previous page. Never build one yourself.

cancellationTokenCancellationToken

Cancels the request.

apiKeystring?

Overrides the client API key for this call only.

Возвращает

A Page with items, hasMore and nextCursor.

Пример

var page = await client.Calendar.ListImportsAsync(limit: 10); foreach (var import in page){    Console.WriteLine($"{import["id"]} {import["source"]} {import["status"]}: {import["counts"]?["imported"]} events added");}

Примечания

  • source is file for an upload. takeout, caldav and microsoft came with a mailbox import.

  • A cursor that names no import is a 400 invalid_cursor.

  • A GET is retried automatically on network failure and on 408, 500, 502, 503 and 504 responses, up to the client MaxRetries, and on a 429 only when it carries a Retry-After of a minute or less.

Также доступно в

API
GET /calendar/imports
TypeScript
calendar.listImports()
Python
calendar.list_imports()
Ruby
calendar.list_imports
PHP
calendar->listImports
Go
Calendar.ListImports
Java
calendar().listImports
CLI
openemail calendar list-imports

Calendar.ListAllImportsAsync

Collect every calendar import into one list

Разрешенияcalendar:readПостранично перебирает результаты
Сигнатура
Task<IReadOnlyList<JsonObject>> ListAllImportsAsync(    int? limit = null,    string? cursor = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Follows nextCursor from page to page and returns every calendar import, newest first.

Everything is held in memory before the call returns. Prefer IterateImportsAsync when you can stop early. limit sets the page size of each request, not the total.

Параметры

limitint?

Page size per request, from 1 to 100, defaulting to 25 on the server.

cursorstring?

A cursor from an earlier page to start after.

cancellationTokenCancellationToken

Cancels the request in flight and rejects the whole walk.

apiKeystring?

Overrides the client API key for every page of this walk.

Возвращает

A list of JsonObject items holding every import across all pages.

Пример

var imports = await client.Calendar.ListAllImportsAsync(); Console.WriteLine($"{imports.Count} calendar imports, {imports.Count(import => (bool?)import["undoable"] == true)} of them can be undone");

Примечания

  • A failure on any page rejects the whole call, and the imports already fetched are discarded.

Также доступно в

API
GET /calendar/imports
TypeScript
calendar.listAllImports()
Python
calendar.list_all_imports()
Ruby
calendar.list_all_imports
PHP
calendar->listAllImports
Go
Calendar.ListAllImports
Java
calendar().listAllImports

Calendar.IterateImportsAsync

Stream calendar imports one at a time

Разрешенияcalendar:readПостранично перебирает результаты
Сигнатура
IAsyncEnumerable<JsonObject> IterateImportsAsync(    int? limit = null,    string? cursor = null,    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns an IAsyncEnumerable<JsonObject> that yields calendar imports one by one, newest first, and requests the next page only once the current one is drained. Nothing is fetched until you consume it, and breaking out of the loop stops the requests.

Параметры

limitint?

Page size per request, from 1 to 100, defaulting to 25 on the server.

cursorstring?

A cursor from an earlier page to start after.

cancellationTokenCancellationToken

Cancels the request in flight and rejects the whole walk.

apiKeystring?

Overrides the client API key for every page of this walk.

Возвращает

An IAsyncEnumerable<JsonObject> yielding one import per step.

Пример

await foreach (var import in client.Calendar.IterateImportsAsync(limit: 50)){    if ((string?)import["status"] == "failed")    {        Console.WriteLine($"{import["id"]} failed");         break;    }}

Примечания

  • The generator is lazy, so an abandoned loop costs only the pages you consumed.

Также доступно в

API
GET /calendar/imports
TypeScript
calendar.iterateImports()
Python
calendar.iterate_imports()
Ruby
calendar.iterate_imports
PHP
calendar->iterateImports
Go
Calendar.IterateImports
Java
calendar().iterateImports

Calendar.GetImportAsync

Get a calendar import

Разрешенияcalendar:read
Сигнатура
Task<JsonObject> GetImportAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Returns one calendar import with its counts and its report: the calendars it read, how many events it left out and why, and up to 20 of the events it left out. Poll it after ImportIcsAsync until status is completed or failed.

counts.imported is what was added and counts.skipped what was left out, which report.skipped breaks down by reason: uid-taken for an event that was already here, no-start for one with no start time, invalid for one that could not be read and empty for a file or calendar that held no events.

Параметры

idstringОбязательно

Calendar import id, iimp_ followed by 24 hex characters.

cancellationTokenCancellationToken

Cancels the request.

apiKeystring?

Overrides the client API key for this call only.

Возвращает

A JsonObject with status, counts, report, undoable and when it started, finished and was undone.

Пример

var import = await client.Calendar.GetImportAsync("iimp_3f9a1c07d2b84e6a9c5b1f20"); Console.WriteLine($"{import["status"]}: {import["counts"]?["imported"]} added, {import["counts"]?["skipped"]} left out");

Примечания

  • An id that names no calendar import is a 404 item_import_not_found.

  • A GET is retried automatically on network failure and on 408, 500, 502, 503 and 504 responses, up to the client MaxRetries, and on a 429 only when it carries a Retry-After of a minute or less.

Также доступно в

API
GET /calendar/imports/{id}
TypeScript
calendar.getImport()
Python
calendar.get_import()
Ruby
calendar.get_import
PHP
calendar->getImport
Go
Calendar.GetImport
Java
calendar().getImport
CLI
openemail calendar get-import

Calendar.UndoImportAsync

Remove what a calendar import added

Разрешенияcalendar:write
Сигнатура
Task<JsonObject> UndoImportAsync(    string id,    string? apiKey = null,    CancellationToken cancellationToken = default)

Deletes every event the import added, changed since or not, and marks the import undone. Nobody is told. Events that were skipped because they were already here are not touched.

Параметры

idstringОбязательно

Calendar import id, iimp_ followed by 24 hex characters.

cancellationTokenCancellationToken

Cancels the request.

apiKeystring?

Overrides the client API key for this call only.

Возвращает

A JsonObject with status: undone and undoneAt set.

Пример

try{    var undone = await client.Calendar.UndoImportAsync("iimp_3f9a1c07d2b84e6a9c5b1f20");     Console.WriteLine($"{undone["id"]} is {undone["status"]} since {undone["undoneAt"]}");}catch (OpenEmailApiException error) when (error.IsConflict){    Console.WriteLine("That import is still running or was already removed");}

Примечания

  • An import that is still running, or was already removed, is a 409 item_import_not_undoable. undoable on the import says whether the call would remove anything.

  • An id that names no calendar import is a 404 item_import_not_found.

  • Not retried automatically.

Также доступно в

API
POST /calendar/imports/{id}/undo
TypeScript
calendar.undoImport()
Python
calendar.undo_import()
Ruby
calendar.undo_import
PHP
calendar->undoImport
Go
Calendar.UndoImport
Java
calendar().undoImport
CLI
openemail calendar undo-import