0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pleasanter Tips: メール送信をする機能を作ってみた

Last updated at Posted at 2023-11-01

コトの発端(情報漏洩の発覚)

(中身は無いので暇なら読んでください。)
とある日、Pleasanterに登録しているユーザーに情報に送りたいと思い掲示板作成しました。そのあと登録した情報をメールで送ろう!と思い付き、通知で送れば良いよね・・・登録完了。。。
仕事でメールを確認したら通知で送ったメールが届いておりフト見ると・・・
あれ?TOに全メールが入っている~~~~ま・ず・い
ここから謝罪メールの作成などなど対応に追われ、ショックで落ち込んでいました。
そもそも通知の仕様を調べて見ると、「複数の固定アドレスを指定した場合には、全ての固定アドレスをTOとして送信します」と。そうだったのか。
PleasanterでDMで使用できる方法が無いかと調べましたが見つからず。
私の希望する機能が無いので作る事にしました。

機能

  1. 掲示板を登録するとユーザーにメールを送る。
  2. ユーザーはPleasanterのユーザーとする。
  3. 送信先は指定した組織に所属するユーザーとする。
  4. 各メールの送り先はTOに設定し、1送り先1メールとする。

※ユーザーは200名までしか対応していません。200名以上の場合はユーザー取得方法を修正する必要があります。

参考画面

image.png

参考動画

設定

状況の設定

image.png
読取専用
既定値:100
選択肢一覧

100,未送信,未,status-new
200,送信可,可,status-inprogress
900,送信済,済,status-closed

プロセス

送信スクリプトでは状態(Status)を判断して動作を行います。
プロセスで処理ボタンを作成します。
メール未送信時のボタン
image.png
メール送信済時のボタン
image.png
各ボタンで状況の変更を行います。
image.png

メール送信プロセス

image.png

メール送信もどしプロセス

image.png

サーバスクリプト

本機能はサーバスクリプトで更新前に処理します。更新前に起動する理由としては、処理簿に状態(Status)を変更する為です。
image.png

設定項目 設定値
ApiKey PleasanterのAPI設定で作成したAPIキーを設定します。
UrlBase APIを実行する際の/api/より前の部分を設定します。
FromUser メールの送信者を指定します。
MailFrom 送信者名およびメールアドレスを設定します。この設定はFromUserが0及び担当者・管理者の場合でもメールアドレスが設定されていない場合に使用します。
MailHeader メールの上部に記述する内容です。
MailFooter メールの下部に記述する内容です。
UsersFilterHash ユーザーを検索する際のフィルター設定です。ViewのColumnFilterHashに指定する内容です。{"DeptId":1,"Disabled":false}の場合は組織IDが1で有効のみの指定方法です。
Send falseを指定するとメールは送信されません。テスト用です。
let ApiKey = "d10d9.....f5c30"; //APIKeyをセット
let UrlBase = "http://localhost";
let FromUser = 1; //0:MailFromを使用 1:担当者を使用 2:管理者を使用
let MailFrom = `管理者 <info@hoge.com>`;  //送信者の初期値
let HeaderUse = 0; //0:MailHeaderを使用 1:編集画面のガイドを使用
let MailHeader = "各位\n"
+"(メッセージヘッダー)\n\n"
let MailFooter = "--------------------------------------------------\n"
+"(メッセージフッター)\n"
let UsersFilterHash = {"DeptId":1,"Disabled":false};
let Send = true;

//サイト情報取得
if( HeaderUse==1 ){
  httpClient.RequestUri = `${UrlBase}/api/items/${model.SiteId}/getsite`;
  httpClient.Content = JSON.stringify({"ApiVersion": 1.0, "ApiKey": ApiKey});
  let site = httpClient.Post();
  site = (JSON.parse( site.toString())).Response.Data;
  MailHeader = `${site.EditorGuide}\n`;
}
//担当者取得
if( FromUser==1 || FromUser==2 ){
  let FromUID = ( FromUser == 1 ? model.Owner : model.Manager );
  httpClient.RequestUri = `${UrlBase}/api/users/${FromUID}/get`;
  httpClient.Content = JSON.stringify({
    "ApiVersion": 1.0,
    "ApiKey": ApiKey,
    "View": {
      "ApiDataType":"KeyValues",
      "ApiColumnKeyDisplayType":"ColumnName",
      "GridColumns":["UserId","DeptId","Name","MailAddresses"],
      "ApiGetMailAddresses": true
    }
  });
  let owner = httpClient.Post();
  owner = (JSON.parse(owner.toString())).response.Data;
  if( owner.length == 1 ){
    if( owner[0].MailAddresses.length > 0 ){
      MailFrom = `${owner[0].Name} <${owner[0].MailAddresses[0]}>`;
    }
  }
}

