OpenPop.NET を Xamarin.Forms で使う

常々、スパムメールが沢山あってスマホでメールが受け取れないのにイライラしている訳だが。スマホで閲覧するときは、全てを受け取りたいのではなくて重要そうな(最初に決められた相手とか)メールだけ見たいので、スパムもそうだけど広告メールも外したかったりする。いわゆる、自分なりのホワイトリストが作っておきたい。

つまりは自前のメーラーアプリがあればいいのだけど、(確か)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 に特定の文字がでてきたもののみ表示させる。

な感じでいいだろう。返信するときはコピペしてから標準アプリに受け渡せばいい。

カテゴリー: 開発, C#, Xamarin パーマリンク