2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-04-24

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

1. MainPage.xaml

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

<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にフォーカスを当てて、すぐに入力状態になるようにします。

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

3. QuickMail.cs の実装

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

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以外のメールアカウントでは動作しません。

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

4. MainPage.xaml.cs

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

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のユーザ名・パスワードを入力できるようにしています。

<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アカウントパスワードではなく、2段階認証を許可した上でアプリ用パスワードを発行・使用する必要があります。

7. 今後の課題

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

まとめ

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?