Eメールとは何だろうか

# 最近AI君とマンネリ期です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/7416ed4a-6a43-28c8-6a50-a41e51383ae7.png)
えぇ...

# Eメールとは何だろうか？
Copilot君が自我を持ち、私のアホな質問に答えてくれないことにより早速、記事が頓挫しかけたが困ったときはWikipediaだよねー

>電子メール（でんしメール）あるいはEメール（英: electronic mail、email）は、コンピュータネットワークを使用して、まるで郵便による手紙のように文章（や添付したファイルや写真データなど）のやりとりをすること、およびその技術。
https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB#

この定義でいくとQitta記事も電子メールといえなくもない気がする。
しかしながら流石Wikipedia様、きちんと定義はあるようだ

>狭義のメール
RFCに準拠した、UUCP、SMTPのプロトコルを使用した電子メール。
https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB#%E7%8B%AD%E7%BE%A9%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB

# プロトコル？ってなんぞや 
例えば親に電話をするとする。「オレオレ」と名乗る、そしてそのあとに交通事故を起こしたとか連絡する。これは一種の約束のようなことで、このお約束の事をプロトコルというらしい。

# メールプロトコルについては私とAIで意見が分かれた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/8daa969e-2bda-0450-55be-024a565346c7.png)
ほんとぅ～？

# じゃあ、実際にコード書いてみてよ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/c4cd24e4-e9c1-f78b-a212-30a1eea3a0f5.png)

```c# SMTPの例.cs
using System;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        string server = "smtp.example.com";
        int port = 25;

        using (TcpClient client = new TcpClient(server, port))
        using (NetworkStream stream = client.GetStream())
        {
            byte[] buffer = new byte[1024];
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("Server: " + Encoding.ASCII.GetString(buffer, 0, bytesRead));

            string heloCommand = "HELO localhost\r\n";
            byte[] heloBuffer = Encoding.ASCII.GetBytes(heloCommand);
            stream.Write(heloBuffer, 0, heloBuffer.Length);

            bytesRead = stream.Read(buffer, 0, buffer.Length);
            Console.WriteLine("Server: " + Encoding.ASCII.GetString(buffer, 0, bytesRead));
        }
    }
}
```

# AI君との歴史的和解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/8e33b88e-c07a-ad4e-f57d-53a0d04a0438.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/b70401da-daf3-ff8b-e625-fd8d5bdbae31.png)
俺もEメールはコウノトリさんが送ってきてくれると今日まで信じていたからOK。

というか俺の質問が悪かったのでは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/9b4e67b4-da4c-a27c-55cb-37933e62f880.png)
はい、やはり私が馬鹿でした。


# メールアドレスってなんでsukebei@xxx.c0mになっているの？
>![1538174449135939586-FVih7-jVsAAnqBc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423236/743d4dc0-62f3-31f3-e540-d8a0bf811e05.jpeg)
©2022 プロジェクトラブライブ！虹ヶ咲学園スクールアイドル同好会

上の配信は絶対に見たい。個人的にはかすみんの配信でお願いしたい。

AI君によればメールアドレスの構造は以下のようになっているらしい
>local-part@domain
* local-part: ユーザー名やアカウント名を示します。例: user
* @: 区切り文字
* domain: ドメイン名を示します。例: example.com

# ドメインの代わりにIP指定できねーが？

それじゃあトラックにはねられてDNSの存在しない異世界に飛ばされたときどうするのという疑問が浮かんで夜も眠れなくなったので、ドメインにIPを指定することはできるのか聞いてみた。

AI君の回答は以下の通り
>はい、ドメイン名の代わりにIPアドレスを指定することも可能です。その場合、IPアドレスは角括弧で囲む必要があります。
例: user@[192.168.1.1]

けどグーグル先生は別の答えを返してきた

https://xtech.nikkei.com/it/members/SI/ITARTICLE/20030527/1/

