メールの未開封・開封済みの判別

解決


たると  2018-03-13 09:02:21  No: 49081  IP: 192.*.*.*

XE8でメールソフトを作成し、送受信が可能となりました。
しかし、受信したメールが未開封か開封済みかを判別する方法が
わかりません。

自作のメールソフトのTIdPOP3.Retrieveメソッド開いたメールでも、
Outlookなどでは開封済と判別していますので、逆に他のソフトで開封した
メールを自作ソフトでも開封済と判別表示するようにしたいのです。

よろしくおねがいいたします。

編集 削除
たると  2018-03-13 09:11:16  No: 49082  IP: 192.*.*.*

補足

起動したときにTIdPOP3.RetrieveHeaderでメールの一覧取得し、
それぞれに未開封・開封済みを表示するように考えております。

編集 削除
take  2018-03-13 10:12:28  No: 49083  IP: 192.*.*.*

受信したメールのヘッダ情報に「Disposition-Notification-To:」が含まれていれば
開封確認を要求していると判断できます。

開封確認要求のヘッダ情報に関して詳しくはこちらを参考に
http://www.atmarkit.co.jp/fwin2k/win2ktips/508oedispos/oedispos.html

使用するメールソフトによって開封要求に返信する開封情報がバラバラです。
とりあえずOutlookには対応させるとしたら返ってきた開封情報を受信して解析が必要かもしれません。

Indyをあまり使ったことがないので開封確認ができるのか調べてみましたが
あまり有益な情報は得られませんでした。

編集 削除
au  2018-03-13 10:58:31  No: 49084  IP: 192.*.*.*

POP3では仕様的に実現出来ないのではないかと思います。
POP3で出来るのは、UIDLを利用した自分自身が受信・確認済みかどうかのチェックが出来るだけではないかと。

outlookが、自作ソフトで受信したメッセージを開封済みと判断出来るのはoutlookはpop3ではなくIMAP接続になっているのではないですか?

編集 削除
たると  2018-03-13 12:36:55  No: 49085  IP: 192.*.*.*

takeさん
いろいろお調べいただきましてありがとうございます。
質問の主旨は当方から送ったメールが「送信先で開封されたか否か」を
判別することではなく、当方が受信したメールを
「自分がすでに開封しているか否か」を判別したいということでした。
あいまいな内容で申し訳ありませんでした。

auさん
POP3の仕様で実現不能ということでしたら納得いたしました。
TIdIMAP4Serverを利用したプログラムを検討してみます。
ありがとうございました。

編集 削除
take  2018-03-13 12:53:10  No: 49086  IP: 192.*.*.*

自身のソフトで受信して開封としているのであればメール番号やメール毎に重複しないIDがありますので
それを使用して自身のソフトで管理します。

IMAP4の仕様を使った場合任意に既読フラグを付けられます。
Outlookとの連携を取るのであればOutlookの設定でIMAP4を使う設定にする必要があるのと
Outlookがどのような仕様で既読としているかはまた別の問題ですので注意が必要です。

編集 削除
たると  2018-03-13 13:14:48  No: 49087  IP: 192.*.*.*

takeさん
> 自身のソフトで受信して開封としているのであればメール番号やメール毎に重複しないIDがありますので 
> それを使用して自身のソフトで管理します。

おっしゃる通りだと思います。
自分のソフトでの開封のほかに、Outlookなどで開封した場合も
開封済みと把握したいと考えたのでした。

> IMAP4の仕様を使った場合任意に既読フラグを付けられます。 
> Outlookとの連携を取るのであればOutlookの設定でIMAP4を使う設定にする必要があるのと 
> Outlookがどのような仕様で既読としているかはまた別の問題ですので注意が必要です。

ご注意ありがとうございます。
IMAP4の仕様については全くわかりませんのでこれから勉強します。
サーバのメッセージにアクセス可能な都合のいい既読フラグが設定されていればよいのですが。

編集 削除
たると  2018-03-14 08:37:38  No: 49088  IP: 192.*.*.*

IMAP4を使っての実現には時間がかかりそうですので、
今回の質問は解決終了といたします。

takeさん、auさん  ありがとうございました。

編集 削除
当てずっぽう  2018-03-14 08:59:12  No: 49089  IP: 192.*.*.*

http://www.indyproject.org/Sockets/Docs/index.EN.aspx

Indy version 10.1.5のヘルプをダウンロードして少しだけ見た結果ですが、
TIdIMAP4.RetrieveHeaderメソッドが該当するのではないでしょうか?

function RetrieveHeader(
    const AMsgNum: Integer; 
    AMsg: TIdMessage
): Boolean;

TIdMessageFlags = (
  mfAnswered,
  mfFlagged,
  mfDeleted,
  mfDraft,
  mfSeen,
  mfRecent
);

のmfSeen

編集 削除
たると  2018-03-14 11:57:33  No: 49090  IP: 192.*.*.*

当てずっぽうさん
ご指摘ありがとうございます。

Gmailで検証してみたところメールボックス内のメッセージはすべてMessageFlagが空で、
RetrieveHeaderのほかRetrievePeekやRetrieveなどのメソッドでも結果は同じでした。

ちなみにGmailではRetrieveしてメッセージのBodyを取得してもWeb上は未読のまま残っており、
他のメールソフトでの開封は検出していないように思えました。

さらに検討してみます。
ありがとうございました。

編集 削除
たると  2018-03-14 15:09:25  No: 49091  IP: 192.*.*.*

OutlookやGmailでIMAPサーバーに接続し
RetrieveHeader( MessageIndex, IdMessage )
または
RetrievePeek( MessageIndex, IdMessage )
でメッセージを取得したのち
CheckMsgSeen( MessageIndex )
で開封・未開封を判別できるようになりました。
Retrieve( MessageIndex, IdMessage )
で開封済となります。

前回の発言で「Gmailでは他のメールソフトでの開封は検出していない」と書きましたが
誤りで開封済と正しく判別していました。

takeさん、auさん、当てずっぽうさん 
おかげで本当に解決に到達できました。
たいへんありがとうございました。

編集 削除
たると  2018-03-14 15:18:13  No: 49092  IP: 192.*.*.*

訂正です

開封・未開封の判別は
CheckMsgSeen( MessageIndex ) 
だけで可能で
RetrieveHeaderやRetrievePeekの実行とは無関係でした。

編集 削除