【OCI】Email Deliveryを使ってASP.NET(C#)で構築したサーバからメール送信してみる

# はじめに

今回はOracle Cloud Infrastructure（OCI）のEmail Delivery(SMTP)の
機能を使ってASP.NET(C#)で構築したサーバからメール送信する手順を
紹介したいと思います。

■実行環境
Windows Server 2019 Standard
Visual Studio 2022

■参考
・電子メール配信サービスの概要
https://docs.oracle.com/ja-jp/iaas/Content/Email/Concepts/overview.htm

今回はパブリックサブネットに作成したAPサーバ（Windows Server）から
メール送信する構成となります。

■構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/b9a0da30-95a9-72ae-3378-93eb965babe5.png)

■事前準備
・Email Deliveryの使用権限のあるアカウントを準備
今回はOCIの管理者で利用するため、Administorators権限を付与した
アカウントを利用します。

Administorators権限がない場合は以下のポリシー作成した場合でも
Email Deliveryの利用は可能です。

＜ポリシー＞
allow any-user to manage email-family in compartment [コンパートメント名]

・ドメインの準備
メール送信するためにドメインの設定が必要となります。
予めドメインレジストラ（お名前.com等）でドメインを取得しておき、
ネームサーバをOCIのものに変更しておきます。

[OCIのNSレコード]
ns1.p68.dns.oraclecloud.net.
ns2.p68.dns.oraclecloud.net.
ns3.p68.dns.oraclecloud.net.
ns4.p68.dns.oraclecloud.net.

ネームサーバの変更方法は以下を参考にします。
（例 お名前.com）
https://help.onamae.com/answer/20390

・ネットワークの設定
VCN、サブネット（パブリック）、セキュリティリスト等を
作成しておき、インターネットからHTTPS(Port 443)でアクセスできるように
準備しておきます。

ネットワークの作成方法についてはこちらを参考にします。
https://oracle-japan.github.io/ocitutorials/beginners/creating-vcn/

・Windows Server 2019の作成
予めAPサーバとして作成するWindowsのComputeを作成しておきます。

Computeの作成方法はこちらを参考にします。
https://oracle-japan.github.io/ocitutorials/beginners/creating-compute-instance/

・Windows Server 2019 - Visual Studioの設定
Windows Server 2019に Visual Studioをインストールして、
ASP.NET（C#）が動く環境を準備します。

※必ず、ASP.NET Web アプリケーション（.NET Framework）の
テンプレートが動くようにインストールしてください。

Visual Studio 2022 インストール手順は以下を参考にします。
https://learn.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2022

◆目次
1.ドメイン [パブリック・ゾーン] の作成
2.SMTP資格証明の作成
3.Email Deliveryの設定
4.DNSの設定
5.メール送信アプリの作成
6.クライアントPCからメール送信

## 1. ドメイン [パブリック・ゾーン] の作成
予め準備しておいたドメインを使ってOCIからメールするためには
まずはパブリック・ゾーンを作成する必要があります。

左上メニュー[Ξ]からネットワーキング → ゾーンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/5d63a499-9046-a803-a662-8d7f3f4a9fad.png)
ゾーンの作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/8fe712d1-a032-126b-08c9-a735fed4493d.png)
ゾーン名に所有しているドメインを入力し、作成ボタンを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/5fed13f3-fd98-ffa7-b288-08c781973f9c.png)

以上でドメインのゾーン作成は終了です。

## 2.SMTP資格証明の作成
メール送信の認証で使用するSMTP資格証明書を作成します。

右上の人型アイコンからユーザー設定を選択し、
資格証明書の生成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/3e07ab38-4620-3b4c-ee37-b9c7dddca8e1.png)
※OCIコンソールの変更により、画面の配置が異なる場合は、
アイデンティティ > ユーザー > ユーザーの詳細
から画面遷移してください。

続いて左下のSMTP資格証明を選択し、資格証明書の生成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/ea8bb976-5b51-2153-ca68-8ae31f0f16f4.png)

入力画面が表示されるので説明（任意の文字列）を入力し、
SMTP資格証明書の生成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/24fdd07b-398c-7630-602c-f4adbc38cc67.png)
ユーザー名、パスワードが表示されるのでコピーして保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/82225e73-337c-ff49-ec5b-4e92ad9775e7.png)
※これらは一度しか表示されないため、コピーし忘れたら再作成してください。

以上でSMTP資格証明書の作成は終了です。

## 3.Email Deliveryの設定
OCIからメール送信するためにEmail Deliveryの設定を行います。

