email-notifications について
ServiceNowの通知設定を扱うスキルです。管理者や開発者向けに、イベント、メールテンプレート、スクリプト、宛先、ダイジェスト、送信設定を解説します。
主な機能
- 01イベント起動通知の設定
- 02再利用可能なメールテンプレート作成
- 03ES5メール・宛先スクリプトの作成
- 04宛先と通知ウェイトの設定
- 05ダイジェストメールの作成
- 06送信メール設定のテスト
活用シーン
- 01インシデント変更時の担当者通知
- 02カスタムイベントのアラート送信
- 03ダイジェストでのインシデント集約
- 04通知の未送信や重複の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ eddiebe147/ claude-settings --skill email-notificationsインストール後、Claude Code で/email-notificationsを入力して読み込まれたか確認します。
詳細
ServiceNow のメール通知
ServiceNow の通知はイベントによってトリガーされ、ユーザーにメール、SMS、その他のアラートを送信します。
通知の構成要素
| 構成要素 | テーブル | 目的 |
|---|---|---|
| 通知 | sysevent_email_action | メインの通知レコード |
| メールテンプレート | sysevent_email_template | 再利用可能なメールレイアウト |
| イベント | sysevent | 通知をトリガーします |
| イベント登録 | sysevent_register | カスタムイベントを定義します |
| メールスクリプト | sys_script_email | 動的コンテンツのスクリプト |
通知の作成
通知の基本構造
Notification: Incident Assigned
├── When to send
│ ├── Table: incident
│ ├── When: Record inserted or updated
│ └── Conditions: assigned_to changes AND is not empty
├── Who will receive
│ ├── Users: ${assigned_to}
│ └── Groups: (optional)
├── What it will contain
│ ├── Subject: Incident ${number} assigned to you
│ ├── Message: HTML body with ${field} references
│ └── Email Template: (optional)
└── Advanced
├── Weight: 0 (priority)
└── Send to event creator: false
通知の条件
// Simple field conditions
assigned_to CHANGES
priority = 1
state = 6 // Resolved
// Script condition (ES5 only!)
// Returns true to send, false to skip
(function() {
// Only notify for VIP callers
var caller = current.caller_id.getRefRecord();
return caller.vip == true;
})()
// Advanced condition with multiple checks
(function() {
// Don't notify on bulk updates
if (current.sys_mod_count > 100) return false;
// Only for production CIs
var ci = current.cmdb_ci.getRefRecord();
return ci.used_for == 'Production';
})()
メールテンプレート
テンプレート変数
${number}
${caller_id.name}
${opened_at.display_value}
${URI}
${URI_REF}
${mail_script:script_name}
${mailto:assigned_to}
テンプレートの例
<html>
<body style="font-family: Arial, sans-serif;">
<h2>Incident ${number} - ${short_description}</h2>
<table border="0" cellpadding="5">
<tr>
<td><strong>Priority:</strong></td>
<td>${priority}</td>
</tr>
<tr>
<td><strong>Caller:</strong></td>
<td>${caller_id.name}</td>
</tr>
<tr>
<td><strong>Assigned to:</strong></td>
<td>${assigned_to.name}</td>
</tr>
<tr>
<td><strong>Description:</strong></td>
<td>${description}</td>
</tr>
</table>
<p>
<a href="${URI}">View Incident</a>
</p>
${mail_script:incident_history}
</body>
</html>
メールスクリプト
メールスクリプトの基本
// Email Script: incident_history
// Table: incident
// Script (ES5 only!):
(function runMailScript(current, template, email, email_action, event) {
// Build activity history
var html = '<h3>Recent Activity</h3><ul>';
var history = new GlideRecord('sys_journal_field');
history.addQuery('element_id', current.sys_id);
history.addQuery('name', 'incident');
history.orderByDesc('sys_created_on');
history.setLimit(5);
history.query();
while (history.next()) {
html += '<li><strong>' + history.sys_created_on.getDisplayValue() + '</strong>: ';
html += history.value.substring(0, 200) + '</li>';
}
html += '</ul>';
template.print(html);
})(current, template, email, email_action, event);
添付ファイル付きメールスクリプト
// Add attachments from the record to the email
(function runMailScript(current, template, email, email_action, event) {
var gr = new GlideRecord('sys_attachment');
gr.addQuery('table_sys_id', current.sys_id);
gr.addQuery('table_name', 'incident');
gr.query();
while (gr.next()) {
email.addAttachment(gr);
}
})(current, template, email, email_action, event);
動的な受信者
// Email Script to add CC recipients dynamically
(function runMailScript(current, template, email, email_action, event) {
// Add all group members as CC
var group = current.assignment_group;
if (!group.nil()) {
var members = new GlideRecord('sys_user_grmember');
members.addQuery('group', group);
members.query();
while (members.next()) {
var user = members.user.getRefRecord();
if (user.email) {
email.addAddress('cc', user.email, user.name);
}
}
}
})(current, template, email, email_action, event);
カスタムイベント
カスタムイベントの登録
// Event Registration
// Name: x_myapp.incident.escalated
// Table: incident
// Description: Fired when incident is escalated to management
// Fired by: Business Rule
// In Business Rule (ES5 only!)
(function executeRule(current, previous) {
// Check if escalation occurred
if (current.escalation > previous.escalation) {
// Fire custom event
gs.eventQueue('x_myapp.incident.escalated', current,
current.escalation.getDisplayValue(), // parm1
current.assigned_to.name // parm2
);
}
})(current, previous);
カスタムイベントでの通知
Notification: Escalation Alert
├── When to send
│ ├── Send when: Event is fired
│ └── Event name: x_myapp.incident.escalated
├── Who will receive
│ └── Users/Groups: Escalation Managers
└── What it will contain
├── Subject: Escalation: ${number} - ${event.parm1}
└── Message: Incident escalated. Assigned to: ${event.parm2}
受信者の種類
受信者
| 種類 | 説明 | 例 |
|---|---|---|
| ユーザー | 特定のユーザー | ${assigned_to}, ${caller_id} |
| グループ | ユーザーグループ | Service Desk, CAB |
| グループマネージャー | グループマネージャーのフィールド | ${assignment_group.manager} |
| イベントパラメーター 1/2 | イベントパラメーターから取得 | ${event.parm1} |
| 追加の受信者 | メールアドレス | 外部のメールアドレス |
受信者スクリプト
// Recipient Script (ES5 only!)
// Returns comma-separated list of emails or sys_ids
(function getRecipients(current, event) {
var recipients = [];
// Add the caller
if (!current.caller_id.nil()) {
recipients.push(current.caller_id.email.toString());
}
// Add VIP's manager
var caller = current.caller_id.getRefRecord();
if (caller.vip == true && !caller.manager.nil()) {
recipients.push(caller.manager.email.toString());
}
return recipients.join(',');
})(current, event);
通知の優先度
一致する通知が複数ある場合の優先順位システム:
| 重み | 用途 |
|---|---|
| 0 | デフォルトの優先度 |
| 1-99 | 高い優先度(重みが小さいほど優先度が高くなります) |
| -1 to -99 | 低い優先度 |
| 100+ | ほとんど使用されません |
// Only highest weight notification sends if "Exclude subscribers" checked
// Weight 0 notification beats Weight 10 notification
ダイジェスト通知
ダイジェストの設定
Notification: Daily Incident Summary
├── Digest: Checked
├── Digest Interval: Daily
├── Digest Time: 08:00
└── Content: Summary of all incidents
ダイジェストメールスクリプト
// Summarize digest records
(function runMailScript(current, template, email, email_action, event) {
var count = 0;
var html = '<table border="1" cellpadding="5">';
html += '<tr><th>Number</th><th>Description</th><th>Priority</th></tr>';
// 'current' is a GlideRecord with all digest records
while (current.next()) {
count++;
html += '<tr>';
html += '<td>' + current.number + '</td>';
html += '<td>' + current.short_description + '</td>';
html += '<td>' + current.priority.getDisplayValue() + '</td>';
html += '</tr>';
}
html += '</table>';
html += '<p>Total: ' + count + ' incidents</p>';
template.print(html);
})(current, template, email, email_action, event);
送信メールの設定
メールプロパティ
// System Properties for email
glide.email.smtp.active // Enable/disable outbound email
glide.email.smtp.host // SMTP server
glide.email.smtp.port // SMTP port (usually 25 or 587)
glide.email.default.sender // Default from address
glide.email.test.user // Test recipient (all emails go here)
通知のテスト
// Background Script to test notification (ES5 only!)
var gr = new GlideRecord('incident');
gr.get('sys_id_here');
// Fire event to trigger notification
gs.eventQueue('incident.assigned', gr,
gr.assigned_to.getDisplayValue(),
gs.getUserDisplayName());
gs.info('Event queued for incident: ' + gr.number);
ベストプラクティス
- テンプレートを使用する - 通知間でレイアウトを再利用します
- 十分にテストする - 開発中はテストユーザープロパティを使用します
- ダイジェストを検討する - 通知量が多い場合に使用します
- 重みを慎重に設定する - メールの重複を防ぎます
- ES5 のみ - すべてのスクリプトが ES5 に準拠している必要があります
- 受信者を制限する - 大人数のグループに迷惑メールを送らないようにします
- コンテキストを含める - ログインしなくても対応できる十分な情報を提供します
- モバイル対応にする - モバイルクライアント向けに HTML をシンプルに保ちます
よくある問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| メールが送信されない | イベントが発生していない | ビジネスルールがイベントを発生させているか確認します |
| 受信者が正しくない | スクリプトエラー | 受信者スクリプトをデバッグします |
| コンテンツが欠落している | テンプレート変数が正しくない | フィールド名を確認します |
| メールが重複する | 通知が複数ある | 重みと条件を確認します |
| メールの送信が遅れる | メールジョブのスケジュール | sysauto_script を確認します |
コメント
Markdown 対応