in Eski Blog Yazılarım

.Net ile MS Exchange 2007’yi Programlayın

.Net kullanarak Ms Exchange 2007’ye entegre çalışan modüller yazabilirsiniz. Bunu yapabilmeniz için microsoft size iki adet .Net Assembly’si veriyor.

(Bu dosyaları C:Program FilesMicrosoftExchange ServerPublic dizininde bulabilirsiniz.)

Exchange 2007 üzerinde kullanabileceğiniz .Net Assembly’lerini aşağıdaki adresten görebilirsiniz.

* http://msdn.microsoft.com/en-us/library/aa580926(EXCHG.80).aspx

.Net projenize bu Referansları ekledikten sonra artık kendi Transport Rollerinizi yazabilirsiniz. Ben gelen giden e-posyaları loglayan bir modül örnek vereceğim.

Öncelikle .Net 2.0 ile yeni bir Class Library projesi oluşturun.

Daha sonra yukarıdaki referansları ekleyin.

Gerekli altyapıyı sağladıktan sonra işin zevkli kısmına geçiyoruz.

SmtpReceiveAgentFactory sınıfını kullanarak yeni bir class türetiyoruz ve SmtpReceiveAgent sınıfını override ederek içine kendi yazacağımız class’ı koyuyoruz.

	
       public class TicketHandlerFactory : SmtpReceiveAgentFactory
	{
		public override SmtpReceiveAgent CreateAgent(SmtpServer server)
		{
			return new GelenMail();
		}
	}

SmtpReceiveAgent classın’dan da kendi sınıfımız olan GelenMail sınıfını türetiyoruz böylece Exchange’in SMTP olaylarını gelen ve giden mailleri (OnEndOfData, OnMailCommand) yakalayabileceğiz.

	public class GelenMail : SmtpReceiveAgent
	{
	...
	}

Class yapısını anladıktan sonra basit bir uygulama yapalım.
Uygulama Exchange’e gelen mailin kime geldiğini, kimden geldiğini ve konusunun ne olduğunu log dosyasına yazan ve saklayan bir Trasnport Role olsun.


namespace Microsoft.Exchange.MailIzle
{
	using System;
	using System.IO;
	using System.Diagnostics;
	using System.Reflection;
	using System.Collections.Generic;
	using System.Text;

	using Microsoft.Exchange.Data.Transport;
	using Microsoft.Exchange.Data.Transport.Email;
	using Microsoft.Exchange.Data.Transport.Smtp;

	public class EpostaAjani : SmtpReceiveAgentFactory
	{
		public override SmtpReceiveAgent CreateAgent(SmtpServer server)
		{
			return new GelenMail();
		}
	}

	public class GelenMail : SmtpReceiveAgent
	{
		private AgentAsyncContext agentAsyncContext;

		public GelenMail()
		{
			this.OnEndOfData += new EndOfDataEventHandler(GelenMail_OnEndOfData);
		}

		void GelenMail_OnEndOfData(ReceiveMessageEventSource source, EndOfDataEventArgs e)
		{
			this.agentAsyncContext = this.GetAgentAsyncContext();
			string logDir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"Log";
			string logFile = logDir + @"Log.txt";

			try
			{
				if (!Directory.Exists(logDir))
				{
				Directory.CreateDirectory(logDir);
				}

				if (!File.Exists(logFile))
				{
				File.CreateText(logFile).Close();
				}

				using (StreamWriter logWriter = File.AppendText(logFile))
				{
					MailItem GelenMail = e.MailItem;

					logWriter.Write(e.MailItem.FromAddress.ToString());
					logWriter.Write(Environment.NewLine);
					logWriter.Write(KimeGelmis(GelenMail.Message.To));
					logWriter.Write(Environment.NewLine);
					logWriter.Write(e.MailItem.Message.Subject);
					logWriter.Write(Environment.NewLine);

					logWriter.Flush();
				}
			}
			catch (Exception ex)
			{
				Debug.Write(ex.Message);
			}

		this.agentAsyncContext.Complete();
		this.agentAsyncContext = null;
	}

		private string KimeGelmis(EmailRecipientCollection Alicilar)
		{
			StringBuilder Adresler = new StringBuilder();
			foreach (EmailRecipient Alici in Alicilar)
			{
				Adresler.Append(Alici.NativeAddress);
				Adresler.Append(";");
			}

			return Adresler.ToString();
		}
	}

}

* Bu kodlar Exchange 2007 SP1 ile gelen Assembly’lere göre yazılmıştır. Exchange için SP1 kurulu olmayan sunucularda kodlar farklılık gösterebilir.

Oluşturduğumuz sınıfı derleyip bir Assembly (.dll) haline getirdikten sonra Exchange 2007 üzerine kaydedebiliriz.

Öncelikle C:Program FilesMicrosoftExchange ServerTransportRolesagents dizini altında bir klasor oluşturun ben GelenMailler dedim.
Daha sonra oluşturduğunuz dll’i bu klasörün içine atın.
Şimdi sıra geldi Exchange’e hazırladığımız dll’i tanıtmaya.

Bunun için Exchange’in yönetimsel apisi diyebileceğimiz PowerShell’i kullanacağız.
.NET ortamında hazırladığınız dll’i sisteminize kaydetmek için aşağıdaki PowerShell scriptini kullanabilirsiniz.

yukle.ps1

	$EXDIR="C:Program FilesMicrosoftExchange Server"
	Net Stop MSExchangeTransport

	Write-Output "Servis Kaydediliyor..."
	Install-TransportAgent -Name "Mail Yakalayicisi" -AssemblyPath 
$EXDIRTransportRolesAgentsGelenMaillerMailIzle.dll -TransportAgentFactory Microsoft.Exchange.MailIzle.EpostaAjani

	Write-Output "Servis Aktiflestiriliyor"
	Enable-TransportAgent -Identity "Mail Yakalayicisi"
	Get-Transportagent -Identity "Mail Yakalayicisi"

	Net Start MSExchangeTransport

	Write-Output "Sistemler Devrede..."

Script sorunsuz bir şekilde çalıştıktan sonra GelenMailler klasörü altındaki log klasörünün içindeki log dosyasına yazmaya başlayacakır. Daha fazla özellik için Exchange 2007 SDK‘sını incelemenizi şiddetle öneririm.

Kaynaklar:

* http://msdn.microsoft.com/en-us/exchange/default.aspx

* http://www.msexchangeteam.com/

* http://blogs.orcsweb.com/jeff/archive/2007/04/04/ms-exchange-2007-transport-agents.aspx

* http://msdn.microsoft.com/en-us/library/aa579074(EXCHG.80).aspx

Yorum Bırak

Comment