左上メニュー[Ξ]から開発者サービス → 電子メール配信を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/3c1fdb09-8661-7f94-bc33-42c8b416b65c.png)
続いて左メニューの電子メール・ドメインを選択し、
電子メール・ドメインの作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/bcbb8bda-f067-35cc-b151-95deda9f31d2.png)
入力画面が表示されるので、1. ドメイン [パブリック・ゾーン] の作成の
ステップで登録したドメインを電子メールドメイン名として入力し、
電子メール・ドメインの作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/a443827a-dd2d-11c9-93bc-32b9585572bc.png)
作成すると次のような画面が表示されるので、左上のEDアイコンが
緑色になるまで待ちます。
完了後にDKIMの追加を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/501ea5d7-1b3a-9afd-4626-168365530012.png)
入力画面が表示されるので以下STEPを進め、最後にDKIMの作成を実行します。
STEP1: DKIMセレクタとして任意の文字列を入力
STEP2: DKIMレコードの作成を実行
STEP3: CNAMEレコードとCNAME値をコピー・保続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/20196059-522c-c2b6-984e-35db8ab4ccd9.png)
完了すると次のような画面の状態となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/c23630d9-05d4-3f59-de52-705c3004aba8.png)
続いて承認済送信者を登録するため、左下メニューの承認済送信者を選択し、
承認済送信者の作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/d0cace4c-cd89-a1e9-431c-a258b3ead820.png)
入力画面が表示されるので、電子メール・アドレスを入力し
承認済送信者の作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/c307f937-af36-8d0f-a714-454cae4da72c.png)
※ここでは、info@[ドメイン]で登録します。

承認済送信者を作成後、右の詳細からSPF表示を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/72821eb4-1c04-0c5c-e51c-d926f618844f.png)
SPFが表示されるのでアジア太平洋のSPFレコードをコピー・保存し、閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/47a90b1f-4311-7b39-a6a4-dbbd2758c9d5.png)
ついでにSMTP接続先情報も確認しておきます。
Email Deliveryのトップページから左のメニューに構成を
選択するとエンドポイント等の情報が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/2aa8884e-96c5-0f66-2fad-55c3e5ab8942.png)

以上でEmail Deliveryの設定は終了です。

## 4.DNSの設定
冒頭で作成したドメインにDKIMレコードとSPFレコードを追加します。
左上メニュー[Ξ]からネットワーキング → ゾーンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/04a136f9-48a5-32cf-f97d-5157f39c414c.png)
続いて作成したドメインを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/707bc259-1bd9-d6fa-311c-70c22cba769a.png)
左下メニューのレコードを選択し、レコードの管理を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/edb43d92-1663-a373-daf7-eaa3888da209.png)
この画面ではDNSレコード追加ができますので、
DKIMとSPF(txt)レコードの２つを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/403b6bf1-0e92-8d4e-571c-bf9d18b15bbb.png)

・DKIMレコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/17ebf3aa-cee7-5b4d-fd9a-762c48c2bb9f.png)
入力項目は以下の通りです。
①名前: 3.Email Deliveryの設定で登録したCNAMEレコード
②タイプ: CNAME
③TTL: 60 ※ここでは即時反映させるために最短に設定
④Target(ターゲット):　3.Email Deliveryの設定で登録したCNAME値

入力後にレコードの追加を実行

・SPFレコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/9aa6a3af-9b77-b7b9-926e-64b8b6783a02.png)
入力項目は以下の通りです。
①名前: (未入力)
②タイプ: TXT
③TTL: 60 ※ここでは即時反映させるために最短に設定
④Text (テキスト):　3.Email Deliveryの設定で取得したSPFレコード

こちらも入力後にレコードの追加を実行

登録後、２つのレコードが追加されていることを確認し、
変更の公開を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/69764881-843d-7520-ff4d-2b6a1ab389a9.png)
さらに変更の公開の確認が表示されるので実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/084178fe-c70c-652b-142d-8d6f7fb4866c.png)

以上でDNSの設定は終了です。

## 5.メール送信アプリの作成
Windows Server上のASP.NET(C#)からメール送信するためのアプリを
作成するためにOCI上に立てたサーバにRDP経由でログインします。
（この作業はクライアントPCにVisutal Studioをインストールしても行えます）

サーバでVisutal Studioを起動し、新しいプロジェクトの作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/78bab9d3-9d71-5cad-1858-01298d86681b.png)
ASP.NET Web アプリケーション(.NET Framework)を選択し、次へ進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/6a7044e2-e187-73b6-dff7-53b2861ad1fa.png)
プロジェクトの必要情報を入力し、作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/33be027c-8e70-3111-48e6-abdbfb85b5ef.png)
Web Formsを選択し、作成を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/b318768e-a179-4d2a-463b-27bde580346f.png)
プロジェクトの作成完了後、メニューのプロジェクトから
Nugetパッケージの管理を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/71159009-f879-3025-472a-a52d6b5ee721.png)
Nugetパッケージマネージャーが開いたら下記のステップを行います。
・参照タブを選択
・MailKitで検索
・MailKitを選択
・インストールを実行
あとははガイドに従って進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/9efcc934-1448-f19e-9436-67ca62f297b8.png)

