DOBON.NET DOBON.NETプログラミング掲示板過去ログ

定期メール受信

  • 題名: 定期メール受信
  • 著者: 旅がらす
  • 日時: 2006/09/19 11:36:00
  • ID: 17597
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[WindowsXP,Outlook2002,VisualStudio2005]
分類:[.NET]

2006/09/19(Tue) 13:47:41 編集(投稿者)
2006/09/19(Tue) 13:47:35 編集(投稿者)

現在、定期間隔でメール受信し、受信データをDB登録するWinアプリを作成しています。

------------------------------------------------------------
Dim oApp As Outlook.Application = CreateObject("Outlook.Application")
Dim obj1 As Object = oApp.Explorers.Item(1).CommandBars("Menu Bar")
Dim obj2 As Object = obj1.Controls(5) 'ツール
Dim obj3 As Object = obj2.Controls(1) '送受信
obj3 = Nothing
obj2 = Nothing
obj1 = Nothing

Dim oNS As Outlook.NameSpace = oApp.GetNamespace("MAPI")
'受信トレイからメール取得
Dim oInbox As Outlook.MAPIFolder = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
Dim oItems As Outlook.Items = oInbox.Items()

Dim oMsg As Outlook.MailItem
For i As Integer = 1 To oItems.Count 'Outlookはindex1からカウント

※ここで受信メールを1件ずつDB登録
Next

oNS.Logoff()
oApp = Nothing
oNS = Nothing
oItems = Nothing
oMsg = Nothing
------------------------------------------------------------

ここでいくつか問題点(改善したい点)があるので質問させてください。

1.最新メールの受信処理をもっとスマートにやる方法があるか。
2.コードからメール情報にアクセスした場合、警告ダイアログが出てしまうが、
 これを出さない(あるいは自動でOKを押下することは可能か)
3.受信メールの送信者情報をSenderNameで取得した場合、
 Outlookのアドレス帳に登録されているデータだとメールアドレスではなく登録名称を取得してしまう。
 →常にメールアドレス情報を取りたい。(SenderEmailAddressは使えないようです)
4.添付ファイル名は取得できるが、添付ファイルのバイナリデータが取得したい。
 SaveAsFileでローカルに一時的に保存して、そこから再取得して変換するしかないのでしょうか。
 
そして最後に、
5.Outlookを使うよりももっと手軽に受信メールのDB登録機能を実現できる方法はないのか。
 →MAPI.sessionだと、FolderやMessage型が使用不可でした(CDO.dllのヴァージョン?)
 
長々と書いてしまいましたが、
何か良いお知恵があればお教えください。
よろしくお願いいたします。
> 5.Outlookを使うよりももっと手軽に受信メールのDB登録機能を実現できる方法はないのか。
>  →MAPI.sessionだと、FolderやMessage型が使用不可でした(CDO.dllのヴァージョン?)

手軽に、ということなら、現在選択されている手法(Outlook をオートメーション)は十分に手軽な部類に入ると思います。

これより手軽な方法を選択すると、要件が満たせなくなってしまう危険があります。

さらにきめ細かく処理を行いたいということであれば、IIS の SMTP サービスを使う、なんて方法もあったりするわけですが。。。
渋木宏明(ひどり)様、ご返信ありがとうございます。

> 手軽に、ということなら、現在選択されている手法(Outlook をオートメーション)は十分に手軽な部類に入ると思います。

現在、VB6のMAPISessionとMAPIMessagesコントロールを使う方法も試しています。
ソースはこんな感じです。

-------------------------------------------
With MAPISession
.UserName = "Outlook"
.Password = ""
.DownLoadMail = True ' 最新メールを受信トレイにダウンロード
.LogonUI = True
.NewSession = True
If .SessionID = 0 Then : .SignOn() : End If

End With

MAPIMessages.SessionID = MAPISession.SessionID

'MAPIMessages.FetchMsgType = ""
'MAPIMessages.FetchSorted = True
MAPIMessages.FetchUnreadOnly = False '試験用
'MAPIMessages.FetchUnreadOnly = True
MAPIMessages.Fetch()

