Exchange 2007 programozás – Transport Agent / SMS

Cégünknél most állítom át a felhasználókat Exchange 2007-re. Ez azt jelenti, hogy az elmúlt jónéhány évben (az Exchange 2000 óta) megírt különböző kiegészítő programocskát, sinket, stb. újra kell gondolnom az Exchange 2007-es környezetre. Ezek a kiegészítők négy csoportba sorolhatók:
1. Programok/Sinkek amire már nincs szükség, mert az Exchange 2003 valamilyen hibáját javították, ami a 2007-ben már nem fordul elő
2. Programok, amik olyan API-kat hsználtak amelyek az Exchange 2007-ben megmaradtak. Ezekkel nem volt sok dolgom, minimális módosítással átvihetőek voltak
3. SMTP Sinkek, amiket az Exchange 2007 Transport Rule-ja kiváltanak. Ilyen a Disclaimer, vagy a spam üzenetek tárgyát módosító cucc.
4. SMTP Sinkek, amiket az Exchange 2007 Transport Rule-jai nem váltanak ki. Na itt gond van. Az új SMTP motor már nem rendelkezik a régi script API-val, vagy akár a régi Sink-ekkel.
A 4. pontban jelölt dolgokat újra kell írnom Transport Agent-ként.
Nézzük az aktuális feladatot:
Bizonyos kollégák SMS üzenetet szeretnének kapni a beérkező üzeneteikről, de a spamekről nem.
<flame>
Szerettem volna megértetni velük, hogy van olyan, hogy ActiveSync, meg Push Mail, meg ez a hőn imádott Nokia Communicator-on (E90) működik is, de nem, nem és nem. Ezt nem vagyunk hajlandók használni. Szerelmesek vagyunk az SMS-be.
Ezen túl jött az iPhone őrület (parasztvakítás). Ja, hogy az iPhone kompatibilis az Exchange-el. Le van írva. Hát persze, pont annyira mint egy 6-8 éves Nokia 6310i. Tud pop3-at meg imap-ot (na jó, lehet, hogy a 6310i nem tudott imapot). ActiveSync? Push Mail? A holdban (lehet, hogy egyszer majd megcsinálják. Aha, lehet, hogy egyszer majd veszek egy iPhone-t). Tudom, hogy Steve Job-ot istenítők most egy kanál vízben fojtanának meg. Nekem is tetszik az iPhone, gyönyörű a kijelzője, jó a kezelőfelülete, de hiányzik néhány dolog belőle, ami nekem elengedhetetlen, továbbá nem különösebben szoktam szeretni azt a hozzáállást, hogy ha hiányzik valami technológia a termékből akkor azt marketinggel pótoljuk.
</flame>
Az SMS küldéshez nem akartam GSM adaptert, vagy valamilyen internetes szolgáltatást felhasználni. Mindenkinek, akinek szüksége van erre a szolgáltatásra van egy olyan e-mail címe amire, ha levelet küldök akkor a tárgymező tartalma megjelenik sms-ként. Mondhatnánk, hogy mi sem egyszerűbb. Átirányítjuk a az illető levelezését erre a címre és már kész is vagyunk.
Eleinte én is csak ezt csináltam. Működik is. Részben. Sajnos az adott sms-es postafiók nem csak sms küldésre szolgál, hanem egy valódi postafiók, ami be tud telni és van az üzenetek méretére beállított korlátja, tehát hajlamos mindenféle csúnya NDR-eket visszadobni az eredeti feladónak, amiből persze jön a pattogás, hogy nem működik a céges levelezésünk, pedig csak egy T-Mobile-os postafiók telt be.
A problémára azt a megoldást találtam ki, hogy az sms-es fiókra menő üzeneteket kiherélem. Kidobom belőle a csatolmányokat és az üzenet szövegét, így nem telik be a postafiók (ehhez még tartozik egy szolgáltatásom, ami naponta törli az sms-es postafiók tartalmát, de erről most nem lesz szó). Ezt kb. három éve meg is írtam az Exchange 2003-hoz, azóta kiválóan működik. Most viszont Exchange 2007 és Transport Agent.
Valamikor 2007 januárjában már írtam egy Transport Agent-et ami a disztribúciós listák reply-to címeit kezeli, de a végén lustaságból ezt nem publikáltam. Azt gondoltam, hogy elővéve ezt a kódot villámgyorsan meg tudom írni az SMS-es agentemet.
26.-án szombaton neki is álltam a dolognak. Nem töltöttem vele sok időt, a hétvégén összesen egy-két órám volt a feladatra, de kész is lettem vele.
Az agent nagy vonalakban a következőt csinálja:
Az OnSubmittedMessage event handlerben megkeresi a levelekben azokat a címzetteket, amelyek felé ki kell gyomlálni a levelet (ezt az egyik ExtendedAttribute értékben tudjuk megadni a Management Console-ban). Ha talál ilyet akkor készít egy levélmásolatot csak ezzel a címzettel (Message Fork). Erre azért van szükség, mert lehet, hogy a levélnek több címzettje van, és nem törölhetjük minden címzett felé a levél tartalmát, csak annak akinek ezt beállítottuk.
Az OnRoutedMessage event handlerben újra megkeresi azokat a leveleket, amelyeknek a címzettje sms cím és kiírtja belőle a csatolásokat, valamint a levéltörzset.
Hétfőn délelőtt nekiálltam tesztelni, találtam még egy két hibát, de estére láthatóan működött az egész a teszt környezetemben:
Készítettem egy új felhasználót, küldtem neki levelet, szépen kigyomlálta a levelet. Hátradőltem, örültem.
Tegnap nekiálltam, hogy bevezessem az éles rendszerben. Miután még mindig nem voltam biztos az egészben, kipróbáltam magamon. Regisztráltam az agentet Készítettem egy teszt felhasználót, beállítottam a megfelelő attribútumot, ráirányítottam a levelezésem, vártam ….
.
.
.
és pofára estem. Nem működött az egész. Confused
El kezdtem agyalni, hogy mi baja lehet. Rájöttem, hogy ha direktben küldök levelet az sms-es címre, akkor jó, ha átirányítva akkor nem. Miért?
A dolog abból adódik, ahogy az Exchange az átirányítást kezeli. Az átirányított cím ugyanúgy kerül a levél címzettjei közé, mint ahogy egy disztribúciós lista kifejtődik. A Hub Transport az OnSubmittedMessage handler és az OnRoutedMessage handler között valahol hozzárakja a levélhez az átirányított címzettet.
Ha ennek az információnak a birtokában megnézzük a fent leírt működést, akkor világossá válik, hogy miért nem működik a dolog:
Az OnSubmittedMessage event nem fogja látni a levél címzettjei között az sms címet, így nem fogja elkészíteni a levélmásolatot. Az OnRoutedMessage event pedig csak a levél legelső címzettjét nézi meg, ami viszont az eredeti címzett, aki nem sms cím, így nem gyomlálja ki a levelet.
Ezeket végiggondolva nekikezdtem, egy teljesen más koncepció megvalósításának. Azt tudom, hogy a Fork-al létrehozott új üzenet nem látható abban az event handlerben ahol létrehoztam, így mindenképp az OnSubmittedMessage handlerben kell a Fork-ot megcsinálni. Ebben az esetben viszont a címzettek között még nem szerepel az sms cím. Mi van akkor, ha az sms címet írom be az ExtendedAttribute-ba és nem foglalkozom ezzel az egész átirányítósdival?
Nekikezdtem.
Bele is tört a bicskám. Biztos, hogy a nem létező, vagy jócskán megkopott csharp tudásom az oka, de egyenlőre nem találtam megoldást a következő problémára:
Létre kellene hoznom az sms-es e-mail címből egy EnvelopeRecipient objektumot. Az EnvelopeRecipient egy abstract osztály, így egy származtatott osztályt kellene használnom, amit nem találtam, így nekiálltam magam megcsinálni. Abba futottam bele, hogy miután a base abstract osztálynak nincs constructora így a a származtatott osztályban sem tudtam constructort gyártani.
Miközben ezt a constructor ügyet próbáltam megoldani megakadt a szemem az sp1-ben bevezetett OnResolvedMessage event handleren.
Ez számomra azt jelenti, hogy van egy event handlerem ahol, már megtalálható az összes recipient kifejtve és még van utána egy event handlerem (OnRoutedMessage) ahol az itt Fork-kal gyártott levél külön elérhető.
Tehát, vissza az agent első változatához, OnSubmittedMessage handler lecserél OnResolvedMessage handlerre, lefordít, kipróbál, működik, örül. Open-mouthed
A forráskód letölthető innen:
[Update 2008/10/09: A fenti link rossz helyre mutatott. Javítottam.]
A solution Visual Studio 2008-hoz készült. A fordításhoz a lib64 könyvtárba be kell rakni az Exchange 2007 SP1 x64-es lemezről a microsoft.exchange.data.common.dll és a microsoft.exchange.data.transport.dll fájlokat.
Információ a telepítésről egyenlőre itt:
Még nem írtam Exchange 2007-es Transport Agent telepítési útmutatót magyarul (de fogok Wink).
Az agent működéséhez szükségünk van még a dll nevével megegyező ini file elhelyezésére a dll-el azonos könyvtárban. Az ini valahogy így néz ki:
[Config]
EnableAttribute=1
SclLevel=6
 
Az EnableAttribute azt határozza meg, hogy az objektum melyik ExtensionAttribute paraméterébe kell beírnunk egy yes-t 1-es, true-t, hogy a neki szóló leveleket az agent kigyomlálja. Az SclLevel pedig azt az SCL szintet határozza meg, ami felett az agent eldobja az sms értesítőket.
 
Kategória: Exchange | Közvetlen link a könyvjelzőhöz.

12 hozzászólás a(z) Exchange 2007 programozás – Transport Agent / SMS bejegyzéshez

  1. Unknown szerint:

    Az iPhone az Outlook/iTunes segítségével valóban szinkronizálja a kontaktokat és a naptárt is, de csak dróton keresztül, amikor rádugod a gépre. Úgyhogy akinek fontos a folyamatos Exchange-szinkron, annak valóban nemigen ajánlható az iPhone.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s