2008年3月 7日 (金)

前回までの内容を踏まえて、

"タスクリストの「すぐに通知する」となっている変更通知メール"

をカスタマイズしてみます。わかりやすくかつシンプルにするため、今回はテキスト形式のメールっぽくなるように変更してみたいと思います。

※2008.5.30
テキスト形式となると書いておりましたが、数名の方にご指摘いただきContent-Typeとしてはテキストにはできないようなので、「テキスト形式っぽく」と訂正いたしました。テキスト形式にならなくとも、カスタマイズ方法の参考にはなるかと思いますので引き続き掲載は致します。

[図.カスタマイズした通知メール]
Alertplaintextmail

(※図では、テキストメールを確認しやすいように、Outlook 2007 ではなくフリーウェアの edMax を使ってみています)

作業概要

  1. AlertTempates.xml をコピーして、新たに "MyCustomAlertTemplates.xml" という名前で保存します
  2. MyCustomAlertTemplates.xml を編集します
  3. stsadm.exe を使用し、カスタムテンプレートを登録します
  4. IIS を再起動します

AlertTemplates.xml のコピーを作成する

"SharePoint ハイブ"\TEMPLATE\XMLフォルダ内の "alerttemplates.xml" をコピーし、"MyCustomAlertTemplates.xml" という名前で同じフォルダに保存します。ファイル編集時に不具合があった場合に、すぐに元に戻せるようオリジナルの "alerttemplates.xml" には変更を加えないようにするためです(ほかにも今後SP適用時にこのファイルが上書きされる可能性もあるという理由もあります)。

MyCustomAlertTemplates.xml を編集する

今回は タスクリストの通知部分のみをカスタマイズするため、"AlertTemplate Type="List"  Name="SPAlertTemplateType.Tasks" タグ 内の Immediate 要素(タグ)内部を次のように変更しました。

*********************************