For i As Integer = 0 To (Me.MAPIMessages.MsgCount - 1)

Me.MAPIMessages.MsgIndex = i 'アクセス直後に既読状態になる

Console.WriteLine(Me.MAPIMessages.MsgOrigAddress)
Console.WriteLine(Me.MAPIMessages.MsgOrigDisplayName)
Console.WriteLine(Me.MAPIMessages.MsgSubject)
Console.WriteLine(Me.MAPIMessages.MsgDateReceived)
Console.WriteLine(Me.MAPIMessages.MsgNoteText)
Console.WriteLine(Me.MAPIMessages.AttachmentCount)

Next

Me.MAPISession.SignOff()
---------------------------------------------------

ただ、こちらもいろいろと問題点がありました。
1.「DownLoadMail = True」としているのに、Fetchしても受信トレイにサーバーから最新メールが受信されてこない。
 (各種サイトのサンプルでは問題なさそうなのですが)
2.添付ファイル名が長いと「AttachmentName」で省略された形でしか取得できない。
 ただ、Outlook上の表示では正常になっているので、どこかに情報はありそう。
3.この方法でも、プログラムからOutlookメール情報を参照しようとすると
 「プログラムが、Outlook 内に保存されている電子メール アドレスにアクセスしようとしています」という警告が出る。
4.MAPISessionのPasswordが何のパスワードだか不明。
 Outlookプロファイルの個人フォルダにかけたパスワード情報を自動入力するためかと思いましたが、
 Passwordに値を指定してもSignOn時にパスワード入力を求められるので、違うようです。
 
昨日MAPISessionとMAPIMessagesについてネットで調べてみましたが、
全体的に情報が少ないですね。
質問自体も少ないですが、それに対する回答は更に少ないです。
疑問だけ提示されて何の回答もないままというサイトが結構多かったので、
このあたりはマニアックな疑問なのでしょうか。
> このあたりはマニアックな疑問なのでしょうか。

マニアックかどうかは分かりませんが、利用者が少ないのは確かと思います。

元々DBなんかと違ってミドルウェアのようなものは無い世界です。

そもそもで言えば、クライアントサイドで受信メールをどうこうするようなアプローチは傍流という感もありますし。
2006/09/21(Thu) 23:58:42 編集(投稿者)
2006/09/21(Thu) 23:58:36 編集(投稿者)

自宅PCからの投稿です。

> マニアックかどうかは分かりませんが、利用者が少ないのは確かと思います。

そうなのですか。
あるメールボックスにきたメールを自動的にDB登録する、なんて機能は結構需要がありそうだと思ったのですけれど。

それはそうと、
いくつか判明したことがあるので自己レスします。

>1.「DownLoadMail = True」としているのに、Fetchしても受信トレイにサーバーから最新メールが受信されてこない。

これはOutlookExpressを規定のメーラーとして指定すると最新メールが受信できました。
Outlookの問題のようですね。
WindowsがOutlookExpressを優先的に参照しているのでしょうか。

>2.添付ファイル名が長いと「AttachmentName」で省略された形でしか取得できない。

Outlookの制限機能で、一時フォルダに格納された添付ファイル名は8バイトまでになるそうです。
添付ファイル名の正式名称は受信ボックスデータの中にしかないので
取得するのは困難。(できなくはないでしょうが、そこまでやることかどうかは疑問)

>3.この方法でも、プログラムからOutlookメール情報を参照しようとすると
>「プログラムが、Outlook 内に保存されている電子メール アドレスにアクセスしようとしています」という警告が出る。

OutlookExpressだと出ませんでした。
これは1番の問題と同じ原因のような気がします。
  • 題名: Re[5]: 定期メール受信
  • 著者: 旅がらす
  • 日時: 2006/09/25 12:53:06
  • ID: 17673
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2006/09/25(Mon) 12:53:22 編集(投稿者)

結局OutlookExpressで対応することにしました。
疑問自体は解決していませんが、
やりたいことは実現できたのでこのトピックはこれで閉じさせていただきます。

渋木宏明(ひどり)様、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板