SendGrid APIを使ったkintoneのメール送信機能

お世話になっております

下記URLを参考にSendGrid APIを使ったメール送信機能を作成し、
メールの送信まで実現することができました。
SendGrid API を使ってメールを送信するプラグインを作ってみよう - cybozu developer network

しかし、CC、BCCを設定した場合、
カンマ区切りではなく1つのメールアドレスのみ指定するとエラーとなってしまいます。
CC、BCCを設定しない
もしくはカンマ区切りで複数のメールアドレスを指定すると正常に送信され、
メールアプリにも実際にCC欄に指定した値が設定できていることを確認しています。

恐らくdesktop.jsの if (cc) { … の部分が原因かと思いますが
ここの記述はカンマ区切りの文字列が入ってきた場合は正常に処理できるので
カンマなしの1つのメールアドレスだった場合の時
desktop.jsにはどのような記述でCC、BCCを設定すれば良いのか
ご教示頂けますでしょうか。

/*
 * desktop.js
 * SendGrid for kintone
 * Copyright (c) 2015 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
 */

((PLUGIN_ID) => {
  'use strict';

  window.kintonePlugin = {};
  window.kintonePlugin.sendgrid = {
    sendMail: (to, cc, bcc, mailFrom, subject, text, html) => {
      const data = {
        personalizations: [
          {
            to: [
              {
                email: to
              }
            ],
            subject: subject
          }
        ],
        from: {
          email: mailFrom
        },
        content: [
          {
            type: 'text/plain',
            value: text
          }
        ]
      };
      if (cc) {
        data.personalizations[0].cc = [({email: cc})];
      }
      if (bcc) {
        data.personalizations[0].bcc = [({email: bcc})];
      }
      if (html) {
        data.content.push({
          type: 'text/html',
          value: html
        });
      }

      const url = 'https://api.sendgrid.com/v3/mail/send';

      return kintone.plugin.app.proxy(PLUGIN_ID, url, 'POST', {'Content-Type': 'application/json'}, data)
        .then((args) => {
          const body = args[0];
          const status = args[1];

          if (status !== 202) {
            throw new Error();
          } else {
            return body;
          }
        }).catch((err) => {
          throw new Error('メール送信に失敗しました');
        });
    }
  };
})(kintone.$PLUGIN_ID);
/*
 * kintoneのJavaScript / CSSでカスタマイズに設定しているjsファイル
 */

(() => {
	'use strict';

	////////////////////////////////////////////////////////////
	// 初期化処理(レコード詳細画面を表示した後)
	////////////////////////////////////////////////////////////
    var createShowEcents = [
        'app.record.create.show',
        'mobile.app.record.create.show'
    ];
	kintone.events.on(createShowEcents, function(event) {
		
		// 送信者欄にログインユーザーのメールアドレスを自動入力
		event.record.FROM.value = kintone.getLoginUser().email;
		return event;
		
	});


	////////////////////////////////////////////////////////////
    // 保存ボタン押下後
	////////////////////////////////////////////////////////////
    var submitSuccessEvents = [
        'app.record.create.submit',
        'app.record.edit.submit'
    ];
	// レコード登録時にメールを送信
	kintone.events.on(submitSuccessEvents, (event) => {
        // 必須チェック
        if (!event.record.FROM.value || !event.record.TO.value || !event.record.SUBJECT.value || !event.record.BODY.value) {
            // 必須エラー
            event.error = '* 必須項目が未入力です。';
            return event;
        } else {
            if(window.confirm('メールが送信されます。\r\n送信後の取り消しは出来ませんがよろしいでしょうか?')){
                // OK押下時、保存処理&メール送信プラグインを実行
				return kintonePlugin.sendgrid.sendMail(
					event.record.TO.value,
					event.record.CC.value,
					event.record.BCC.value,
					event.record.FROM.value,
					event.record.SUBJECT.value,
					event.record.BODY.value,
					null
				)
				.then((resp) => {
					return event;
				}).catch((err) => {
					event.error = err.message;
					return event;
				});
            } else {
                // キャンセル押下時、保存処理をキャンセルする
                return false;
            }
		}
	});
})();
1 Like

具体的にどういうエラーメッセージになっているかを示すと、回答つきやすいかもです!

ご回答ありがとうございます。
エラー内容は以下でした。

{
	"errors": [
		{
			"message": "Each email address in the personalization block should be unique between to, cc, and bcc. We found the first duplicate instance of [xxxxxxxxxx@xxxxxx.co.jp] in the personalizations.0.cc field.",
			"field": "personalizations.0",
			"help": "http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.recipient-errors"
		}
	]
}

SendGridのAPI側の仕様のエラーのようで、
TO、CC、BCCは一意の値でないといけないようで
カンマ区切りの際にエラーが起こらないのは同じアドレスでも文字列としてみたときは同じ値ではないため。
カンマなしで1つのアドレスを指定した時は、テスト的に同じメールアドレスをTOにもCCにも指定していたことで一意とならないのが要因でした。

エラー内容を読めば分かることでしたので
ご助言頂きありがとうございました。

1 Like

なるほど、カンマ関係なかったんですね!
関係ないところで悩んでしまうことを考えると、エラーメッセージ確認するのやっぱり大事ですね、原因特定できてよかったです!

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。