もう一度、メールを送信するコードを書いてみてもらった。
```C# ならずもの.cs
using System;
using System.Net;
using System.Net.Mail;

class Program
{
    static void Main()
    {
        // SMTPサーバーの設定
        string smtpServer = "smtp.スパム業者.com";
        int smtpPort = 587;
        string smtpUser = "全員悪人@スパム業者.com";
        string smtpPass = "123456";

        // メールの設定
        string envelopeFrom = "全員悪人@スパム業者.com"; // エンベロープFrom
        string headerFrom = "私はすごい良いひとです@[すごい優良企業のipアドレス]"; // ヘッダーFrom
        string toAddress = "あなた@人間.com";
        string subject = "すぐスパム、すごくスパム";
        string body = "♪めっちゃスパムやねん、めっちゃスパムやねん";

        メール送信();
    }
}
```

気がついた。これはキラが世界を統治してる善人しかいない世界線じゃないと大変になるのでは？

https://www.kali.org/tools/hping3/

世の中には自分を偽って迷惑なものを送るならずものがいることは無視できない。

# 迷惑メール対策
## SPF
なんかSPFレコードというDNSレコードの一種でIPが一緒か確認する方法らしい。(URL/URIみたいな感じの関係なのかな？)
>しかし、通常受信者に表示されないエンベロープFromのドメインを基準に認証するため、メールに表示された送信元（ヘッダーFrom）が偽装されている場合のなりすましメールには対応できないという弱点があります。
https://www.nri-secure.co.jp/glossary/spf

えぇ...意味あるんかこれ？
その他にも頭ワルワルな私が思いついたこととして

* DNSキャッシュポイズニングとかされたらどうすんの？
* 最近起きたの米騒動で「DNSが米を買い占めてる」という偽情報が流されて全DNSが打ち壊しされたらどうすんの？

とCopilot君に聞いたら他にも
* DKIM（DomainKeys Identified Mail）
* DMARC（Domain-based Message Authentication, Reporting & Conformance）

とか言う技術があるらしい。

## DKIM
要はメール送信のフィールド値の改ざん等を防ぐだけ。正直、これの何が迷惑メール対策になるんやと思った。
だって、ただの暗号化でしょ？スパム業者でもできるじゃん

これに関してはすぐに自己解決した
* スパム業者.comなんか速攻でBANすりゃいいじゃん

これに関しては正しかったようで以下のような物があるらしい

https://qiita.com/nfujita55a/items/5848fcfbbe6cbf7d98c3

さながらIPの裏掲示板みたいなものらしい
例えばスパム業者.comの評判は次のようになるだろう
* メールの内容がね…
* くさいIP。
* すごい優良企業にはまったく似ていません！


>DKIMは、サイバー犯罪者が電子メールの「from」フィールドの目に見える部分（電子メールアドレス、ディスプレイネーム、ドメインなど）を詐称するなりすましメールを防ぐことはできません。
https://www.proofpoint.com/jp/threat-reference/dkim

ただ、ここでも頭ワルワルな私が思いついたこととして
* 秘密鍵漏れたらどうするのっと？
* 内容の改ざん自体はできないけど、中間攻撃者が何らかの手段で暗号化されたデータを取得して、TTLの間に送信先に大量に送りつけて業務を妨害されることは防げないのでは？

## DMARC
単純にいうと怪しいメールをどうするの？という設定を行うもので、これはどちらかというと私達一般ユーザ向けではなくシステム管理者向けの技術っぽい

なんか横文字ばかりで混乱してきたので、ここで少し上記の内容をまとめてみる
* SPFではエンベロープFromは担保されるがヘッダーFromは担保されない
* DKIMでは署名に送信ドメイン名を含ませることが必須
> https://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/
v=1; a=rsa-sha256; d=すごい優良企業.com;　みたいな感じ

上記、いずれの技術を単独で使用した場合にはヘッダーFromに関しては偽装されている可能性が残る。
しかし、SPF認証で担保されたエンベロープFromとDKIM認証で担保された送信ドメインを元にしてヘッダーFromが偽装されているかどうかを判別することは可能になる。
これをアライメントをとると言うらしい。(いやタイヤやあらへんねんから整合性を取るでよくね？)

# で、結局トラックにはねられてDNSの存在しない異世界に飛ばされたとき電子メールはどうなんの？
アニメには悪人はいないし、いたとしてもキラを呼べば大丈夫だというものになる。
これで安心して眠ることができるよ。ということで私は寝ますね。

つか、この業界横文字使いすぎ問題。コンタミコンタミ言いたがる生物系の学生かよ。