メールを受信する


このテクニックはBASP21を使います。

BASP21については、ご自身で調べてくださいな。

メールの受信にはRcvMailメソッドReadMailメソッドを使います。RcvMailメソッドは、メールボックスにアクセスしてメールを受信します。ReadMailメソッドは、受信したメールを解析してタイトルや送信者・本文などに分解します。

まずメールを受信するRcvMailメソッドからいきましょう。なお、サーバー名やアカウント、パスワードなどはサンプルです。このコードをそのまま実行するとエラーになりますので、ご利用の環境に合わせてサーバー名やアカウント、パスワードなどを適切に設定してください。

Sub Sample()
    Dim bobj, ar
    Dim Server As String, User As String, Pass As String, Command As String, Folder As String
    Set bobj = CreateObject("basp21")              ''BASP21オブジェクト
    Server = "pop.xxxxx.com"                       ''POP3サーバー
    User = "toru_tanaka"                           ''アカウント名
    Pass = "password"                              ''パスワード
    Command = "SAVEALL"                            ''コマンド
    Folder = "<" & ThisWorkbook.Path & "\mail"     ''保存するフォルダ
    ar = bobj.RcvMail(Server, User, Pass, Command, Folder)
    If IsArray(ar) Then
        MsgBox "メールを受信しました"
    Else
        MsgBox "新着メールはありません"
    End If
    Set bobj = Nothing
End Sub

RcvMailメソッドの構文は次の通りです。

RcvMail(Server, User, Pass, Command, Folder)

引数ServerにはPOP3サーバー名を指定します。

引数Userにはアカウント名、引数Passにはパスワードを指定します。

引数Commandはメールの受信方法を指定します。指定したメールだけを受信したり、サーバーにあるメールを削除することなどもできます。「SAVEALL」を指定するとサーバーにあるすべてのメールを受信します。

引数Folderには受信したメールを保存するフォルダを指定します。添付ファイルもこのフォルダに保存されます。ここには存在するフォルダ名を指定してください。存在しないフォルダ名を指定しても自動的にフォルダは作成されませんし、エラーも発生しません。

引数Folderのフォルダ名に「<」をつけると、すでに受信済みのメールは受信しなくなります。つまり新着のメールだけを受信するようになります。このへんは細かい設定が可能ですので、詳しくはBASP21のヘルプをご覧ください。

なお上記のサンプルはThisworkbook.Pathフォルダの中に「mailフォルダ」を作り、そこにメールを受信するように指定しています。ブックを一度も保存していない場合はThisworkbook.Pathが空欄を返しますので、マクロを実行するときは保存したブックでお試しください。

さて、フォルダに受信したメールを解析するのはReadMailメソッドです。ReadMailメソッドは引数に指定したメールを解析して送信者やタイトルなどを返します。ReadMailメソッドの構文は次の通りです。

ReadMail(Mail, Para, Folder)

引数Mailには、読み込むメールをフルパスで指定します。

引数Paraには、どのヘッダを読み込むのかを指定します。

引数Folderには、添付ファイルが保存されているパスを指定します。

RcvMailメソッドは、メールを受信すると、保存したメールのフルパスを配列で返します。したがって、RcvMailメソッドの返り値が配列だった場合はメールを受信したことになり、配列でなかった場合は受信していないことになります。

Sub Sample()
    Dim bobj, ar, Mail, retv
    Dim Server As String, User As String, Pass As String, Command As String, Folder As String
    Dim Para As String
    Set bobj = CreateObject("basp21")              ''BASP21オブジェクト
    Server = "pop.xxxxx.com"                       ''POP3サーバー
    User = "toru_tanaka"                           ''アカウント名
    Pass = "password"                              ''パスワード
    Command = "SAVEALL"                            ''コマンド
    Folder = "<" & ThisWorkbook.Path & "\mail"     ''保存するフォルダ
    ar = bobj.RcvMail(Server, User, Pass, Command, Folder)
    If IsArray(ar) Then
        Para = "from:subject:"
        For Each Mail In ar
            retv = bobj.ReadMail(Mail, Para, Folder)
            If Not IsArray(retv) Then
                MsgBox "メールの受信に失敗しました"
            Else
                Range("A65536").End(xlUp).Offset(1, 0) = retv(0)    ''From
                Range("A65536").End(xlUp).Offset(1, 0) = retv(1)    ''Subject
                Range("A65536").End(xlUp).Offset(1, 0) = retv(2)    ''Body
            End If
        Next Mail
    Else
        MsgBox "新着メールはありません"
    End If
    Set bobj = Nothing
End Sub

引数Paraには「From」と「Subject」を指定しましたので、ReadMailメソッドは、この2つのヘッダ情報と本文(Body)の3つを配列で返します。何らかのエラーでメールを読めなかった場合は配列を返しません。上記サンプルではIsArray関数で判定しています。

受信したメールの「From」「Subject」「Body」は配列retvに格納されていますので、後はそれをどうしようと自由です。上記のサンプルではアクティブシートに書き出しています。なお、それぞれのデータには「From:」などのヘッダ名が先頭に付加されますので留意してください。