Microsoft 365 Outlook for Business: メール取得

Microsoft 365 Outlook for Business: メール取得

Microsoft 365 Outlook for Business: Get Email Message

この工程は、Outlook のメールを取得します。

Auto Step icon
Basic Configs
工程名
メモ
Configs for this Auto Step
conf_OAuth2
C1: OAuth2 設定 *
conf_MessageId
C2: メール ID *
conf_FromAddress
C3-A: From メールアドレスを保存するデータ項目
conf_FromName
C3-N: From 表示名を保存するデータ項目
conf_ReplyToAddresses
C4-A: Reply-To メールアドレス一覧を保存するデータ項目
conf_ReplyToNames
C4-N: Reply-To 表示名一覧を保存するデータ項目
conf_RecipientAddresses
C5-A: To/Cc/Bcc メールアドレス一覧を保存するデータ項目
conf_RecipientNames
C5-N: To/Cc/Bcc 表示名一覧を保存するデータ項目
conf_SentDatetime
C6: 送信日時を保存するデータ項目
conf_Subject
C7: 件名を保存するデータ項目
conf_Body
C8-1: 本文を保存するデータ項目
conf_AsHTML
C8-2: 本文を HTML 形式で取得する
conf_Attachments
C9: 添付ファイルを保存するデータ項目

Notes

Capture

See Also

Script (click to open)
  • 次のスクリプトが記述されている XML ファイルをダウンロードできます
    • outlook-message-get.xml (C) Questetra, Inc. (MIT License)
    • Professional のワークフロー基盤では、ファイル内容を改変しオリジナルのアドオン自動工程として活用できます

// OAuth2 config sample at [OAuth 2.0 Setting]
// - Authorization Endpoint URL: https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/authorize
// - Token Endpoint URL: https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token
// - Scope: https://graph.microsoft.com/Mail.Read offline_access
// - Consumer Key: (Get by Microsoft Azure Active Directory)
// - Consumer Secret: (Get by Microsoft Azure Active Directory)

function main(){
    //// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
    const auth = configs.getObject('conf_OAuth2');
    const messageId = retrieveMessageId();
    const defs = retrieveDefs();
    const asHtml = configs.getObject('conf_AsHTML');

    //// == 演算 / Calculating ==
    const message = getMessage(auth, messageId, asHtml);

    const qfiles = new java.util.ArrayList(); // もともと添付されていたファイルはクリアする
    if (defs.AttachmentsDef !== null) {
        getAttachments(auth, messageId, qfiles);
    }

    //// == ワークフローデータへの代入 / Data Updating ==
    setData(defs.FromAddressDef, message.fromAddress);
    setData(defs.FromNameDef, message.fromName);
    setData(defs.ReplyToAddressesDef, message.replyToAddresses.join('\n'));
    setData(defs.ReplyToNamesDef, message.replyToNames.join('\n'));
    setData(defs.RecipientAddressesDef, message.recipientAddresses.join('\n'));
    setData(defs.RecipientNamesDef, message.recipientNames.join('\n'));
    setData(defs.SentDatetimeDef, dateFormatter.parse("yyyy-MM-dd'T'HH:mm:ssX", message.sentDateTime));
    setData(defs.SubjectDef, message.subject);
    setData(defs.BodyDef, message.body);
    setData(defs.AttachmentsDef, qfiles);
}

/**
 * config からメール ID を読み出す
 * 空の場合はエラー
 * @returns {String} メール ID
 */
function retrieveMessageId() {
    const messageId = engine.findData(configs.getObject('conf_MessageId'));
    if (messageId === null) {
        throw new Error('Message ID is blank.');
    }
    return messageId;
}

/**
 * config から保存先データ項目の ProcessDataDefinitionView を読み出す
 * 以下の場合はエラー
 * - 値を保存するデータ項目が重複して設定されている
 * - 値を保存するデータ項目がひとつも設定されていない
 * @returns {Object} defs 保存先データ項目の ProcessDataDefinitionView を格納した JSON オブジェクト
 */
