SMTPを使用したSitecoreフォームとメール機能について
1. 企業のSitecore活用におけるフォームとカスタムメール機能の問題点
1.1. よく起こる問題
企業がSitecoreを活用して 、自社の顧客に対しキャンペーンメッセージやEmail Experience Manager(EXM)を使用しメールキャンペーンを管理する際に、次のような課題に直面することがあります。
- 1.EXMモジュールは一見柔軟そうに見えるものの、実態としてはさまざまな制約がある。
- 2.フォーム化された連絡先にしかメールを送ることができず 、メールを送信したい宛先がXDBとして変換されているのか確認をする必要がある。
- 3.特定の入力フィールド のみを含むメールを送信したい場合でも、事前に設計されている全フィールドを含むメールしか送信できないため、企業の要望にあわせて柔軟に内容をカスタマイズすることができない。
1.2. これらの問題を解決して、企業は何を実現できるのか
上述したような問題に対する解決策のご説明に移る前に、企業はSitecoreの活用を通じてどのようなメリットを得ることができるのかを簡単にご紹介します。
- 1.フォームの管理がしやすく時間の節約が可能:Sitecore フォームは作成も管理も非常に簡単で、ドラッグ&ドロップで簡単にフォームを作成でき、既存のフォームもワンクリックで管理できます。
- 2.柔軟なカスタマイズが可能に:Sitecoreはカスタム保存アクションの実行方法についてしっかりとしたドキュメントを提供してくれており、いくつかのコードを追加するだけで、Sitecoreフォームで指定できるメールアドレスにフォームコンテンツをバックグラウンドで送信するためのカスタム保存アクションを作成することができます。
カスタムメール送信アクションを作成することで、パーソナライズされたトークンと標準のSMTP設定を使用して、企業の要件に応じたフォームフィールドとデータを表示することができます。 - 3.企業の生産性とユーザビリティを向上:同じテンプレート、または同じカスタム送信アクションアイテムを使用することで、簡単に複数のクラスを作成し、それぞれ数秒のうちに複数のユーザーにメールを送信することができます。
それではこれから、課題を解決し、メールキャンペーンなどを活用した企業の最適なWEBマーケティングを実現するSitecoreの実装方法について、機能紹介などを交えながらプロセスを紹介していきます。
2. SMTPを利用したSitecoreフォーム&メール機能
Sitecore のバージョン9.0で、主要な機能のひとつとして「Sitecoreフォーム」が実装されました。
Sitecoreフォームでは、カスタムまたは標準の要素を使用することで、フォームをすばやく作成することができるほか、フォーム要素ペインから必要なセクションをドラッグ&ドロップするだけで、複数のページを簡単に作成することができます。
Sitecoreのフォームを使用すると、次のことが可能になります:
- 1.テンプレートでフォームを作成
- 2.フォーム要素ウィンドウからカスタム要素をフォームキャンバスにドラッグして、新しいフォームを作成
- 3.検証フォームを申請
- 4.企業の要望にあわせてフォームをカスタマイズ
- 5.フォームのパフォーマンスに関するレポートの作成と実行
- 6.フォーム画面からデータを抽出し、Microsoft Excelに投入
2.1. Sitecore 9.0 フォーム要素
Sitecoreにログインすると、右ペインに「Form Elements」という項目が表示されます。Sitecore 9.0では、Form Elementsに「BASIC」「LISTS」「SECURITY」「STRUCTURE」という4つのカテゴリーが用意されています。
各カテゴリーの内容を簡単に説明すると、以下の通りです。
2.1.1. BASIC
フォームキャンバスにドラッグ&ドロップするためのさまざまなオプションを提供しています。このフィールドタイプは、要件に応じて編集することができます。
2.1.2. LISTS
データの収集と表示を行い、いくつかの値のセットから1つまたは複数のオプションを選択することができます。デフォルトのリスト要素は、リストボックス、チェックボックス、ラジオ、ドロップダウン・リストです。
2.1.3. SECURITY
PASSWORDとPASSWORD CONFIRMATIONのグループがあり、ユーザーがパスワードを入力し、パスワード間違いを避けるために確認することができます。
2.1.4. STRUCTURE
フォームを正しく構成するためのもので、他のすべてのセクションのまさにメインとなるセクションです。セクションはフォームをグループに分けるために使われ、ページが複数あるフォームメソッドを実行するのに役立ちます。
2.2. ドロップダウンリストにプレースホルダーテキストを追加
ドロップダウンリストでは、リストから関連するオプションを選択することができます。ここでは、ドロップダウンリストに国を使用しています。
次に、Webroot フォルダーの中の… \Views\FormBuilder\FieldTemplates\DropdownList.cshtml に移動して、for-each ループで次のように変更します。
2.3. カスタムメール送信アクション
2.3.1. カスタムメール送信アクションの作成
送信アクションを作成し、SMTP設定によってメールを送信する方法をご紹介します。
まずは以下のように名前、会社名、連絡先番号、ドロップダウン、電子メール、メッセージといった複数の要素を含むテキストフィールドでフォームを作成しました。
次にToAddress、Subject、MailBody、FromAddressのように、メールセクションで表示したいすべてのフィールドを持つアイテムをテンプレートとして作成し、これをtemplate.csファイルに追加します。
2.3.1.1. カスタム送信アクションクラスの作成
送信アクションでは、ボタンがクリックされた後にどのような動作をするかを指定し、1つのボタンに1つまたは複数の送信アクションを追加することができます。
Visual Studio で Custom-Submit-Action クラスを作成し、フォームページで使用するデータ構造クラスである以下のリファレンスを追加します。これは、SubmitActionBaseを継承し、Executeメソッドをオーバーライドすることになります。こうすることで、カスタムロジックを書くことができるようになります。
以下は、SaleContactMail をクラス名とするカスタム送信クラスの基本例です。
using System; using System.Linq; using System.Net.Mail; using Sitecore.Diagnostics; using Sitecore.ExperienceForms.Models; using Sitecore.ExperienceForms.Processing; using Sitecore.ExperienceForms.Processing.Actions; using Sitecore.Foundation.SitecoreExtensions.Extensions; namespace Sitecore.Foundation.SitecoreExtensions.Utility { public class SaleContactEmail : SubmitActionBase<string> { public SaleContactEmail(ISubmitActionData submitActionData) : base(submitActionData) { } protected override bool Execute(string data, FormSubmitContext formSubmitContext) { try { formSubmitContext.RedirectOnSuccess = true; formSubmitContext.Abort(); return true; } catch (Exception ex) { Log.Error("Contact us ", ex.Message); return true; } } private string GetValue(object field) { return field?.GetType().GetProperty("Value")?.GetValue(field, null)?.ToString() ?? string.Empty; } protected override bool TryParse(string value, out string target) { target = string.Empty; return true; } } }
- ※投稿アクションのカスタムロジックを書くとき、XXXやXXXといった、所定の方法で送信されたフォームデータを考慮する必要があります。
- ※FormSubmitContext の項目は Fields プロパティを持ち、送信されたフィールドとそれに対応する値を見つけることができます。
- ※SubmitActionBaseでは文字列のパラメータを使用しているため、TryParseメソッドをオーバーライドする必要があり、そうしないとコードが実行されません。
さて、try ブロックでは、以下のスクリーンショットに示すように、フィールドの値プロパティを取得する関数 "GetValue" を呼び出して、作成したすべてのフィールドの値を取得します。Name、CompanyName、Telephone、Email、Messageは、Formsのフィールド名で定義された入力フィールドの名前です。
var Name = GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("Name"))); var Company = GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("CompanyName"))); var MobileNo = GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("Telephone"))); var Email = GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("Email"))); var Message = GetValue(formSubmitContext.Fields.FirstOrDefault(f => f.Name.Equals("Message")));
ここでは、すべてのフィールドのフォームに入力した値を取得し、Sitecoreで作成したアイテムに移動して、MailMessageのオブジェクトにFrom、To、Subject、Bodyフィールドを取得します。
EXMではメールのメッセージを個々に最適化できる「トークン」がサポートされており、たとえばメッセージの冒頭の挨拶でトークン「$name$」を使用すると、メールを送信するときに$name$の部分が宛先の「名前」に置き換えられます。
ここでは、トークンを作成し、replaceメソッドを使ってトークンを特定のフォームフィールドに置き換えています。
MailMessage message = new MailMessage(); message.From MailAddress(contact.Fields[Templates.Mail.Fields.FromAddress].Value); message.Subject = contact.Fields[Templates.Mail.Fields.Subject].Value; string[] multi = contact.Fields[Templates.Mail.Fields.ToAddress].Value.Split(';'); foreach (var item in multi) { message.To.Add(new MailAddress(item)); } message.Body = contact.Fields[Templates.Mail.Fields.MailBody].Value; message.Body = message.Body.Replace("$YourName$", Name) + Environment.NewLine; message.Body = message.Body.Replace("$CompanyDetails$", Company); message.Body = message.Body.Replace("$Telephone$", MobileNo) + "\n"; message.Body = message.Body.Replace("$Email$", Email); message.Body = message.Body.Replace("$Msg$", Message);
Sitecoreからすべての値を取得した後のtryブロックでは、上記のSMTP設定を追加します。ここでは、SmtpClientクラスのSmtpServerオブジェクトを作成し、ホスト名(smtp-pulse.com)とポート番号(587)を受け取ります。Sendpulseは587か2525のどちらかを使うことを想定しており、安全な接続のためにCredentialsとEnableSslプロパティを使用しています。 ユーザー名の代わりに、アカウント作成時に作成したSmtpserverのユーザー名とパスワードを指定する必要があります。Sendメソッドは、MailMessageのオブジェクトを受け取り、エラーメッセージがなければ、電子メールメッセージを正常に送信します。
SmtpClient SmtpServer = new SmtpClient("smtp-pulse.com", 587); SmtpServer.Host = "smtp-pulse.com"; System.Net.NetworkCredential basicAuthenticationInfo = new System.Net.NetworkCredential("UserName", "Password"); SmtpServer.EnableSsl = false; SmtpServer.UseDefaultCredentials = true; SmtpServer.Port = 587; SmtpServer.Credentials = basicAuthenticationInfo; SmtpServer.Send(message);
SMTPの詳細については、後述する3.追加情報を参照してください。
2.3.1.2. カスタム送信アクションアイテムの作成
- 1.コンテンツエディターで、/Sitecore/System/Settings/Formsに移動
- 2.Submit Actionを右クリック->Insert->SubmitActionテンプレートを選択
- 2.送信アクションの名前を入力し、OKをクリック
上の画像に示すように、モデルタイプとエラーメッセージを入力します。この新しく作成された送信アクションは、送信ボタンの追加リストにバインドされ、フォームで利用できるようになります。
以上で、SMTPサーバーを経由して任意の受信者にメールを送信するための準備が整いました。
3. 追加情報
SMTP(Simple Mail Transfer Protocol)は、インターネット上で電子メールを送信するためのネットワークプロトコルで、電子メールの送受信を可能にするアプリケーションです。
すべてのサーバーは、Smtp.serveraddress.com のようなアドレスを持っていて、送信メールを処理します。SMTPメールプロバイダサービスは数多くありますが、今回はSendPulseサーバーを使用しました。サーバーアドレスはsmtp-pulse.comです。
参考文献
- [1]EXM disadvantage:
https://www.nishtechinc.com/Blog/2018/April/Send-E-mail-Action-to-Sitecore-9-Forms - [2]Sitecore Documentation:
https://doc.sitecore.com/en/developers/93/
- ※執筆協力(敬称略):NTT Data Global Delivery Services Pvt. Ltd. (Pune), Swarali Shah & Arpit Katiyar
- ※文章中の商品名、会社名、団体名は、各社の商標または登録商標です。