Dynamics CR m4.0 のメール送信機能を使用してメールを作成する機会があったおんで、サンプルの覚書を掲載します。

動作確認は、 Windows Ser ver 2008 上に構築した 英語版のynamics CRM 4.0 UR 11 オールインワン環境で行っています。メールの送信はEメールルータを使用する設定で動作の確認をしています。

メール送信の設定により実際にいつメールが送信されるは変わります。プログラムの動作確認は Email Router を使用するパターンで行っています。Outlookを使用する場合は、メールの送信ユーザがOutlookを起動したときに送信されると思います。

1. メール送信プロジェクトの作成

Visual Studio 2008 でソリューションを作成し、 EmailActivity というコンソールプロジェクトを作成します。

ソースプログラムは次の通りです。ドラフトの状態で作成したEメールをSendMailメソッドで送信しています。実際の送信が同期的に行われているわけではありません。プログラムのCreateTo2メソッドを確認するとわかりますが、任意のメールアドレスや取引先企業やユーザなどのメール属性に存在しないメールアドレスへもactivityparty.addressused  を使用することで送信できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk;

namespace EmailActivity
{
    class Program
    {
        /// <summary>
        /// メールコードを作成して送信するサンプルです。
        /// 送信はメールの送信設定によってどのタイミング
        /// で実際に送信されるかが変わります。
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // CrmService の作成
            CrmService service = CreateService("testorg");
            // メールの作成
            Guid emailid = CreateEmail(service);
            // メールの送信
            SendEmail(service, emailid);
        }
        /// <summary>
        /// ステータスがドラフトのメールレコードを作成する
        /// </summary>
        /// <param name="service"></param>
        /// <returns></returns>
        private static Guid CreateEmail(CrmService service)
        {
            email email = new email();
            email.subject = "Mail Test";
            email.description = "Main body text.. <a href='http://www.bing.com/'>bing</a>";
            email.from = new activityparty[] { CreateFrom(service) };
            email.to = new activityparty[] { CreateTo1(service), CreateTo2(service) };
            TargetCreateEmail target = new TargetCreateEmail();
            target.Email = email;
           
            CreateRequest request = new CreateRequest();
            request.Target = target;
            CreateResponse response = service.Execute(request) as CreateResponse;
            return response.id;
        }
        /// <summary>
        /// ドラフトのメールレコードを送信する。
        /// 送信自体は非同期に行われる。
        /// </summary>
        /// <param name="service"></param>
        /// <param name="email"></param>
        private static void SendEmail(CrmService service, Guid emailid)
        {
            SendEmailRequest request = new SendEmailRequest();
            request.EmailId = emailid;
            request.TrackingToken = "";
            // false にすると送信したという履歴のみが設定される。
            request.IssueSend = true;
            service.Execute(request);
        }
        private static activityparty CreateFrom(CrmService service)
        {
            WhoAmIRequest request = new WhoAmIRequest();
            WhoAmIResponse response =  service.Execute(request) as WhoAmIResponse;
            activityparty activity = new activityparty();
            Lookup lookup = new Lookup(EntityName.systemuser.ToString(), response.UserId);
            activity.partyid = lookup;

            return activity;
        }
        /// <summary>
        /// Dynamics CRM のエンティティのレコードをあて先とする場合
        /// </summary>
        /// <param name="service"></param>
        /// <returns></returns>
        private static activityparty CreateTo1(CrmService service)
        {
            WhoAmIRequest request = new WhoAmIRequest();
            WhoAmIResponse response = service.Execute(request) as WhoAmIResponse;
            activityparty activity = new activityparty();
            Lookup lookup = new Lookup(EntityName.systemuser.ToString(), response.UserId);
            activity.partyid = lookup;

            return activity;
        }
        /// <summary>
        /// 任意のメールアドレスをあて先とする場合
        /// </summary>
        /// <param name="service"></param>
        /// <returns></returns>
        private static activityparty CreateTo2(CrmService service)
        {
            activityparty activity = new activityparty();
            // システムユーザや取引先企業などの既定で使用されるメールアドレスを
            // 変更する場合もaddressusedを使用する。
            // パーティーリストで指定可能なエンティティのうち、どの属性がメールアドレスとして
            // 使用されるかは次のリンク参照
            // http://technet.microsoft.com/en-us/library/cc151451.aspx
            activity.addressused = "sample@live.jp";
            return activity;
        }

        /// <summary>  
        /// On-Premise 接続  
        /// </summary>  
        /// <returns></returns>  
        private static CrmService CreateService(string orgname)
        {
            CrmService service = new CrmService();
            service.CrmAuthenticationTokenValue = new CrmAuthenticationToken();
            service.CrmAuthenticationTokenValue.AuthenticationType = 0;
            service.CrmAuthenticationTokenValue.OrganizationName = orgname;
            service.UseDefaultCredentials = true;
            service.Url = "http://localhost/MSCRMServices/2007/CrmService.asmx";

            return service;
        }
    }
}

説明は以上です。誤り、指摘点などありましたらご連絡ください。