{"id":20290,"date":"2024-12-11T00:00:00","date_gmt":"2024-12-11T00:00:00","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/enviar-email-con-c-sharp\/"},"modified":"2026-09-14T23:33:32","modified_gmt":"2026-09-14T23:33:32","slug":"enviar-email-con-c-sharp","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/","title":{"rendered":"Env\u00edo de emails usando C# y la API de Mailgun"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">.NET es uno de los <a href=\"https:\/\/survey.stackoverflow.co\/2024\/technology#2-web-frameworks-and-technologies\" target=\"_tabs\" rel=\"noopener noreferrer\">frameworks web m\u00e1s populares, estables y admirados<\/a> que puedes utilizar para crear aplicaciones web modernas. Las herramientas que proporciona .NET pueden ayudarte a empezar r\u00e1pidamente y a mantener tus aplicaciones en el futuro. Con \u00e9l, puedes crear desde peque\u00f1os microservicios muy espec\u00edficos hasta aplicaciones web completas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sin embargo, a la larga, toda aplicaci\u00f3n de la vida real necesita poder enviar <a href=\"https:\/\/www.mailgun.com\/solutions\/use-cases\/transactional-email\/\" target=\"_tabs\" rel=\"noopener noreferrer\">emails transaccionales<\/a> (como la verificaci\u00f3n de cuentas, el restablecimiento de contrase\u00f1as, los informes de resumen autom\u00e1ticos diarios o mensuales, etc.). Aunque .NET ofrece herramientas que te ayudan a enviar emails, no dispone de la infraestructura de nivel de producci\u00f3n que necesitas para enviarlos de forma fiable y eficaz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo, aprender\u00e1s a utilizar la API HTTP de Mailgun para enviar emails transaccionales desde tus aplicaciones .NET y asegurarte de que tu integraci\u00f3n sea fiable, escalable y segura.<\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-7234\"><p class=\"h5 m-0\" id=\"toc-title-7234\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#como-enviar-emails-usando-la-api-de-mailgun\">C\u00f3mo enviar emails usando la API de Mailgun<\/a><a class=\"scrollme link-body-color\" href=\"#configura-tu-cuenta-de-mailgun\">Configura tu cuenta de Mailgun<\/a><a class=\"scrollme link-body-color\" href=\"#crea-un-nuevo-proyecto-en-c\">Crea un nuevo proyecto en C#<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#mas-informacion-sobre-los-puntos-de-conexion-de-la-api-de-mailgun\">M\u00e1s informaci\u00f3n sobre los puntos de conexi\u00f3n de la API de Mailgun<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#envia-tu-primer-email-con-la-api-de-mailgun\">Env\u00eda tu primer email con la API de Mailgun<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#gestion-de-respuestas-y-errores\">Gesti\u00f3n de respuestas y errores<\/a><a class=\"scrollme link-body-color\" href=\"#gestion-de-los-codigos-de-error-400\">Gesti\u00f3n de los c\u00f3digos de error 400<\/a><a class=\"scrollme link-body-color\" href=\"#gestion-de-los-codigos-de-error-500\">Gesti\u00f3n de los c\u00f3digos de error 500<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">05<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#integracion-de-emails-lista-para-la-produccion\">Integraci\u00f3n de emails lista para la producci\u00f3n<\/a><a class=\"scrollme link-body-color\" href=\"#protege-tu-clave-de-api\">Protege tu clave de API<\/a><a class=\"scrollme link-body-color\" href=\"#otras-funciones-para-entornos-de-produccion\">Otras funciones para entornos de producci\u00f3n<\/a><a class=\"scrollme link-body-color\" href=\"#integracion-con-el-ecosistema-net\">Integraci\u00f3n con el ecosistema .NET<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">06<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#en-resumen\">En resumen<\/a><\/div><\/div><\/nav>\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> <a href='https:\/\/www.mailgun.com\/'>Mailgun<\/a> es un servicio de env\u00edo de emails transaccionales que puede impulsar tus aplicaciones .NET para enviar emails listos para la producci\u00f3n. Puedes elegir entre usar el <a href='https:\/\/www.mailgun.com\/features\/smtp-server\/'>servicio SMTP<\/a> de Mailgun o su <a href='https:\/\/www.mailgun.com\/features\/email-api\/'>API HTTP<\/a> para lograr una entrega de emails transaccionales de mayor rendimiento.<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo enviar emails usando la API de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de empezar este tutorial, necesitar\u00e1s los siguientes requisitos previos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Conocimientos b\u00e1sicos de C# y .NET<\/li>\n\n\n\n<li>Cualquier IDE moderno como Visual Studio, JetBrains Rider o Visual Studio Code<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Si decides no usar Visual Studio y al ejecutar dotnet &#8211;info desde una terminal no tienes \u00e9xito, entonces tendr\u00e1s que <a href=\"https:\/\/dotnet.microsoft.com\/en-us\/download\" target=\"_tabs\" rel=\"noopener noreferrer\">descargar e instalar el \u00faltimo SDK de .NET<\/a>.<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> .NET es un framework multiplataforma, por lo que puedes instalarlo en Windows, Mac y Linux. Si tienes problemas para crear una clave de API, puedes seguir <a href='https:\/\/help.mailgun.com\/hc\/en-us\/articles\/203380100-Where-can-I-find-my-API-keys-and-SMTP-credentials'>estas instrucciones<\/a>.<\/div>\r\n    <\/div>\r\n\n\n\n<h3 class=\"wp-block-heading\">Configura tu cuenta de Mailgun<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Empieza por <a href=\"https:\/\/signup.mailgun.com\/new\/signup\" target=\"_tabs\" rel=\"noopener noreferrer\">crear una cuenta gratuita de Mailgun<\/a>. Una vez que hayas iniciado sesi\u00f3n, crea una nueva clave de API y gu\u00e1rdala para usarla m\u00e1s adelante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para el env\u00edo de emails en producci\u00f3n, debes registrar un dominio de tu propiedad en Mailgun. En este tutorial, usar\u00e1s el <a href=\"https:\/\/app.mailgun.com\/mg\/sending\/domains?domains=%7B%22limit%22%3A10%2C%22region%22%3A%22us1%22%2C%22search%22%3A%22sandbox%22%2C%22skip%22%3A0%7D\" target=\"_tabs\" rel=\"noopener noreferrer\">dominio sandbox<\/a> proporcionado por Mailgun.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Crea un nuevo proyecto en C#<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando hayas configurado tu cuenta de Mailgun, tendr\u00e1s que crear una nueva soluci\u00f3n web .NET MVC y configurar algunas herramientas adicionales para que te ayuden a enviar emails transaccionales con .NET.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abre una terminal y ejecuta dotnet new mvc -n MailDemo. Este comando crea un nuevo proyecto web .NET usando una arquitectura MVC dentro de una nueva carpeta \/MailDemo. A continuaci\u00f3n, ejecuta cd MailDemo para navegar a la nueva carpeta que se ha creado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s de acceder a la carpeta, debes a\u00f1adir tus valores de configuraci\u00f3n en appsettings.json. A\u00f1ade una nueva entrada JSON llamada \u201cMailgun\u201d. El valor para Mailgun:ApiKey es la clave de API que creaste en la secci\u00f3n anterior (m\u00e1s adelante aprender\u00e1s a proteger tus claves de API). Mailgun:Domain es el dominio sandbox que ya se ha creado para ti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tu archivo appsettings.json completo deber\u00eda ser as\u00ed:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    {rn    &quot;Logging&quot;: {rn        &quot;LogLevel&quot;: {rn            &quot;Default&quot;: &quot;Information&quot;,rn            &quot;Microsoft.AspNetCore&quot;: &quot;Warning&quot;rn        }rn    },rn    &quot;AllowedHosts&quot;: &quot;*&quot;,rn    &quot;Mailgun&quot;: {rn        &quot;ApiKey&quot;: &quot;&lt;Your API Key&gt;&quot;,rn        &quot;Domain&quot;: &quot;&lt;Your sandbox domain&gt;&quot;rn    }rn}\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, tienes que configurar un <a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/extensions\/httpclient-factory#named-clients\" target=\"_tabs\" rel=\"noopener noreferrer\">HttpClient con nombre<\/a> para poder reutilizar f\u00e1cilmente los par\u00e1metros predeterminados. Para ello, abre Program.cs. La parte superior del archivo deber\u00eda ser algo as\u00ed:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    using System.Net.Http.Headers;rnusing System.Text;rnrnvar builder = WebApplication.CreateBuilder(args);rnrn\/\/ Add services to the containerrnbuilder.Services.AddControllersWithViews();rnrn\/\/ Set up your named HttpClient for easy reusernbuilder.Services.AddHttpClient(&quot;Mailgun&quot;, client =&gt;rn{rn    \/\/ Grab values from the configurationrn    var apiKey = builder.Configuration.GetValue&lt;string&gt;(&quot;Mailgun:ApiKey&quot;);rn    var base64Auth = Convert.ToBase64String(Encoding.ASCII.GetBytes($&quot;api:{apiKey}&quot;));rn    var domain = builder.Configuration.GetValue&lt;string&gt;(&quot;Mailgun:Domain&quot;);rnrn    \/\/ Set default values on the HttpClientrn    client.BaseAddress = new Uri($&quot;https:\/\/api.mailgun.net\/v3\/{domain}\/messages&quot;);rn    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(&quot;Basic&quot;, base64Auth);rn});rnrnvar app = builder.Build();rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Como solo vas a enviar emails, tu HttpClient se configura con la URL completa de la API HTTP de Mailgun que se utiliza para enviar emails.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Llegados a este punto, todo lo que necesitas para enviar tu primer email est\u00e1 listo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00e1s informaci\u00f3n sobre los puntos de conexi\u00f3n de la API de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El HttpClient est\u00e1 configurado para enviar peticiones HTTP al punto de conexi\u00f3n https:\/\/api.mailgun.net\/v3\/{domain}\/messages. Mailgun tambi\u00e9n ofrece otros puntos de conexi\u00f3n para ayudarte a disponer de una herramienta s\u00f3lida e integral con la que gestionar y enviar emails transaccionales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enviar un email: POST \/v3\/{domain_name}\/messages<\/li>\n\n\n\n<li>Enviar un email en formato MIME: POST \/v3\/{domain_name}\/messages.mime<\/li>\n\n\n\n<li>Recuperar un email almacenado: GET \/v3\/domains\/{domain_name}\/messages\/{storage_key}<\/li>\n\n\n\n<li>Ver tus dominios: GET \/v4\/domains<\/li>\n\n\n\n<li>Crear un nuevo dominio: POST \/v4\/domains<\/li>\n\n\n\n<li>Ver una lista paginada de todos los eventos entrantes y salientes: GET \/v3\/{domain_name}\/events<\/li>\n\n\n\n<li>Ver una lista paginada de todos los rebotes: GET \/v3\/{domainID}\/bounces<\/li>\n<\/ul>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> Puedes ver los dem\u00e1s puntos de conexi\u00f3n disponibles consultando la <a href='https:\/\/documentation.mailgun.com\/docs\/mailgun\/api-reference\/openapi-final\/tag\/Messages\/'>documentaci\u00f3n de referencia de la API de Mailgun<\/a>.<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Env\u00eda tu primer email con la API de Mailgun<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de enviar tu primer email transaccional, aseg\u00farate de que la direcci\u00f3n de email del destinatario que utilizas sea uno de los destinatarios autorizados para tu dominio sandbox. En tu cuenta de Mailgun, <a href=\"https:\/\/app.mailgun.com\/mg\/sending\/domains\" target=\"_tabs\" rel=\"noopener noreferrer\">ve a tus dominios<\/a>, abre tu dominio sandbox y, en la parte derecha, a\u00f1ade tu email personal como destinatario autorizado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4064\" width=\"1570\" height=\"812\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.20.57_PM.png\" alt=\"Overview Screen\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.20.57_PM.png 1570w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.20.57_PM-300x155.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.20.57_PM-768x397.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.20.57_PM-1024x530.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.20.57_PM-1536x794.png 1536w\" sizes=\"(max-width: 1570px) 100vw, 1570px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, crea un nuevo archivo en \/Controllers\/OrderController.cs y reemplaza el contenido del archivo por el siguiente:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    using System.Diagnostics;rnusing Microsoft.AspNetCore.Mvc;rnusing MailDemo.Models;rnusing System.Text;rnusing System.Net.Mime;rnrnnamespace MailDemo.Controllers;rnrnpublic class OrderController : Controllerrn{rn    private readonly HttpClient _httpClient;rn    private readonly IConfiguration _config;rnrn    public OrderController(IHttpClientFactory httpClientFactory, IConfiguration config)rn    {rn        \/\/ Get your named HttpClient that is preconfiguredrn        this._httpClient = httpClientFactory.CreateClient(&quot;Mailgun&quot;);rn        this._config = config;rn    }rnrn    public async Task&lt;IActionResult&gt; Confirm()rn    {rn        using MultipartFormDataContent form = new();rnrn        \/\/ Local function keeps this code a bit clearerrn        void SetFormParam(string key, string value) =&gt;rn        form.Add(new StringContent(value, Encoding.UTF8, MediaTypeNames.Text.Plain), key);rnrn        SetFormParam(&quot;from&quot;, $&quot;Test User &lt;postmaster@{this._config.GetValue&lt;string&gt;(&quot;Mailgun:Domain&quot;)}&gt;&quot;);rn        SetFormParam(&quot;to&quot;, &quot;your_authorized_recipient.com&quot;);rn        SetFormParam(&quot;subject&quot;, &quot;Hello World!&quot;);rn        SetFormParam(&quot;text&quot;, &quot;My first transactional email!&quot;);rn        SetFormParam(&quot;html&quot;, @&quot;&lt;html&gt;&lt;body&gt;&lt;p style=&quot;&quot;color:blue;&quot;&quot;&gt;My first transactional email!&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;&quot;);rnrn        var result = await this._httpClient.PostAsync(string.Empty, form);rnrn        if (!result.IsSuccessStatusCode)rn        {rn            return new JsonResult(await result.Content.ReadAsStringAsync());rn        }rnrn        return new JsonResult(@&quot;Your order was confirmed. You should get an email soon!&quot;);rn    }rn}rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Ejecuta dotnet run desde tu terminal para iniciar tu aplicaci\u00f3n web. Despu\u00e9s, abre un navegador web y ve a \/order\/confirm. Deber\u00edas recibir un email en tu bandeja de entrada en un par de segundos:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4068\" width=\"1646\" height=\"936\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.21.06_PM.png\" alt=\"Hello World Screen Shot\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.21.06_PM.png 1646w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.21.06_PM-300x171.png 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.21.06_PM-768x437.png 768w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.21.06_PM-1024x582.png 1024w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/Screenshot_2024-12-10_at_5.21.06_PM-1536x873.png 1536w\" sizes=\"(max-width: 1646px) 100vw, 1646px\" \/><\/figure>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> Es posible que el email se env\u00ede a tu carpeta de spam porque a\u00fan no has registrado el dominio. De momento, no pasa nada.<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Gesti\u00f3n de respuestas y errores<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Por desgracia, a veces las cosas salen mal. Por ejemplo, tu clave de API podr\u00eda tener un error tipogr\u00e1fico, puede que no a\u00f1adieras todos los campos obligatorios a la petici\u00f3n HTTP o podr\u00edas alcanzar los l\u00edmites de frecuencia de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una petici\u00f3n HTTP fallida a la API de Mailgun devolver\u00e1 uno de cuatro c\u00f3digos de error HTTP distintos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>400: Hay algo incorrecto en el formato de la petici\u00f3n.<\/li>\n\n\n\n<li>401: Error de autenticaci\u00f3n.<\/li>\n\n\n\n<li>429: Has alcanzado el l\u00edmite de frecuencia de Mailgun.<\/li>\n\n\n\n<li>500: Algo ha fallado en la red o por parte de Mailgun.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos c\u00f3mo puedes gestionar algunos de estos escenarios de error.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gesti\u00f3n de los c\u00f3digos de error 400<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Siempre que te devuelvan un c\u00f3digo de estado HTTP 400, significa que tu carga \u00fatil o formato eran incorrectos. Por ejemplo, Mailgun responder\u00e1 con un c\u00f3digo de estado HTTP 400 si falta un campo obligatorio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En estos casos, hay un enfoque general que puedes adoptar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lanza una excepci\u00f3n, ya que se trata de un escenario de fallo que no se puede recuperar.<\/li>\n\n\n\n<li>Registra la excepci\u00f3n y los motivos de la misma.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo para ello podr\u00eda ser similar a este:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    if (!result.IsSuccessStatusCode)rn{rn    var status = (int) result.StatusCode;rnrn    if (status == 400)rn    {rn        var responseContent = await result.Content.ReadAsStringAsync();rn        var exception = new BadHttpRequestException(&quot;Mailgun 400 HTTP status code&quot;);rnrn        this._logger.LogError(exception, exception.Message, responseContent);rn        throw exception;rn    }rn}rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Puede que tambi\u00e9n quieras adoptar un enfoque similar con el c\u00f3digo de estado HTTP 401.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Gesti\u00f3n de los c\u00f3digos de error 500<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Siempre que recibas un c\u00f3digo de estado HTTP 500, puede significar que algo ha fallado por parte de Mailgun o que se ha producido un problema general de red. En estos casos, hay distintos enfoques que puedes adoptar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pon el email en cola para volver a intentarlo m\u00e1s tarde.<\/li>\n\n\n\n<li>En la misma ruta del c\u00f3digo, vuelve a intentarlo tras un breve periodo.<\/li>\n\n\n\n<li>Emplea una t\u00e9cnica avanzada como un <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/architecture\/patterns\/circuit-breaker\" target=\"_tabs\" rel=\"noopener noreferrer\">cortacircuitos<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n se muestra c\u00f3mo ser\u00eda un enfoque b\u00e1sico de reintentos:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    if (!result.IsSuccessStatusCode)rn{rn    var status = (int) result.StatusCode;rnrn    if (status == 500)rn    {rn        \/\/ Retry the email after 1 second in hopes that the error was transientrnrn        await Task.Delay(1000);rn        result = await _httpClient.PostAsync(string.Empty, form);rnrn        if (!result.IsSuccessStatusCode)rn        {rn            \/\/ Log and throw an exception like you did in the previous examplern        }rn    }rn}rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">En este escenario, si recibes un c\u00f3digo de estado 500, esperar\u00e1s un segundo y volver\u00e1s a intentar la petici\u00f3n HTTP. Si la petici\u00f3n reintentada tambi\u00e9n falla, la registrar\u00e1s y lanzar\u00e1s una excepci\u00f3n del mismo modo que hiciste en el caso del c\u00f3digo de estado 400.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para darte una idea de c\u00f3mo ser\u00eda el c\u00f3digo en general, aqu\u00ed tienes un esquema de c\u00f3mo tu c\u00f3digo podr\u00eda empezar a gestionar distintos escenarios de error:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    if (!result.IsSuccessStatusCode)rn{rn    var status = (int)result.StatusCode;rnrn    if (status == 400)rn    {rn        \/\/ Log the error and notify the development team that thern        \/\/ request was not formatted properly.rn    }rn    else if (status == 401)rn    {rn        \/\/ Log the error and notify the development team that thern        \/\/ request&#039;s authentication failed.rn    }rn    else if (status == 429)rn    {rn        \/\/ Use a .NET library like Polly to throttle or try this requestrn        \/\/ again with an exponential back-off, etc.rn    }rn    elsern    {rn        \/\/ Something went wrong: log the error and apply a distributed rn        \/\/ error handling technique like a circuit breaker.rn        \/\/ See https:\/\/learn.microsoft.com\/en-us\/azure\/architecture\/patterns\/circuit-breaker for more.rn    }rn}rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Integraci\u00f3n de emails lista para la producci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En este punto, ya has enviado un email con .NET y C#, pero para estar listo para la producci\u00f3n, hay algunos aspectos importantes a tener en cuenta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Protege tu clave de API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><b>No <\/b><b><i>puedes<\/i><\/b><b> almacenar tu clave de API de producci\u00f3n real en el c\u00f3digo fuente<\/b>. Adem\u00e1s, nadie deber\u00eda poder acceder a ella en archivos de texto sin formato.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay muchas herramientas que puedes utilizar para proteger tu clave de API. Cada proveedor en la nube cuenta con su propio sistema de gesti\u00f3n de claves que permite que tu aplicaci\u00f3n recupere tus secretos de forma segura. Por ejemplo, <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/key-vault\/general\/overview\" target=\"_tabs\" rel=\"noopener noreferrer\">Azure Key Vault<\/a> o <a href=\"https:\/\/docs.aws.amazon.com\/secretsmanager\/latest\/userguide\/intro.html\" target=\"_tabs\" rel=\"noopener noreferrer\">AWS Secrets Manager<\/a> funcionan a la perfecci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Otras funciones para entornos de producci\u00f3n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mailgun tambi\u00e9n ofrece muchas de las funciones de nivel de producci\u00f3n que puedas necesitar, como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#send-with-attachments\" target=\"_tabs\" rel=\"noopener noreferrer\">A\u00f1adir adjuntos<\/a> a tus emails<\/li>\n\n\n\n<li>La posibilidad de <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/user-manual\/sending-messages\/#templates\" target=\"_tabs\" rel=\"noopener noreferrer\">crear plantillas de email reutilizables<\/a><\/li>\n\n\n\n<li>Funciones de personalizaci\u00f3n como <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/api-reference\/openapi-final\/tag\/Messages\/#tag\/Messages\/operation\/httpapi.(*apiHandler).handler-fm-19!path=o:tag&amp;t=request\" target=\"_tabs\" rel=\"noopener noreferrer\">variables y etiquetas<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/api-reference\/openapi-final\/tag\/Messages\/#tag\/Messages\/operation\/httpapi.(*apiHandler).handler-fm-19!path=cc&amp;t=request\" target=\"_tabs\" rel=\"noopener noreferrer\">Encabezados CC, CCO y de respuesta<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Integraci\u00f3n con el ecosistema .NET<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para demostrar lo f\u00e1cil que es integrarlo con herramientas listas para la producci\u00f3n del ecosistema .NET, an\u00edmate a usar una biblioteca de c\u00f3digo abierto como <a href=\"https:\/\/github.com\/jamesmh\/coravel\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Coravel<\/a> para mejorar la reutilizaci\u00f3n y la experiencia de desarrollo de tu soluci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ejecuta dotnet add package coravel.mailer desde tu terminal en la carpeta MailDemo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, a\u00f1ade la siguiente entrada JSON a tu archivo appsettings.json:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    &quot;Coravel&quot;: {rn    &quot;Mail&quot;: {rn        &quot;From&quot;: {rn            &quot;Name&quot;: &quot;Test User&quot;,rn            &quot;Email&quot;: &quot;postmaster@&lt;Your sandbox domain&gt;&quot;rn        }rn    }rn}rnNext, create a class file called MailgunMailer.cs that implements the ICanSendMail interface. You might notice that this is essentially the same logic you originally had in OrderController:rnusing System.Net.Mime;rnusing System.Text;rnusing Coravel.Mailer.Mail;rnrnnamespace MailDemo;rnrnpublic class MailgunMailer : ICanSendMailrn{rn    private readonly HttpClient _httpClient;rn    private readonly IConfiguration _config;rnrn    public MailgunMailer(IHttpClientFactory httpClientFactory, IConfiguration config)rn    {rn        this._httpClient = httpClientFactory.CreateClient(&quot;Mailgun&quot;);rn        this._config = config;rn    }rnrn    public async Task SendAsync(MessageBody message, string subject, IEnumerable&lt;MailRecipient&gt; to, MailRecipient from, MailRecipient replyTo, IEnumerable&lt;MailRecipient&gt; cc, IEnumerable&lt;MailRecipient&gt; bcc, IEnumerable&lt;Attachment&gt;? attachments = null, MailRecipient? sender = null)rn    {rn        using MultipartFormDataContent form = new();rnrn        void SetFormParam(string key, string value) =&gt;rn        form.Add(new StringContent(value, Encoding.UTF8, MediaTypeNames.Text.Plain), key);rnrn        if (from is not null)rn        {rn            SetFormParam(&quot;from&quot;, $&quot;{from.Name} &lt;{from.Email}&gt;&quot;);rn        }rn        elsern        {rn            \/\/ This gives you a default &quot;from&quot; field if not defined by the callerrn            SetFormParam(&quot;from&quot;, $&quot;{this._config.GetValue&lt;string&gt;(&quot;Coravel:Mail:From:Name&quot;)} &lt;{this._config.GetValue&lt;string&gt;(&quot;Coravel:Mail:From:Email&quot;)}&gt;&quot;);rn        }rnrn        foreach (var recipient in to)rn        {rn            SetFormParam(&quot;to&quot;, recipient.Email);rn        }rn        SetFormParam(&quot;subject&quot;, subject);rnrn        if (message.HasHtmlMessage())rn        {rn            SetFormParam(&quot;html&quot;, message.Html);rn        }rnrn        if (message.HasPlainTextMessage())rn        {rn            SetFormParam(&quot;text&quot;, message.Text);rn        }rnrn        var result = await _httpClient.PostAsync(string.Empty, form);rnrn        \/\/ Error handling logic...rn    }rn}rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s, tienes que indicarle a Coravel que use este servicio de correo. En tu archivo Program.cs, antes de llamar a var app = builder.Build(), a\u00f1ade lo siguiente:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                C#                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-csharp\">\r\n                                <code id=\"code_0_content\" class=\"language-csharp\">\r\n\r\n                                    builder.Services.AddScoped&lt;MailDemo.MailgunMailer&gt;();rnbuilder.AddCustomMailer&lt;MailDemo.MailgunMailer&gt;();rnFinally, replace the code for OrderController with the following:rnusing Microsoft.AspNetCore.Mvc;rnusing Coravel.Mailer.Mail.Interfaces;rnusing Coravel.Mailer.Mail;rnrnnamespace MailDemo.Controllers;rnrnpublic class OrderController : Controllerrn{rn    private readonly IMailer _mailer;rnrn    public OrderController(IMailer mailer)rn    {rn        this._mailer = mailer;rn    }rnrn    public async Task&lt;IActionResult&gt; Confirm()rn    {rn        var mailable = Mailable.AsInline()rn            .To(&quot;jamesmichaelhickey@gmail.com&quot;)rn            .Subject(&quot;Hello World!&quot;)rn            .Html(@&quot;&lt;html&gt;&lt;body&gt;&lt;p style=&quot;&quot;color:blue;&quot;&quot;&gt;My first transactional email!&lt;\/p&gt;&lt;\/body&gt;&lt;\/html&gt;&quot;)rn            .Text(&quot;My first transactional email!&quot;);rnrn        await _mailer.SendAsync(mailable);rnrn        return new JsonResult(@&quot;Your order was confirmed. You should get an email soon!&quot;);rn    }rn}rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Tras una peque\u00f1a configuraci\u00f3n que se realiza una sola vez, notar\u00e1s que la l\u00f3gica para enviar emails desde el c\u00f3digo de tu aplicaci\u00f3n es mucho m\u00e1s f\u00e1cil de entender y menos extensa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n has a\u00f1adido asistencia mediante Mailgun y Coravel para definir cuerpos de email tanto en HTML como en texto sin formato. Mailgun recomienda <a href=\"https:\/\/documentation.mailgun.com\/docs\/mailgun\/email-best-practices\/email_content\/\" target=\"_tabs\" rel=\"noopener noreferrer\">enviar tanto HTML como texto sin formato de forma conjunta<\/a>. Lo mejor es enviar emails multiparte usando texto y HTML, o solo texto. Los ESP no suelen recibir bien el env\u00edo de emails exclusivamente en HTML.<\/p>\n\n\n    <div data-content-type=\"longform\"  class=\"callout text-body-color px-5 py-6 px-md-6 px-lg-7 py-md-7 longform-spacings rounded-lg bg-light\" data-theme=\"light\">\r\n\r\n        <div class=\"content-body\"> Mailgun y Coravel tambi\u00e9n ofrecen asistencia para otras funciones como CC, CCO y adjuntos para emails transaccionales m\u00e1s enfocados a la producci\u00f3n.<\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">En resumen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.mailgun.com\/es\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mailgun<\/a> ofrece una forma sencilla <a href=\"https:\/\/www.mailgun.com\/es\/funciones\/email-api\/\" target=\"_tabs\" rel=\"noopener noreferrer\">API HTTP<\/a> de enviar emails de manera eficiente y segura desde tus soluciones en .NET. En este art\u00edculo, has aprendido a integrar la API HTTP de Mailgun en una aplicaci\u00f3n web en C# y a empezar a a\u00f1adir herramientas de nivel de producci\u00f3n, junto con las capacidades listas para la producci\u00f3n de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al utilizar Mailgun y .NET de forma conjunta, tus emails transaccionales pueden escalar eficientemente con  <a href=\"https:\/\/ardalis.com\/better-performance-from-async-operations\/\" target=\"_tabs\" rel=\"noopener noreferrer\">la funcionalidad async\/await de .NET<\/a>, la  <a href=\"https:\/\/www.techempower.com\/benchmarks\/#section=data-r21&amp;hw=ph&amp;test=composite\" target=\"_tabs\" rel=\"noopener noreferrer\">infraestructura web de alto rendimiento general del framework<\/a>, <a href=\"https:\/\/github.com\/jamesmh\/coravel\" target=\"_tabs\" rel=\"noopener noreferrer\">herramientas adicionales<\/a>  del ecosistema .NET y la API HTTP sencilla y de alto rendimiento de Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfTe ha resultado \u00fatil? Suscr\u00edbete a nuestra newsletter para recibir actualizaciones sobre tutoriales, noticias sobre emails e informaci\u00f3n de nuestros expertos en email.<\/p>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_d754887b9db4afd58a008e0d5d6a8351\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Reg\u00edstrate            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_d754887b9db4afd58a008e0d5d6a8351\">\r\n                Empezar es facil\u00edsimo. Y gratis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Descubre todo lo que puedes lograr con la mejor plataforma de entrega de emails del mundo.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Domina el env\u00edo de emails transaccionales con la API HTTP de Mailgun en C#. Esta gu\u00eda te explica paso a paso c\u00f3mo configurar una cuenta de Mailgun, realizar la integraci\u00f3n con .NET y gestionar los errores para lograr una entrega de emails lista para la producci\u00f3n.<\/p>\n","protected":false},"author":18,"featured_media":3952,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[19],"class_list":["post-20290","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-dev-life"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Env\u00edo de emails en C# con la API de Mailgun: gu\u00eda paso a paso - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Aprende a enviar emails utilizando la API de Mailgun y C# para lograr una entrega de emails fiable. Instrucciones paso a paso para la configuraci\u00f3n, la gesti\u00f3n de errores y la preparaci\u00f3n para la producci\u00f3n.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Env\u00edo de emails en C# con la API de Mailgun: gu\u00eda paso a paso - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Aprende a enviar emails utilizando la API de Mailgun y C# para lograr una entrega de emails fiable. Instrucciones paso a paso para la configuraci\u00f3n, la gesti\u00f3n de errores y la preparaci\u00f3n para la producci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-14T23:33:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/\",\"name\":\"Env\u00edo de emails en C# con la API de Mailgun: gu\u00eda paso a paso - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"datePublished\":\"2024-12-11T00:00:00+00:00\",\"dateModified\":\"2026-09-14T23:33:32+00:00\",\"description\":\"Aprende a enviar emails utilizando la API de Mailgun y C# para lograr una entrega de emails fiable. Instrucciones paso a paso para la configuraci\u00f3n, la gesti\u00f3n de errores y la preparaci\u00f3n para la producci\u00f3n.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-Dev-Life.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/dev-life\\\/enviar-email-con-c-sharp\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Env\u00edo de emails usando C# y la API de Mailgun\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Env\u00edo de emails en C# con la API de Mailgun: gu\u00eda paso a paso - Transactional Email API Service For Developers | Mailgun","description":"Aprende a enviar emails utilizando la API de Mailgun y C# para lograr una entrega de emails fiable. Instrucciones paso a paso para la configuraci\u00f3n, la gesti\u00f3n de errores y la preparaci\u00f3n para la producci\u00f3n.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/","og_locale":"es_ES","og_type":"article","og_title":"Env\u00edo de emails en C# con la API de Mailgun: gu\u00eda paso a paso - Transactional Email API Service For Developers | Mailgun","og_description":"Aprende a enviar emails utilizando la API de Mailgun y C# para lograr una entrega de emails fiable. Instrucciones paso a paso para la configuraci\u00f3n, la gesti\u00f3n de errores y la preparaci\u00f3n para la producci\u00f3n.","og_url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","article_modified_time":"2026-09-14T23:33:32+00:00","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/","url":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/","name":"Env\u00edo de emails en C# con la API de Mailgun: gu\u00eda paso a paso - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","datePublished":"2024-12-11T00:00:00+00:00","dateModified":"2026-09-14T23:33:32+00:00","description":"Aprende a enviar emails utilizando la API de Mailgun y C# para lograr una entrega de emails fiable. Instrucciones paso a paso para la configuraci\u00f3n, la gesti\u00f3n de errores y la preparaci\u00f3n para la producci\u00f3n.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-Dev-Life.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/dev-life\/enviar-email-con-c-sharp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Env\u00edo de emails usando C# y la API de Mailgun"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/20290","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/18"}],"version-history":[{"count":1,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/20290\/revisions"}],"predecessor-version":[{"id":20291,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/20290\/revisions\/20291"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/3952"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=20290"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=20290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}