常々、スパムメールが沢山あってスマホでメールが受け取れないのにイライラしている訳だが。スマホで閲覧するときは、全てを受け取りたいのではなくて重要そうな(最初に決められた相手とか)メールだけ見たいので、スパムもそうだけど広告メールも外したかったりする。いわゆる、自分なりのホワイトリストが作っておきたい。
つまりは自前のメーラーアプリがあればいいのだけど、(確か)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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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 に特定の文字がでてきたもののみ表示させる。
な感じでいいだろう。返信するときはコピペしてから標準アプリに受け渡せばいい。