Envie e-mails usando MailKit

Data de criação de página :

ambiente

.NET
  • .NET 5.0
MailKit
  • 2.11.1

inicialmente

Anteriormente, o smtpClient, uma classe para envio de e-mails, foi incluído como padrão, mas agora está preterido devido a desordenados.

Isso significa que o .NET não tem uma biblioteca de e-mail padrão, então você usará uma biblioteca de terceiros.

Atualmente, existe o "MailKit" como uma biblioteca mainstream, então eu gostaria de enviar um e-mail usando desta vez.

Apresentando o MailKit

Inicie o Visual Studio 2019 e crie um novo projeto de aplicativo para console (.NET). Se você estiver usando .NET, você terá alguma liberdade no tipo de projeto, então eu vou conhecer os detalhes.

Ao abrir o projeto, clique com o botão direito do mouse em Dependências do Solution Explorer e selecione Gerenciar pacotes NuGet.

Clique na guia Procurar e digite MailKit no campo de pesquisa para exibir o MailKit na lista abaixo.

Selecione MailKit na lista, verifique se a versão mais recente está selecionada e clique no botão Instalar.

Clique no botão OK.

Verifique se o pacote contém MailKit.

programa

A seguir, o código mínimo para envio de e-mails.

Você define as informações que precisa para seus e-mails na primeira metade do seu código e usa esses valores para enviar e-mails no segundo semestre. Você deve ser capaz de usar a segunda metade do código de forma fixa, simplesmente alterando a definição do primeiro semestre conforme necessário.

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);
    }
  }
}

Defina as informações necessárias para enviar um e-mail

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

É aqui que você define valores diferentes dependendo de qual servidor de e-mail (servidor SMTP) você usa. Eu gostaria de explicar alguns dos valores que estou definindo no final deste artigo, mas basicamente ver o site do meu servidor de e-mail.

Originalmente, ele é escrito em appsettigs.json, etc., mas é premeditado, mas se torna redundante como Dicas.

Defina o conteúdo de um e-mail

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

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

Eu acho que esta parte é a parte correspondente como é se você normalmente usar carteiros etc.

Uma vez que não está disponível para enviar disfarçado em sistemas de e-mail recentes, basicamente você definirá o mesmo endereço de e-mail que sua conta de e-mail.

TextFormat pode ser enviado em texto ou HTML. Se você enviá-lo em HTML, incorpore tags html na parte do corpo.

Configure as informações necessárias para processar o envio de e-mails

// 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;

Basicamente, é uma forma de definir o valor definido acima.

Você também pode definir vários De e Para.

Não está incluído na amostra, mas também pode incluir CC e BCC. Se você quiser incluí-lo, adicione-o da mesma forma que De ou Para o seguinte:

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

Você também pode alterar o nome de exibição do remetente ou destino se o destinatário do e-mail for suportado. Nesse caso, altere o código da seguinte forma:

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

Enviar e-mail

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);

Quando você terminar de definir seu e-mail, você está feito para enviá-lo.

A submissão é SmtpClient feita em uma instância da classe. Dispose Por ser using var o alvo, ele é declarado para que possa ser liberado automaticamente. Uma vez que é uma maneira de escrever C# 8.0, por favor mude para a using descrição normal para versões anteriores.

SmtpClient.Connect método para o servidor SMTP. Alguns servidores STMP requerem conexões SSL ou TLS, mas SecureSocketOptions.Auto especificar geralmente é bom.

Se o servidor SMTP exigir autenticação, SmtpClient.Authenticate especifique um nome de usuário e senha no método.

Quando a conexão estiver SmtpClient.Send concluída, envie um e-mail no método.

Quando tudo estiver feito, SmtpClient.Disconnect desconecte-o com o método.

Observe que todas essas dicas executam essas operações como operações síncronias, mas cada método também pode realizar processamento assíncrocros sob o nome xxxxxAsync. Use conforme necessário.

Como enviar anexos

Para enviar um MimeMessage.Body anexo, altere o valor definido para o seguinte:

// 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();

No código acima, o arquivo armazenado localmente é um anexo, mas os dados podem ser qualquer coisa porque ele só tem que ser um conjunto de byte ou Stream. Enviando um arquivo JPEG como exemplo.

MimeMessage.Body O valor que você define para BodyBuilder construir como .

O texto do corpo TextPart difere de , e as propriedades para as quais ele está definido são diferentes, seja texto ou HTML. Por favor, note que mesmo que você defina ambos, a primeira configuração será apagada.

O anexo é BodyBuilder.Attachments adicionado à propriedade. Os argumentos são "nome de anexo", "dados de anexo" e "tipo de conteúdo (MIME)".

Observe que o nome do anexo não pode ser identificado pela parte receptora, a menos que você adicione uma extensão.

ContentType o valor que você definiu varia de acordo com o formato do arquivo. Se você pesquisar na Internet em torno do "FORMATO DE ARQUIVO MIME", você poderá ver a combinação.

BodyBuilder.ToMessageBodyFinalmente, chame o método e configure-o para MimeMessage.Body .

Sobre a especificação de um servidor SMTP

O servidor SMTP para envio de e-mails tem configurações diferentes dependendo do servidor de e-mail que você usa. A seguir, um exemplo, então se não houver tal coisa, verifique a ajuda do servidor que você está usando.

Além disso, como as informações são de abril de 2021, as informações podem ter mudado no momento.

serviço de estiver usando
Autenticação da porta do servidor SMTP docorreio Se vocêcriptografia de verificação em duas etapas
Outlook.com Parte 1 smtp.office365.com 587 Nome de usuário e senha ?? STARTTLS
Outlook.com Parte 2 smtp-mail.outlook.com 587 Nome de usuário e senha Obtenha a senha do aplicativo e defina-a como senha STARTTLS
Gmail smtp.gmail.com 465(SSL) ou 587(TLS) Nome de usuário e senha Obtenha a senha do aplicativo e defina-a como senha SSL ou TLS ou STARTTLS
Yahoo! Correio smtp.mail.yahoo.co.jp 465 Nome de usuário e senha ?? Tipo desconhecido
OCN smtp.ocn.ne.jp 465 Nome de usuário e senha ?? SSL ou TLS