Enviar correos electrónicos usando MailKit

Fecha de creación de la página :

medio ambiente

.NET
  • .NET 5.0
MailKit
  • 2.11.1

al principio

Anteriormente, smtpClient, una clase para enviar correos electrónicos, se incluía de serie, pero ahora está en desuso debido a las especificaciones fuera de las especificaciones.

Esto significa que .NET no tiene una biblioteca de correo estándar, por lo que usará una biblioteca de terceros.

Actualmente, hay "MailKit" como biblioteca principal, así que me gustaría enviar un correo electrónico usando esta vez.

Presentación de MailKit

Inicie Visual Studio 2019 y cree un nuevo proyecto de aplicación de consola (.NET). Si usa .NET, tendrá cierta libertad en el tipo de proyecto, por lo que conoceré los detalles.

Al abrir el proyecto, haga clic con el botón secundario en Dependencias en el Explorador de soluciones y seleccione Administrar paquetes NuGet.

Haga clic en la pestaña Examinar y escriba MailKit en el campo de búsqueda para mostrar MailKit en la lista siguiente.

Seleccione MailKit en la lista, compruebe que la versión más reciente está seleccionada y, a continuación, haga clic en el botón Instalar.

Haga clic en el botón Aceptar.

Compruebe que el paquete contiene MailKit.

programa

El siguiente es el código mínimo para enviar correos electrónicos.

Defina la información que necesita para sus correos electrónicos en la primera mitad del código y utilice esos valores para enviar correo en la segunda mitad. Debería poder utilizar la segunda mitad del código de forma fija simplemente cambiando la definición de la primera mitad según sea necesario.

using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using MimeKit.Text;

namespace MailKitSend
{
  class Program
  {
    static void Main(string[] args)
    {
      // メールの送信に必要な情報
      var smtpHostName = "[SMTP サーバー名]";
      var smtpPort = 587;                         // or 25
      var smtpAuthUser = "[認証ユーザー名]";
      var smtpAuthPassword = "[認証パスワードまたはアプリパスワード]";

      // メールの内容
      var from = "[送信者メールアドレス]";
      var to = "[送り先メールアドレス]";

      var subject = "テストメールの件名です。";
      var body = "テストメールの本文です。\n改行です。";
      var textFormat = TextFormat.Text;

      // MailKit におけるメールの情報
      var message = new MimeMessage();

      // 送り元情報  
      message.From.Add(MailboxAddress.Parse(from));

      // 宛先情報  
      message.To.Add(MailboxAddress.Parse(to));

      // 表題  
      message.Subject = subject;

      // 内容  
      var textPart = new TextPart(textFormat)
      {
        Text = body,
      };
      message.Body = textPart;

      using var client = new SmtpClient();

      // SMTPサーバに接続  
      client.Connect(smtpHostName, smtpPort, SecureSocketOptions.Auto);

      if (string.IsNullOrEmpty(smtpAuthUser) == false)
      {
        // SMTPサーバ認証  
        client.Authenticate(smtpAuthUser, smtpAuthPassword);
      }

      // 送信  
      client.Send(message);

      // 切断  
      client.Disconnect(true);
    }
  }
}

Definir la información necesaria para enviar un correo electrónico

var smtpHostName = "[SMTP サーバー名]";
var smtpPort = 587;                         // or 25
var smtpAuthUser = "[認証ユーザー名]";
var smtpAuthPassword = "[認証パスワードまたはアプリパスワード]";

Aquí es donde se establecen valores diferentes dependiendo del servidor de correo (servidor SMTP) que utilice. Me gustaría explicar algunos de los valores que estoy estableciendo al final de este artículo, pero básicamente ver el sitio de mi servidor de correo.

Originalmente, está escrito en appsettigs.json, etc., pero es anterior a través de que se vuelve redundante como Sugerencias.

Definir el contenido de un correo electrónico

var from = "[送信者メールアドレス]";
var to = "[送り先メールアドレス]";

var subject = "テストメールの件名です。";
var body = "テストメールの本文です。\n改行です。";
var textFormat = TextFormat.Text;

Creo que esta parte es la parte correspondiente como lo es si normalmente utiliza correos, etc.

Dado que no está disponible para enviar disfrazado en los sistemas de correo recientes, básicamente establecerá la misma dirección de correo electrónico que su cuenta de correo electrónico.

TextFormat se puede enviar en texto o HTML. Si lo envía en HTML, incruste etiquetas html en la parte del cuerpo.

Configure la información necesaria para procesar el envío de correos electrónicos

// MailKit におけるメールの情報
var message = new MimeMessage();

// 送り元情報  
message.From.Add(MailboxAddress.Parse(from));

// 宛先情報  
message.To.Add(MailboxAddress.Parse(to));

// 表題  
message.Subject = subject;

// 内容  
var textPart = new TextPart(textFormat)
{
   Text = body,
};
message.Body = textPart;

Básicamente, es una forma de establecer el valor definido anteriormente.

También puede establecer varios From y To.

