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