.NET MAUIを使って簡単にメールを送信できるアプリを作成


.NET MAUIを使って、簡単にメールを送信できるアプリを作成しました。アプリ起動時にすぐに入力状態になるようにし、MVVMでバインドしています。ただし、パスワードが平文で保存されているため、セキュリティの改善が必要です。また、現状はGmailアカウントでしか利用できません。今後は、セキュリティの向上や機能の追加・改善を行っていく予定です。

### 1. MainPage.xaml

メインページには、メールの本文を入力するEditorと、メールを送信するためのSendボタンが配置されています。

```xml
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="QuickMail.MainPage">
    <StackLayout>
        <Editor
            x:Name="BodyTextEditor"
            VerticalOptions="FillAndExpand"
            HorizontalOptions="FillAndExpand" />
        <Button
            x:Name="SendButton"
            Text="Send"
            Clicked="SendButton_ClickedAsync" />
    </StackLayout>
</ContentPage>
```

### 2. MainPage.xaml.cs

メインページのコードビハインドでは、アプリ起動時にEditorにフォーカスを当てて、すぐに入力状態になるようにします。

```csharp
public MainPage()
{
    InitializeComponent();
    this.FocusRequested += (_, _) =>
    {
        BodyTextEditor.Focus();
    };
}
```

### 3. QuickMail.cs の実装

`QuickMail`クラスは、メールの送信を行うためのクラスです。このクラスは、送信元・送信先アドレス、Gmailのユーザ名・パスワード、メールの本文をプロパティとして持っています。以下が最終的な`QuickMail.cs`です。

```csharp
using System;
using MimeKit;

namespace QuickMail
{
    public class QuickMail
    {
        public string MailAddressFrom { get; set; }
        public string MailAddressTo { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }

        private string bodyText = "";

        public QuickMail(string mailAddressFrom, string mailAddressTo, string username, string password)
        {
            this.MailAddressFrom = mailAddressFrom;
            this.MailAddressTo = mailAddressTo;
            this.Username = username;
            this.Password = password;
        }

        public string BodyText
        {
            set { bodyText = value; }
            get { return bodyText; }
        }

        public async Task SendMailAsync()
        {// ref: https://feeld-uni.com/entry/2022/03/04/074344
            var msg = new MimeMessage();

            // Prepare the sender
            var from = new MailboxAddress("", MailAddressFrom);

            // Set the sender's information (add)
            msg.From.Add(from);

            // Prepare the recipient
            var to = new MailboxAddress("", MailAddressTo);

            // Set the recipient's information (add)
            msg.To.Add(to);

            // Prepare the Cc
            //var cc = new MailboxAddress("CcName", "CcNameAddress");

            // Set the Cc's information (add)
            //msg.Cc.Add(cc);

            // Set the subject
            string[] bodyTextArray = bodyText.Split("\n", StringSplitOptions.None);
            msg.Subject = bodyTextArray[0];

            // Set the body text
            // Set the format of the text in the body.
            var textPart = new TextPart(MimeKit.Text.TextFormat.Plain);
            textPart.Text = bodyText;

            var multipart = new Multipart("mixed");
            multipart.Add(textPart);
            msg.Body = multipart;

            // Send the email
            using (var sc = new MailKit.Net.Smtp.SmtpClient())
            {
                try
                {
                    // Connect to the SMTP server
                    await sc.ConnectAsync("smtp.gmail.com", 587);

                    // Authenticate with SMTP
                    await sc.AuthenticateAsync(this.Username, this.Password);

                    // Send the mail
                    await sc.SendAsync(msg);

                    // Disconnect from the SMTP server
                    await sc.DisconnectAsync(true);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }

        }
    }
}
```

このクラスのインスタンスは、`MailPage.xaml.cs` で作成され、その際に送信元・送信先アドレス、ユーザ名・パスワードが設定されます。これらの値は、SettingPage.xamlのバインドされた値から取得されています。これにより、MVVMパターンを実現しています。

また、`SendMailAsync` メソッドを使って、メールを非同期的に送信することができます。このメソッドは、`MailKit`ライブラリを使用して、GmailのSMTPサーバに接続し、メールを送信しています。ただし、このアプリはGmailアカウントを前提としているため、Gmail以外のメールアカウントでは動作しません。

このメソッドの実装は、以下の記事を参考にしています。

- [Gmailを使用してC#でメールを送信する方法](https://feeld-uni.com/entry/2022/03/04/074344)

### 4. MainPage.xaml.cs

メインページのコードビハインドでは、Sendボタンがクリックされたときに、QuickMailクラスをインスタンス化し、メールの送信先アドレスや本文を設定して、メールを送信します。

```csharp
private async void SendButton_ClickedAsync(Object sender, EventArgs e)
{
    QuickMail mail = new QuickMail(_vmSetting.MailAddressTo);
    mail.BodyText = BodyTextEditor.Text;

    BodyTextEditor.Text = string.Empty;
    await mail.SendMailAsync();
}
```


### 5. SettingPage.xaml

設定ページでは、メールの送信元・送信先アドレス、Gmailのユーザ名・パスワードを入力できるようにしています。

```xml
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="QuickMail.Views.SettingPage"
             Title="SettingPage">
    <ScrollView>
        <TableView Intent="Settings">
            <TableRoot>
                <TableSection Title="MAIL">
                    <EntryCell Label="Send From"
                               Text="{Binding MailAddressFrom}"
                               Placeholder="mail address"/>
                    <EntryCell Label="Send To"
                               Text="{Binding MailAddressTo}"
                               Placeholder="mail address"/>
                </TableSection>
                <TableSection Title="GMAIL">
                    <EntryCell Label="Login"
                               Text="{Binding Username}"
                               Placeholder="username"/>
                    <EntryCell Label="Password"
                               Text="{Binding Password}"
                               Placeholder="password"/>
                </TableSection>
            </TableRoot>
        </TableView>
    </ScrollView>
</ContentPage>
```

### 6. 使用するGamilパスワード

通常のGoogleアカウントパスワードではなく、２段階認証を許可した上でアプリ用パスワードを発行・使用する必要があります。



https://work-note32.com/vb-smtp-gmail-send




### 7. 今後の課題

- セキュリティの向上: 現在、パスワードが平文で保存されています。これを改善するために、SecureStorageを使用して暗号化された安全なストレージに保存するように変更する必要があります。
- Ctrl+Enterでメールを送信できるようにする。
- Androidでの表示バグ: 数文字ごとに改行されてしまう問題があります。これを修正する必要があります。

### まとめ

このアプリは、.NET MAUIを使用して作成された、簡単にメールを送信できるアプリです。アプリ起動時にすぐに入力状態になり、思いついたことをすぐにメモすることができます。ただし、セキュリティや機能面で改善が必要な点があります。今後、アプリの改善や機能追加を行っていく予定です。