function retrieveDefs() {
    const items = ['FromAddress', 'FromName', 'ReplyToAddresses', 'ReplyToNames',
        'RecipientAddresses', 'RecipientNames', 'SentDatetime', 'Subject', 'Body', 'Attachments'];
    const defs = {};
    const dataItemNumSet = new Set(); // データ項目の重複確認用
    items.forEach( item => {
        const dataItemDef = configs.getObject(`conf_${item}`);
        if ( dataItemDef !== null ) { // データ項目が設定されている場合は重複を確認する
            const dataItemNum = dataItemDef.getNumber();
            if ( dataItemNumSet.has( dataItemNum ) ) { // データ項目番号が重複していればエラー
                throw new Error('The same data item is set multiple times.');
            }
            dataItemNumSet.add( dataItemNum ); // データ項目の重複確認用
        }
        defs[`${item}Def`] = dataItemDef;
    });
    if (dataItemNumSet.size === 0) {
        throw new Error('No data item to save the result is set.');
    }
    return defs;
}

/**
 * Microsoft Graph API にメール取得の GET リクエストを送信
 * @param {AuthSettingWrapper} auth 認証設定
 * @param {String} messageId メール ID
 * @param {Boolean} asHtml 本文を HTML 形式で取得するかどうか
 * @returns {Object} message メールの情報を格納した JSON オブジェクト
 */
function getMessage(auth, messageId, asHtml) {
    const preferredType = asHtml ? 'html' : 'text';
    const response = httpClient.begin()
        .authSetting(auth)
        .header('Prefer', `outlook.body-content-type="${preferredType}"`)
        .queryParam('$select', 'from,replyTo,toRecipients,ccRecipients,bccRecipients,subject,body,sentDateTime')
        .get(`https://graph.microsoft.com/v1.0/me/messages/${encodeURI(messageId)}`);
    const status = response.getStatusCode();
    const responseStr = response.getResponseAsString();
    if (status !== 200) {
        engine.log(responseStr);
        throw new Error(`Failed to get message. status: ${status}`);
    }
    const message = JSON.parse(responseStr);
    const recipients = message.toRecipients.concat(message.ccRecipients, message.bccRecipients);
    // 下書きメールの場合、from が undefined になる
    let fromAddress = '';
    let fromName = '';
    if (message.from !== undefined) {
        fromAddress = message.from.emailAddress.address;
        fromName = message.from.emailAddress.name;
    }
    return {
        fromAddress,
        fromName,
        replyToAddresses: message.replyTo.map(replyTo => replyTo.emailAddress.address),
        replyToNames: message.replyTo.map(replyTo => replyTo.emailAddress.name),
        recipientAddresses: recipients.map(recipient => recipient.emailAddress.address),
        recipientNames: recipients.map(recipient => recipient.emailAddress.name),
        sentDateTime: message.sentDateTime,
        subject: message.subject,
        body: message.body.content
    };
}

/**
 * メールの添付ファイルを取得する
 * @param {AuthSettingWrapper} auth 認証設定
 * @param {String} messageId メール ID
 * @param {ArrayList<NewQfile>} qfiles 添付ファイルを格納する配列
 */
function getAttachments(auth, messageId, qfiles) {
    const response = httpClient.begin()
        .authSetting(auth)
        .get(`https://graph.microsoft.com/v1.0/me/messages/${encodeURI(messageId)}/attachments`);
    const status = response.getStatusCode();
    const responseStr = response.getResponseAsString();
    if (status !== 200) {
        engine.log(responseStr);
        throw new Error(`Failed to get attachments. status: ${status}`);
    }
    const attachments = JSON.parse(responseStr).value;
    attachments.forEach(attachment => {
        const qfile = new com.questetra.bpms.core.event.scripttask.NewQfile(
            attachment.name,
            attachment.contentType,
            base64.decodeFromStringToByteArray(attachment.contentBytes) // ByteArrayWrapper
        );
        qfiles.add(qfile);
    });
}

/**
 * 保存先データ項目の ProcessDataDefinitionView が null でない場合のみ値を代入する
 * @param {ProcessDataDefinitionView} def 保存先データ項目の ProcessDataDefinitionView
 * @param {Object} value  データ項目に代入する値
 */
function setData(def, value) {
    if (def === null) {
        return; // データ項目が設定されていなければ何もしない
    }
    engine.setData(def, value);
}

    
上部へスクロール

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む