常々、スパムメールが沢山あってスマホでメールが受け取れないのにイライラしている訳だが。スマホで閲覧するときは、全てを受け取りたいのではなくて重要そうな(最初に決められた相手とか)メールだけ見たいので、スパムもそうだけど広告メールも外したかったりする。いわゆる、自分なりのホワイトリストが作っておきたい。
つまりは自前のメーラーアプリがあればいいのだけど、(確か)iOSの場合は規約上作れないのでストアには出て来ない。
ならば、作ればいいだろう、ということ。
OpenPop.NET
簡単なPOP3の実装ならばそれほど難しくはないのだけど、できるならば既に実績があるものがよい。
OpenPop.NET – Robust POP3 client and MIME parser written in C#
http://hpop.sourceforge.net/
どうやら .NET Framework 2.0 の頃からある古い実装なのだけど、サンプルもあるのでそのまま使えそう。
ってなわけで、.NET Standard 2.0 でビルドし直してみる、と
moonmile/hpop: OpenPOP.NET code repository
https://github.com/moonmile/hpop
あっさりできてしまったので、これを Xamarin.Forms に組み込む。
Xamarin.Forms+OpenPop.NET
using OpenPop.Pop3; using System.Net.Mail; public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); this.LayoutChanged += MainPage_LayoutChanged; } private void MainPage_LayoutChanged(object sender, EventArgs e) { var client = new Pop3Client(); client.Connect("ホスト名", 110, false); client.Authenticate( "ユーザー名", "パスワード", AuthenticationMethod.UsernameAndPassword); int messageCount = client.GetMessageCount(); var items = new List<MailMessage>(); int cnt = 0; for ( int i = messageCount; i>0; i-- ) { /// 30 件で区切る if (cnt++ >= 30) break; try { var msg = client.GetMessage(i); if (msg != null) items.Add(msg.ToMailMessage()); } catch { } } this.lv.ItemsSource = items; } }
途中で try-catch しているのは、Form のコード変換あたりでエラーになっているから。デコードがうまくいかないようなので、ToMailMessageメソッドの実装は自前で行ったほうがよいかもしれない(日本語のコード変換だからだろう)。
ひとまず、ListView にバインドさせるとこんな感じになる。
どうやって使うか?
ちゃんとしたメーラーアプリ標準のものを使う…というか標準のしか使えないので、まるっきり自作アプリとして使う。スマホのメーラーは振り分けが貧弱なので、そのあたりを補えばいい。
- From を見て、特定の人だけを表示させる
- Subject に特定の文字がでてきたもののみ表示させる。
な感じでいいだろう。返信するときはコピペしてから標準アプリに受け渡せばいい。