Skip to main content

受信した電子メールの操作

ここでは、受信した電子メール・メッセージ (%Net.MailMessageOpens in a new tab) の操作方法について説明します。

メッセージの基本

電子メール・メッセージ (%Net.MailMessageOpens in a new tab) を取得後、一般には、そのメッセージの種類とその読み取り方法 (それがマルチパート・メッセージであるかどうか、およびその部分がバイナリであるかどうか) をまず判断します。この手順では、ContentType プロパティを使用できます。あるいは、間接的に ContentType プロパティと同じ情報を提供する IsBinary プロパティ、IsHTML プロパティ、および IsMultiPart プロパティを使用することもできます。

メッセージがマルチパート・メッセージの場合、各部分は、%Net.MailMessagePartOpens in a new tab のインスタンスです。

メッセージ・ヘッダ

メッセージ自体およびメッセージの各部分にはどちらも、1 組みのヘッダがあります。

%Net.MailMessageOpens in a new tab クラスおよび %Net.MailMessagePartOpens in a new tab クラスは、最も一般的に使用されるヘッダに簡単にアクセスできるプロパティを提供します。例えば、%Net.MailMessageOpens in a new tab は、ToFromSubjectDate などのプロパティを提供します。Headers 配列プロパティによって、カスタム・ヘッダにアクセスできます。"電子メール・メッセージ・ヘッダの指定" を参照してください。

また、%Net.POP3Opens in a new tab によってメッセージを取得した場合、GetAttribute() メソッドを使用することができます。ヘッダ名と属性を指定すると、このメソッドは、その属性の値を返します。

メッセージ・コンテンツ

全般的なメッセージ構造がわかったら、以下の方法でコンテンツを取得します。

  • マルチパート・メッセージの場合、部分の配列である Parts プロパティを使用します。Parts.Count() によって、部分の数が得られます。各部分のキーは、1 で始まる整数です。GetAt() メソッドを使用して、指定部分を取得します。メッセージ部分は、%Net.MailMessagePartOpens in a new tab のインスタンスです。

    %Net.MailMessageOpens in a new tab%Net.MailMessagePartOpens in a new tab の関係については、"InterSystems IRIS で MIME 電子メール・メッセージを表す方法" を参照してください。

  • バイナリ・メッセージ (またはメッセージ部分) の場合、BinaryData プロパティを使用します。

  • テキスト・メッセージ (またはメッセージ部分) の場合、TextData プロパティを使用します。

    • IsHTML が 0 の場合、TextData プロパティは通常のテキスト文字列です。

    • IsHTML が 1 の場合、TextData プロパティは HTML テキスト文字列です。

メッセージを送信する電子メール・クライアントがメッセージ内のラップを決定します。メール・サーバも InterSystems IRIS も、これを制御できません。

その他のメッセージ情報

MessageSize プロパティは、添付された電子メール・メッセージ以外に、メッセージ長の合計を示します。

以下のメソッドは、メッセージについての追加情報を提供します。

GetLocalDateTime()

メッセージが取得された日付と時刻を、$HOROLOG 形式のローカル時間に変換して返します。

GetUTCDateTime()

メッセージが取得された日付と時刻を、$HOROLOG 形式の UTC に変換して返します。

GetUTCSeconds()

メッセージが取得された日付と時刻を 12/31/1840 からの秒数で返します。

日付/時刻変換では、次のクラス・メソッドも使用できます。

HToSeconds()

$HOROLOG 形式の日付および時刻を 12/31/1840 からの秒数に変換するクラス・メソッド。

SecondsToH()

12/31/1840 からの秒数を $HOROLOG 形式の日付および時刻に変換するクラス・メソッド。

例 1 : ShowMsgInfo()

%Net.MailMessageOpens in a new tab のインスタンスを指定すると、以下のメソッドは、メッセージについての情報を現在のデバイスに書き込みます。

ClassMethod ShowMsgInfo(msg as %Net.MailMessage)
{
    Write "Message details *****",!
    Write "To (count): ", msg.To.Count(),!
    Write "From: ", msg.From,!
    Write "Cc (count): ", msg.Cc.Count(),!
    Write "Bcc (count): ", msg.Bcc.Count(),!
    Write "Date: ", msg.Date,!
    Write "Subject: ", msg.Subject,!
    Write "Sender: ", msg.Sender,!
    Write "IsMultipart: ", msg.IsMultiPart,!
    Write "Number of parts: ", msg.Parts.Count(),!
    Write "Number of headers: ", msg.Headers.Count(),!
    Write "IsBinary: ", msg.IsBinary,!
    Write "IsHTML: ", msg.IsHTML,!
    Write "TextData: ", msg.TextData.Read(),!
    Write "BinaryData: ", msg.BinaryData.Read(),!
}

このメソッドは、以下のような出力を生成します。

Message details *****
To (count): 1
From: "XXX XXX" <XXX@XXX.com>
Cc (count): 0
Bcc (count): 0
Date: Fri, 16 Nov 2023 11:57:46 -0500
Subject: test 5
Sender:
IsMultipart: 0
Number of parts: 0
Number of headers: 16
IsBinary: 0
IsHTML: 0
TextData: This is test number 5, which is plain text.
BinaryData:

例 2 : ShowMsgPartInfo()

以下のメソッドは、メッセージの部分についての情報を記述します。

ClassMethod ShowMsgPartInfo(msg as %Net.MailMessage, partno as %Integer)
{
    Set part=msg.Parts.GetAt(partno)
    Write "Message part details *****",!
    Write "Message part: ", partno,!
    Write "IsMultipart: ", part.IsMultiPart,!
    Write "Number of parts: ", part.Parts.Count(),!
    Write "Number of headers: ", part.Headers.Count(),!
    Write "IsBinary: ", part.IsBinary,!
    Write "IsHTML: ", part.IsHTML,!
    Write "TextData: ", part.TextData.Read(),!
    Write "BinaryData: ", part.BinaryData.Read(),!
}

これは、以下のような出力を生成します (前に示したメッセージとは異なるメッセージを指定した場合)。

Message part details *****
Message part: 1
IsMultipart: 0
Number of parts: 0
Number of headers: 2
IsBinary: 0
IsHTML: 0
TextData: 1 test string
 
 
BinaryData:

例 3 : ShowMsgHeaders()

以下のメソッドは、メッセージのヘッダについての情報を記述します。メッセージ部分に対して同じことを行う同様のメソッドを記述することができます。

ClassMethod ShowMsgHeaders(msg as %Net.MailMessage)
{
    Set headers=msg.Headers
    Write "Number of headers: ", headers.Count(),!
    
    //iterate through the headers
    Set key=""
    For {
        Set value=headers.GetNext(.key) 
        Quit:key=""  
        Write "Header:",key,!
        Write "Value: ",value,!!
    }
}

これは、以下のような出力を生成します。

Number of headers: 16
Header: content-class
Value: urn:content-classes:message
 
Header: content-type
Value: multipart/alternative; boundary="----_=_NextPart_001_01C8286D.D9A7F3B1"
 
Header: date
Value: Fri, 16 Nov 2023 11:29:24 -0500
 
Header: from
Value: "XXX XXX" <XXX@XXX.com>
 
Header: message-id
Value: <895A9EF10DBA1F46A2DDB3AAF061ECD501801E86@Exchange1_backup>
 
Header: mime-version
Value: 1.0
 
...

関連項目

FeedbackOpens in a new tab