2008年3月 7日 (金)

通知メールのカスタマイズ (4.実際にメール内容をカスタマイズしてみる)

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

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

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

※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

トラックバック

このページのトラックバックURL: http://bb.lekumo.jp/t/trackback/718613/34255755

通知メールのカスタマイズ (4.実際にメール内容をカスタマイズしてみる)を参照しているブログ:

コメント

いつもものすごく参考にさせてもらっています。

メールの環境が某ノーツだとHTMLメールに対応していないので、
通知メールを非HTMLにしたくて、一連のエントリを読ませていただきました。

おかげさまでカスタマイズは出来そうなのですが、メールからHTMLタグを取り除いたとして、Content-Typeはどうなるのでしょうか?
text/htmlをtext/plainに自動で変えてくれる…だったらいいなあ。

とてもわかりやすく参考になります。
10,000行にも及ぶコードを情報ナシで読み解くのは大変ですよね。

ただ、残念ながらテキスト形式(text/plain)にはならないようですね・・・。内部的にContentTypeがtext/htmlとしてセットされている仕様?

まじくさん、とおりすがりさん

コメントをありがとうございます。ご指摘の通り、今回のカスタマイズはあくまで、ContentTypeとしてどうしてもtext/htmlとなるので、テキスト形式ではないですね。慌てて調べて書いていて肝心なところがすっかり落ちていました。失礼しました。基本的にはHTMLメールであることは変わりないですね。

結局はカスタムでプログラムを組んで、テキスト形式で送信されるようにしてやらないとだめということでしょう。(もし他によさそうな方法をご存じの方がいらしたら、コメントをいただけると嬉しいです)

となると、このエントリはあまり意味がなく一瞬削除しようかとも迷いましたが、せっかく書きましたのでカスタマイズの一例として文面に補足を入れて引き続き掲載しておこうかと思います。

よろしくお願いします。

いやいや!削除なんてダメですよ!
まったく情報がない状況で、ここまでわかりやすくカスタマイズの道を示すのは非常に価値がありますよ~。

text/plainでメール送信するためには、山崎さんのコメントの通り、おそらくイベントレシーバを使って独自実装するしかないかもしれないですね。メチャメチャ工数かかりそうですが・・。

とおりすがりさん

はい。すみません。踏みとどまりました(笑)

それにしても技術力不足でお恥ずかしい限りです。

ご指摘頂けて良かったです。なかなか修正のきかない書籍などとは違い、ブログですし、コメントをいただいたりしながら軌道修正すればいいんですものね。これからもよろしくお願いいたします。

最初にこの質問をした者です。
回答をいただく前に実際にやってみたところ、やはりCopntent-Typeは帰ることは出来ず、Microsoftにも問い合わせしたのですが「変更する方法はありません」とトドメを刺されました(笑

この件については次バージョンで期待するとして、このエントリ自体は文面のカスタマイズ方法として具体的でとても有用でした。
改めてお礼を述べさせていただきます。ありがとうございました。

ので、引き続き山崎さんのBlogには期待しています。