MailKit을 사용하여 이메일 보내기

페이지 생성 날짜 :

환경

.NET
  • .NET 5.0
메일킷
  • 2.11.1

처음에

이전에는 이메일을 보내기 위한 클래스인 smtpClient가 표준으로 포함되었지만 이제 는 사양이 부족하여 사용되지 않습니다.

즉, .NET에는 표준 메일링 라이브러리가 없으므로 타사 라이브러리를 사용합니다.

현재 주류 라이브러리로 "MailKit"이 있으므로 이번에는 이메일을 보내고 싶습니다.

메일킷 소개

비주얼 스튜디오 2019를 실행하고 새로운 콘솔 응용 프로그램 (.NET) 프로젝트를 만들 수 있습니다. .NET을 사용하는 경우 프로젝트 유형에 자유가 있으므로 세부 정보를 살펴보겠습니다.

프로젝트를 열면 솔루션 탐색기에서 종속성을 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리관리를 선택합니다.

검색 탭을 클릭하고 검색 필드에 MailKit을 입력하여 아래 목록에 MailKit을 표시합니다.

목록에서 MailKit을 선택하고 최신 버전이 선택되었는지 확인한 다음 설치 단추를 클릭합니다.

확인 버튼을 클릭합니다.

패키지에 MailKit이 포함되어 있는지 확인합니다.

프로그램

다음은 이메일을 보내기 위한 최소 코드입니다.

코드 의 상반기에 이메일에 필요한 정보를 정의하고 해당 값을 사용하여 하반기에 메일을 보냅니다. 필요에 따라 상반기의 정의를 변경하기만 하면 코드의 후반부분을 고정된 방식으로 사용할 수 있어야 합니다.

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

전자 메일을 보내는 데 필요한 정보 정의

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

여기서 사용하는 메일 서버(SMTP 서버)에 따라 다른 값을 설정합니다. 이 문서의 끝에 설정 하는 값의 몇 가지 설명 하 고 싶습니다., 하지만 기본적으로 내 메일 서버의 사이트를 참조.

원래는 appsettigs.json 등으로 쓰여졌지만 팁으로 중복됩니다.

이메일 의 내용 정의

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

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

나는 이 부분이 일반적으로 우편물 등을 사용하는 경우와 같이 해당 부분이라고 생각합니다.

최근 메일 시스템에서 위장하여 보낼 수 없으므로 기본적으로 이메일 계정과 동일한 이메일 주소를 설정합니다.

TextFormat 텍스트 또는 HTML로 보낼 수 있습니다. HTML로 보내면 본문에 HTML 태그를 포함합니다.

이메일 전송을 처리하는 데 필요한 정보 설정

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

기본적으로 위에 정의된 값을 설정하는 한 형태입니다.

또한 여러 에서 와 를 설정할 수 있습니다.

샘플에는 포함되지 않지만 CC 및 BCC도 포함될 수 있습니다. 포함하려면 다음과 같이 From 또는 To와 동일한 방식으로 추가합니다.

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

이메일 수신자가 지원되는 경우 보낸 사람 또는 대상의 표시 이름을 변경할 수도 있습니다. 이 경우 다음과 같이 코드를 변경합니다.

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

이메일 보내기

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

이메일 정의가 완료되면 이메일 전송이 완료됩니다.

제출은 SmtpClient 클래스의 인스턴스에서 수행됩니다. Dispose 대상이기 때문에 using var 자동으로 해제할 수 있도록 선언됩니다. C # 8.0을 작성하는 방법이기 때문에 using 이전 버전에 대한 일반 설명으로 변경하십시오.

SmtpClient.Connect SMTP 서버에 대한 메서드입니다. 일부 STMP 서버는 SSL 또는 TLS 연결이 필요하지만 SecureSocketOptions.Auto 지정은 일반적으로 괜찮습니다.

SMTP 서버에 인증이 필요한 경우 SmtpClient.Authenticate 메서드에서 사용자 이름과 암호를 지정합니다.

연결이 완료되면 SmtpClient.Send 메서드에서 전자 메일을 보냅니다.

모든 작업이 완료되면 SmtpClient.Disconnect 메서드와 연결을 끊습니다.

이 팁은 모두 이러한 작업을 동기 작업으로 수행하지만 각 메서드는 xxxxxAsync라는 이름으로 비동기 처리를 수행할 수도 있습니다. 필요에 따라 사용하십시오.

첨부 파일을 보내는 방법

첨부 파일을 보내려면 MimeMessage.Body 다음과 같이 설정된 값을 변경합니다.

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

위의 코드에서 로컬에 저장된 파일은 첨부 파일이지만 바이트 배열 또는 스트림일 뿐이므로 데이터는 무엇이든 할 수 있습니다. 예를 들어 JPEG 파일을 보냅니다.

MimeMessage.Body 로 빌드하도록 설정한 BodyBuilder 값입니다.

본문 TextPart 텍스트는 텍스트와 다르며 텍스트 또는 HTML에 관계없이 설정된 속성은 다릅니다. 두 설정을 모두 설정하더라도 첫 번째 설정은 지워집니다.

첨부 파일이 BodyBuilder.Attachments 속성에 추가됩니다. 인수는 "첨부 파일 이름", "첨부 파일 데이터"및 "MIME"입니다.

확장 프로그램을 추가하지 않는 한 첨부 파일의 이름은 수신 당사자가 식별하지 못할 수 있습니다.

ContentType 설정한 값은 파일 형식에 따라 다릅니다. "파일 형식 MIME"를 중심으로 인터넷에서 검색하면 조합을 볼 수 있습니다.

BodyBuilder.ToMessageBody마지막으로 메서드를 호출하여 MimeMessage.Body 로 설정합니다.

SMTP 서버 지정에 대해

메일을 보내기 위한 SMTP 서버는 사용하는 메일 서버에 따라 다른 설정이 있습니다. 다음은 예제이므로 그런 것이 없는 경우 사용 중인 서버의 도움을 확인하십시오.

또한, 정보는 2021년 4월 현재이므로 현재 정보가 변경되었을 수 있습니다.

메일 서비스 SMTP 서버 포트 인증 2단계 인증 암호화를 사용하는 경우
Outlook.com 1부 smtp.office365.com 587 사용자 이름 및 암호 ?? 스타트톨스
Outlook.com 2부 smtp-mail.outlook.com 587 사용자 이름 및 암호 앱 암호를 얻고 암호로 설정 스타트톨스
Gmail smtp.gmail.com 465(SSL) 또는 587(TLS) 사용자 이름 및 암호 앱 암호를 얻고 암호로 설정 SSL 또는 TLS 또는 STARTTLS
야후 메일 smtp.mail.yahoo.co.jp 465 사용자 이름 및 암호 ?? 알 수 없는 유형
OCN smtp.ocn.ne.jp 465 사용자 이름 및 암호 ?? SSL 또는 TLS