常々、スパムメールが沢山あってスマホでメールが受け取れないのにイライラしている訳だが。スマホで閲覧するときは、全てを受け取りたいのではなくて重要そうな(最初に決められた相手とか)メールだけ見たいので、スパムもそうだけど広告メールも外したかったりする。いわゆる、自分なりのホワイトリストが作っておきたい。
つまりは自前のメーラーアプリがあればいいのだけど、(確か)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 に特定の文字がでてきたもののみ表示させる。
な感じでいいだろう。返信するときはコピペしてから標準アプリに受け渡せばいい。