次にソリューションエクスプローラでプロジェクトを右クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/43c890e7-4607-6ec2-a255-d39e8eaf51e2.png)
追加 - Webフォームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/ba698e39-9387-2007-af38-241099e7ecc6.png)
フォームの名前を決めてOKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/4910821a-8023-d9da-37c1-2409df668902.png)
フォームが追加されるとソースタブにコードが表示されるので
HTMLタグ内を次のものに置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/ac941f6b-1722-28b0-8700-4d68f39ecb7f.png)

＜HTMLタグ＞
```
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server" enctype="multipart/form-data">
            <br />
            <asp:Label ID="lblMessage" name="lblMessage" runat="server" ForeColor="#FF6666"></asp:Label>
            <hr style="height: -5px; margin-bottom: 0px" />
            <br />
            宛先:<br />
            <asp:TextBox ID="txtTo" runat="server" TextMode="Email" Width="257px"></asp:TextBox>
            <br />
            <br />
            CC:<br />
            <asp:TextBox ID="txtCc" runat="server" TextMode="Email" Width="257px"></asp:TextBox>
            <br />
            <br />
            BCC:<br />
            <asp:TextBox ID="txtBcc" runat="server" TextMode="Email" Width="257px"></asp:TextBox>
            <br />
            <br />
            件名<br />
            <asp:TextBox ID="txtTitle" runat="server" Width="600px"></asp:TextBox>
            <br />
            <br />
            本文:<br />
            <asp:TextBox ID="txtBody" runat="server" Rows="10" style="margin-bottom: 5px" TextMode="MultiLine" Width="600px"></asp:TextBox>
            <br />
        <asp:Button ID="btnSend" runat="server" Text="送信" Width="90px" OnClick="btnSend_Click" />
    </form>
</body>
</html>
```
続いてデザインタブを開いたら送信ボタンをダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/0b6dbc50-a26b-66f8-fc07-aa1979362c09.png)
コードディタが表示されるので次のように書き換えます。
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void btnSend_Click(object sender, EventArgs e)
        {
            string uid = "[1]";
            string pwd = "[2]";

            this.lblMessage.Text = "";

            var message = new MimeKit.MimeMessage();
            message.From.Add(new MimeKit.MailboxAddress("Email Devliery", "[3]")); 

            if (this.txtTo.Text != "") message.To.Add(new MimeKit.MailboxAddress("", this.txtTo.Text));
            if (this.txtCc.Text != "") message.Cc.Add(new MimeKit.MailboxAddress("", this.txtCc.Text));
            if (this.txtBcc.Text != "") message.Bcc.Add(new MimeKit.MailboxAddress("", this.txtBcc.Text));
            message.Subject = this.txtTitle.Text;

            var textPart = new MimeKit.TextPart(MimeKit.Text.TextFormat.Plain);
            textPart.SetText("iso-2022-jp", this.txtBody.Text);

            message.Body = textPart;

            using (var client = new MailKit.Net.Smtp.SmtpClient())
            {
                try
                {
                    client.Connect("smtp.email.ap-tokyo-1.oci.oraclecloud.com", 587);
                    client.Authenticate(uid, pwd);
                    client.Send(message);

                    client.Disconnect(true);
                    this.lblMessage.Text = "メール送信完了";
                }
                catch (Exception ex)
                {
                    string err = ex.Message.ToString();
                    this.lblMessage.Text = err;
                    Page.SetFocus(lblMessage.ClientID);
                }
            }
        }
    }
}
```
※注意点
ソースコードの下記３つは実際に設定した値に変更してください。
[1] SMTP資格証明のユーザー名
[2] SMTP資格証明のパスワード
[3] 承認済送信者（info@ドメイン）

これらの作業でメール送信ができるようになりましたので
Windows Server環境にデプロイしてください。
（クライアントPCで動かす場合はそのまま実行できます）

以上でメール送信アプリの作成は終了です。

## 6.クライアントPCからメール送信
最後にメール送信のテストを実施してみます。
サーバ上にデプロイしたアプリにアクセスします。

宛先、件名、本文などを入力し、送信ボタンを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/0357c0fe-77af-1fae-2cce-abd874becc44.png)

問題なければメール送信完了のメッセージが表示されます。

## おわり
以上、Email Deliveryを使って簡単にメール送信することができました。