client.Sending
Cada método de este espacio de nombres: su firma, sus parámetros, lo que devuelve y un ejemplo.
Métodos
How mail leaves the workspace: the two lanes it travels in, transactional for app mail and broadcast for newsletters, each with its bounce and complaint numbers, the switch that resumes a paused lane, and the dedicated IPs of a workspace that bought one.
Sending.ListStreamsAsync
List the sending lanes
Task<JsonObject> ListStreamsAsync( string? apiKey = null, CancellationToken cancellationToken = default)Returns the two lanes mail travels in, transactional for app mail such as password resets, receipts and codes, and broadcast for newsletters, each with its state and its numbers for the last 7 days: recipients, bounced and complained, the two rates, and the limits the broadcast lane is held to. The lanes have their own queues and their own reputation, so a newsletter never holds up or harms app mail.
The broadcast lane pauses itself when more than 4% of its recipients bounced or more than 0.2% reported the mail as spam over those 7 days, once it reached enough recipients to judge. A paused lane says when and why in pausedAt and pausedReason, and app mail keeps going out. The count starts again when a lane is resumed, which resumedAt gives.
Parámetros
cancellationTokenCancellationTokenCancels the request.
apiKeystring?Overrides the client's API key for this call only.
Devuelve
A JsonObject with one object per lane in data: stream, status, pausedAt, pausedReason, resumedAt, window and limits.
Ejemplo
using OpenEmail.Constants; var lanes = await client.Sending.ListStreamsAsync(); foreach (var lane in lanes["data"]?.AsArray() ?? []){ Console.WriteLine($"{lane?["stream"]} is {lane?["status"]}{((string?)lane?["status"] == SendingStreamStatuses.Paused ? $" since {lane?["pausedAt"]}: {lane?["pausedReason"]}" : string.Empty)}");}Notas
Only the broadcast lane pauses. The transactional lane is always
active.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 aRetry-Afterof a minute or less.
También disponible en
Sending.ResumeStreamAsync
Resume a paused lane
Task<JsonObject> ResumeStreamAsync( string stream, string? apiKey = null, CancellationToken cancellationToken = default)Resumes the broadcast lane after it was paused for too many bounces or complaints, as Resume does on the Analytics page of the app. Broadcasts and messages that were on hold continue at once, and the 7 day count starts again from now, so clean the audience first: a lane resumed onto the same list pauses again.
Only the workspace owner may do it: an API key acts for the owner, and an access token that acts for a member is 403 owner_only.
Parámetros
streamstringObligatorioThe lane to resume,
broadcast. The transactional lane never pauses.cancellationTokenCancellationTokenCancels the request.
apiKeystring?Overrides the client's API key for this call only.
Devuelve
A JsonObject, now with status active and resumedAt set.
Ejemplo
using OpenEmail.Constants; try{ var lane = await client.Sending.ResumeStreamAsync(SendStreams.Broadcast); Console.WriteLine($"{lane["stream"]} resumed at {lane["resumedAt"]}");}catch (OpenEmailApiException error) when (error.IsConflict){ Console.WriteLine("The broadcast lane was not paused");}Notas
With an OAuth access token it asks for a verification code: until the app has verified one, it is refused with 403
step_up_required. An API key is never asked.A lane that is not paused is 409
stream_not_paused.The SDK does not retry it.
También disponible en
Sending.ListDedicatedIpsAsync
List dedicated IPs
Task<JsonObject> ListDedicatedIpsAsync( string? apiKey = null, CancellationToken cancellationToken = default)Returns the dedicated sending IPs of the workspace, bought as an add-on with Billing.StartAddOnCheckoutAsync. A new IP is warmed up over several weeks: warmupPercent says how far it is, and until it reaches 100 part of the mail still leaves through the shared IPs, so nothing is held back while it warms. status is warming until then and ready after.
A workspace without the add-on gets an empty list and sends through the shared IPs.
Parámetros
cancellationTokenCancellationTokenCancels the request.
apiKeystring?Overrides the client's API key for this call only.
Devuelve
A JsonObject with one object per IP in data: ip, status, pool, poolStatus, warmupPercent, assignedAt, readyAt and checkedAt.
Ejemplo
var addresses = await client.Sending.ListDedicatedIpsAsync(); foreach (var address in addresses["data"]?.AsArray() ?? []){ Console.WriteLine($"{address?["ip"]} is {address?["status"]}, {address?["warmupPercent"]}% warmed up");}Notas
The warm-up is read from the sending service every few minutes, and
checkedAtsays when.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 aRetry-Afterof a minute or less.
También disponible en
Sending.GetDedicatedIpAsync
Read a dedicated IP
Task<JsonObject> GetDedicatedIpAsync( string ip, string? apiKey = null, CancellationToken cancellationToken = default)Returns one dedicated IP of the workspace with its status and how far its warm-up has come.
Parámetros
ipstringObligatorioThe IP address, as
ListDedicatedIpsAsyncreturns it, such as203.0.113.24.cancellationTokenCancellationTokenCancels the request.
apiKeystring?Overrides the client's API key for this call only.
Devuelve
A JsonObject with ip, status, pool, poolStatus, warmupPercent, assignedAt, readyAt and checkedAt.
Ejemplo
var address = await client.Sending.GetDedicatedIpAsync("203.0.113.24"); Console.WriteLine($"{address["ip"]} is {address["status"]}, last checked {address["checkedAt"]}");Notas
An IP that does not belong to the workspace is a 404
resource_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 aRetry-Afterof a minute or less.