<Immediate>
<Subject>
<HTML><![CDATA["]]></HTML>
<GetVar Name="SiteName"/>
<HTML><![CDATA["サイト]]></HTML>
<GetVar Name="ListName" HTMLEncode="True" />
<HTML><![CDATA[内のデータが変更されました。
]]></HTML>

</Subject>
<Header>
<HTML><![CDATA["]]></HTML>
<GetVar Name="SiteName"/>
<HTML><![CDATA["サイト(]]></HTML>
<GetVar Name="SiteUrl" URLEncodeAsURL="TRUE" />
<HTML><![CDATA[)の「]]></HTML>
<GetVar Name="ListName" HTMLEncode="True" />
<HTML><![CDATA[」内のデータが変更されました。
]]></HTML>
<HTML> 
<![CDATA[
【イベントの種類】]]>
</HTML>
<Switch>
<Expr>
  <GetVar Name="EventType" />
  </Expr>
<Default>
<HTML> <![CDATA[$Resources:Alerts_change1_BEGIN;
]]> </HTML>
  </Default>
<Case Value="1">
<HTML>- <![CDATA[$Resources:Alerts_change0_BEGIN;
]]></HTML>
  </Case>
<Case Value="4">
<HTML>- <![CDATA[$Resources:Alerts_change4_BEGIN;
]]></HTML>
  </Case>
<Case Value="9">
<HTML> <![CDATA[$Resources:Alerts_change5_BEGIN;
]]></HTML>
  </Case>
<Case Value="16">
<HTML> <![CDATA[$Resources:Alerts_change6_BEGIN;
]]></HTML>
  </Case>
<Case Value="32">
<HTML><![CDATA[$Resources:Alerts_change7_BEGIN;
]]> </HTML>
  </Case>
  <Case Value="64">
<HTML> <![CDATA[$Resources:Alerts_change8_BEGIN;
]]></HTML>
  </Case>
<Case Value="128">
<HTML> <![CDATA[$Resources:Alerts_change9_BEGIN;
]]></HTML>
  </Case>
   <Case Value="256">
<HTML> <![CDATA[$Resources:Alerts_change10_BEGIN;
]]></HTML>
  </Case>
  </Switch>
<HTML><br/><![CDATA[
  +++++++++++++++++++++++++++++++++++++++++
  "]]></HTML><GetVar Name="ItemName" HTMLEncode="TRUE" /><HTML><![CDATA["
  (]]></HTML><GetVar Name="ItemUrl" HTMLEncode="TRUE" /><HTML><![CDATA[)
+++++++++++++++++++++++++++++++++++++++++
]]></HTML>
</Header>

<Fields>
<Switch>
<Expr><GetVar Name="EventType"/></Expr>
<Case Value="2">
<IfEqual>
<Expr1><GetVar Name="OldValue#{Field}"/></Expr1>
<Expr2><GetVar Name="NewValue#{Field}"/></Expr2>
<Then>
<HTML><![CDATA[
『]]></HTML> <GetVar Name="DisplayName#{Field}" HTMLEncode="TRUE" /><HTML><![CDATA[:]]></HTML>
<GetVar Name="NewValue#{Field}" /><HTML><![CDATA[』]]></HTML>       
</Then>
<Else>
<HTML><![CDATA[
次のフィールドの値は更新されました: 『]]></HTML>
<GetVar Name="DisplayName#{Field}" HTMLEncode="TRUE" /><HTML><![CDATA[』]]></HTML>
<Limit Len="255" AutoHyperLinkNoEncoding="TRUE" MoreText="..."><GetVar Name="OldValue#{Field}" /></Limit>
<HTML><![CDATA[→]]></HTML><GetVar Name="NewValue#{Field}" /></Else>               
</IfEqual>
</Case>
<Default>
<HTML><![CDATA[
『]]></HTML><GetVar Name="DisplayName#{Field}" HTMLEncode="TRUE" /><HTML><![CDATA[:]]></HTML>
<GetVar Name="NewValue#{Field}" /><HTML><![CDATA[』]]></HTML>    
</Default>

</Switch>
</Fields>
<Footer>       
</Footer>
</Immediate>

*********************************

たとえば、テキスト形式のメール内容を生成するには、メール内に記載したいと思うSharePoint サイトの情報を参照する<GetVar Name="">は残し、HTMLタグはいったん取り除きます。そして、文字列を挿入したいところに<HTML><![CDATA[ ここに表示したい任意の文字列を記述]]></HTML>を挿入します。

作成した MyCustomAlerttemplate.xml ファイルは以下の場所に共有しておきますので、参考にしてみてください。MyCustomAlertTemplates.xml

stsadm.exe を実行し、通知テンプレートを登録する

最後に、カスタム作成した通知テンプレートを SharePoint に読み込みます。これには stsadm.exe を使用します。

stsadm.exe -o updatealerttemplates -url <サイトコレクションのURL> -filename <通知テンプレートのファイルパス>

なお、上記コマンドを実行したときに 使用しているテンプレートファイルが 正しいXML構文になっていないとエラーが表示されますが、無事に登録されても "成功しました" といったメッセージは一切表示されませんので注意してください。

最後に IIS を再起動します。

動作確認

任意のタスクリストで通知を設定して動作確認をしてみます。が、このとき、アイテムを変更するなどすると HTMLメールとテキスト形式のメールの2つが送信されてくることがあります。検証していて何故このように2通送られてくるのかをしばらく悩んだのですが、タスクリストには "SPAlertTemplateType.AssignedToNotification" も使用されているためだということがわかりました。通知を設定したユーザーに対して割り当てたタスクがあると、そのタスクの変更は担当者への通知としてもう一通の通知メールが送られます。この通知に "SPAlertTemplateType.AssignedToNotification" テンプレートが用いられています。

ためしに、 <AlertTemplate Type="List"  Name="SPAlertTemplateType.AssignedToNotification">タグ内の<Immediate>タグ内に定義されているスタイルシートを変更してみると確認できます。私は以下のスタイルを変更して確認しました。

.formbody {
  color: #000000;
}

上記の文字色を "Orange" などに変更してみると変更箇所が確認しやすいです。

元の通知に戻すには

さて、元の通知メールに戻すにはどうしたらよいでしょうか?

答えは再び stsadm.exe を使用して オリジナルの alerttemplates.xml を登録(更新)しなおすことです。更新が終わったら、IIS の再起動もお忘れなく。

最後に

いかがでしたでしょうか。今回の一連の記事も結構なボリュームになってしまいました。通知メールのカスタマイズには、よくご質問いただいていたところで、いつかきちんと調べたいと思い続けていたところでした。いろいろと苦労はありましたが、今回の内容を踏まえれば、通知メールの内容はずいぶんとカスタマイズできそうだということが分かりました。

まぁ、とはいえ、XMLを解析する"根気"が何より重要だということが一番よくわかりました(笑)。仕事の合間に検証をしていたのですが、あれこれ調べていたら全部の記事を書きためるのに結局2週間くらいかかってしまいました。メールのカスタマイズに関しては英語のドキュメントもほとんどないため、試行錯誤して大体の勘所をつかんだ感じです。

睡眠時間を削ったりしながら調べた内容ですので、参考になれば幸甚ですconfident

続きを読む »