try{
  let Id;
  model.ResultId == undefined ? Id = model.IssueId : Id = model.ResultId;
  context.Log(`ID:${Id}`);
  context.Log(`Status:${model.Status}`);
  if( model.Status == 200 ){
    MailSend( Id );
    model.Status = 900;
  }
} catch(e) {
  context.Log(e.stack);
}

function MailSend( ItemId ){
  //送信先リスト作成
  httpClient.RequestUri = `${UrlBase}/api/users/get`;
  httpClient.Content = JSON.stringify({
    "ApiVersion": 1.0,
    "ApiKey": ApiKey,
    "View": {
      "ColumnFilterHash":UsersFilterHash ,
      "ApiDataType":"KeyValues",
      "ApiColumnKeyDisplayType":"ColumnName",
      "GridColumns":["UserId","DeptId","Name","MailAddresses"],
      "ApiGetMailAddresses": true
    }
  });
  let user = httpClient.Post();
  let users = (JSON.parse(user.toString())).response.Data;
  if( users.length > 0 ){
    //メール送信
    for( let c=0; c<users.length; c++ ){
      if( users[c].MailAddresses.length > 0 ){
        for( let d=0; d<users[c].MailAddresses.length; d++ ){
          context.Log(`${users[c].Name}/${users[c].MailAddresses[d]}`);
          if(Send) MailSendTo( ItemId, users[c].Name, users[c].MailAddresses[d] );
        }
      }
    }
  }
}

function MailSendTo( ItemId, Name, Address ){
  httpClient.RequestUri = `${UrlBase}/api/items/${ItemId}/OutgoingMails/Send`;
  httpClient.Content = JSON.stringify({
    "ApiVersion": 1.0,
    "ApiKey": ApiKey,
    "From": MailFrom,
    "To": `${Name} <${Address}>`,
    "Title": model.Title,
    "Body": `${MailHeader}\n${model.Body}\n${MailFooter}`
  });
  let result = httpClient.Post();
  context.Log( result );
}

基本的な設定は以上です。

送信メールを隠す

データを消去する(SQL-Server用)

ExtendedSqlsでメールを消去(_deletedに移動)
更新時に自動的にメールを移動します。
※SiteIdListは使用環境に合わせて変更してください。
RmMailLog_MSSQL.json

{
    "Name": "RmMailLog_MSSQL",
    "SiteIdList": [99999],
    "OnUpdated": true
}

RmMailLog_MSSQL.json.sql

BEGIN
INSERT INTO [OutgoingMails_deleted]
SELECT * FROM [OutgoingMails] WHERE [ReferenceId]={{Id}};
DELETE FROM [OutgoingMails] WHERE [ReferenceId]={{Id}};
END;

データを消去する(PostgreSQL用)

RmMailLog_PGSQL.json

{
    "Name": "RmMailLog_PGSQL",
    "SiteIdList": [99999],
    "OnUpdated": true
}

RmMailLog_PGSQL.json.sql

INSERT INTO "Implem.Pleasanter"."OutgoingMails_deleted" 
SELECT * FROM "Implem.Pleasanter"."OutgoingMails" WHERE "ReferenceId"={{Id}};
DELETE FROM "Implem.Pleasanter"."OutgoingMails" WHERE "ReferenceId"={{Id}};

表示しない方法

スクリプトで設定します。
image.png

$p.events.on_editor_load = function () {
  $('form#OutgoingMailsForm').remove();
}

最後に

本スクリプトにより、個別にメールを送る事ができるようになりました。
今回はPleasanterのユーザーにメールしましたが、メール送り先のテーブルを使用する方法も有ります。SFAなどではその方が使い勝手が良いですね。
また、内容はテキストのみでMarkdownに対応できないかとも思っています。
時間を見て検討します。

おまけ

今回作成したスクリプトをPleasanterパッケージで無料で配布しています。
作成が面倒だな~と思ったり、スクリプトはちょっと苦手だと思うからはPleasanterフリーサポートからダウンロードできるのでご活用ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?