No está incluido en la muestra, pero también puede incluir CC y BCC. Si desea incluirlo, agréguelo de la misma manera que From o To de la siguiente manera:

message.Cc.Add(MailboxAddress.Parse(cc));
message.Bcc.Add(MailboxAddress.Parse(bcc));

También puede cambiar el nombre para mostrar del remitente o destino si se admite el destinatario del correo electrónico. En ese caso, cambie el código de la siguiente manera:

message.From.Add(new MailboxAddress("送信者の名前", from));
message.To.Add(new MailboxAddress("送り先の名前", to));

Enviar correo electrónico

using var client = new SmtpClient();

// SMTPサーバに接続  
client.Connect(smtpHostName, smtpPort, SecureSocketOptions.Auto);

if (string.IsNullOrEmpty(smtpAuthUser) == false)
{
   // SMTPサーバ認証  
   client.Authenticate(smtpAuthUser, smtpAuthPassword);
}

// 送信  
client.Send(message);

// 切断  
client.Disconnect(true);

Cuando haya terminado de definir su correo electrónico, ha terminado de enviarlo.

El envío SmtpClient se realiza en una instancia de la clase. Dispose Dado que using var es el destino, se declara para que se pueda liberar automáticamente. Puesto que es una forma de escribir C# 8.0, cambie a la using descripción normal para versiones anteriores.

SmtpClient.Connect método para el servidor SMTP. Algunos servidores STMP requieren conexiones SSL o TLS, pero SecureSocketOptions.Auto especificar suele estar bien.

Si el servidor SMTP requiere autenticación, SmtpClient.Authenticate especifique un nombre de usuario y una contraseña en el método.

Cuando se complete la SmtpClient.Send conexión, envíe un correo electrónico en el método.

Cuando todo esté hecho, SmtpClient.Disconnect desconécttelo con el método.

Tenga en cuenta que todas estas sugerencias realizan estas operaciones como operaciones sincrónicas, pero cada método también puede realizar un procesamiento asincrónico bajo el nombre xxxxxAsync. Úsalo según sea necesario.

Cómo enviar archivos adjuntos

Para enviar un MimeMessage.Body archivo adjunto, cambie el valor establecido de la siguiente manera:

// using System.IO; 必要

var filePath = @"[ローカルに保存されているファイルパス].jpg";   // 例として JPEG ファイル指定
var buffer = File.ReadAllBytes(filePath);

var builder = new BodyBuilder();

// テキストか HTML で設定するプロパティが異なる
if (textFormat == TextFormat.Plain)
{
   builder.TextBody = body;
}
else
{
   builder.HtmlBody = body;
}

// 添付ファイルを追加
builder.Attachments.Add(Path.GetFileName(filePath), buffer, new ContentType("image", "jpg"));

message.Body = builder.ToMessageBody();

En el código anterior, el archivo almacenado localmente es un archivo adjunto, pero los datos pueden ser cualquier cosa porque solo tiene que ser una matriz de bytes o Stream. Enviar un archivo JPEG como ejemplo.

MimeMessage.Body El valor que se establece para BodyBuilder compilar como .

El texto del cuerpo TextPart difiere de y las propiedades en las que se establece son diferentes, ya sea texto o HTML. Tenga en cuenta que incluso si establece ambos, se borrará la primera configuración.

Los datos adjuntos se BodyBuilder.Attachments agregan a la propiedad. Los argumentos son "nombre adjunto", "datos adjuntos" y "tipo de contenido (MIME)".

Tenga en cuenta que el nombre del archivo adjunto no puede ser identificado por la parte receptora a menos que agregue una extensión.

ContentType el valor al que establezca variará en función del formato de archivo. Si busca en Internet alrededor del "formato de archivo MIME", verá la combinación.

BodyBuilder.ToMessageBodyPor último, llame al método y estad en MimeMessage.Body .

Acerca de especificar un servidor SMTP

El servidor SMTP para enviar correo tiene diferentes configuraciones en función del servidor de correo que utilice. El siguiente es un ejemplo, por lo que si no existe tal cosa, compruebe la ayuda del servidor que está utilizando.

Además, dado que la información es a partir de abril de 2021, la información puede haber cambiado en la actualidad.

del servicio de está utilizando cifrado de verificación en dos
Autenticación de puerto de servidor SMTP correo Sipasos
Outlook.com Parte 1 smtp.office365.com 587 Nombre de usuario y contraseña ?? STARTTLS
Outlook.com Parte 2 smtp-mail.outlook.com 587 Nombre de usuario y contraseña Obtener la contraseña de la aplicación y establecerla en contraseña STARTTLS
Gmail smtp.gmail.com 465 (SSL) o 587(TLS) Nombre de usuario y contraseña Obtener la contraseña de la aplicación y establecerla en contraseña SSL o TLS o STARTTLS
Yahoo! Mail smtp.mail.yahoo.co.jp 465 Nombre de usuario y contraseña ?? Tipo desconocido
OCN smtp.ocn.ne.jp 465 Nombre de usuario y contraseña ?? SSL o TLS