...e-mail parsert írni.
A Microsoft berkein belül azok között, akiknek a feladata E-Mail parsert írni, van olyan, aki tud ilyet (aki pl. a CDO parserét írta) és van olyan, aki nem (aki a SharePoint parserét követte el).
Miért mondom ezt?
A következők történtek:
Az elmúlt hetekben újra összeraktam kis cégünk intranet portálját WSS 3.0SP2 alapon. Ellentétben a múlttal, most alaposan végigmentem a dolgokon és tisztességgel beállítottam az E-Mail küldést/fogadást.
Minden szépen működik is, egy dolgot kivéve.
Van nekünk egy hírlevél küldő alkalmazásunk (egy Java-ban írt borzalom, OpenEMM a neve). Arra gondoltam, hogy a SharePointban létrehozok egy vitafórum típusú izét és ide fogom archiválni a leveleket. A régi leveleket továbbítottam is ide (Outlookból) rendben meg is érkeztek. A hírlevél küldőn pedig felírtam a vitafórum címét a címzettek listájára. Az éles hírlevél küldésnél meg is érkezett a levél. Mindjárt háromszor.
Először azt hittem, hogy ez valami tranziens dolog, de többször kipróbálva arra jutottam, hogy minden esetben ez történik. Ha az Outlookból meg a levél akkor jó, ha az OpenEMM-ből akkor nem.
Elkezdtem nyomozni. Kiderült, hogy a dolognak van kísérőjelensége is. Egy Event Log bejegyzés:
Event Type: Warning
Event Source: Windows SharePoint Services 3
Event Category: E-Mail
Event ID: 6873
Date: 2009. 08. 07.
Time: 12:25:14
User: N/A
Computer: BAGIRA
Description:
An error occurred while processing the incoming e-mail file
C:\Inetpub\mailroot\Drop\3bc4101d01ca174900000034.eml.
The error was: Exception from HRESULT: 0x81070403.
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Elkezdtem keresgélni a neten. Az exception kódot beírva zéró, nulla, nyente mennyiségű választ találtam. Remek. Bedobtam a magyar sharepoint fórumra, a válaszok száma pontosan ugyanennyi.
Kezdtem kétségbe esni, hogy akkor most mi van, elvégre a SharePointhoz teljesen hülye vagyok.
Majd tegnap este eszembe jutott, hogy hiszen nincs semmi gáz. Az SMTP motor ugyanaz az IIS SMTP szolgáltatás, amit kívül-belül elég jól ismerek. Nincs más teendőm, mint kideríteni, hogy mit nem eszik meg a bejövő levélből a SharePoint és kijavítani azt egy Event Sinkben.
Először is felraktam a jól bevált SaveMail sink-emet és elkezdtem leveleket küldözgetni. Állítgattam mindent az OpenEMM-en, de nem tudtam elérni egy olyan állapotot, amikor jó lett volna.
Keresztpróbaként fogtam egy a SaveMail-el lementett levelet, adtam neki egy X-Receiver mezőt a SharePoint fórum címével és bedobtam a Pickup könyvtárba. Láss csodát, a SharePoint hiba nélkül megette.
Hopp, itt valamit csúnyán elnéztem. Biztos valami sorvég hiba lehet, amit a notepad magától javít.
Nézzük meg mi történik, ha a Drop könyvtárból ellopok egy bejövő levelet és abba belereszelek a notepad-el. Az így javított levél vissza a Pickup-ba, megint rossz. 
Így viszont van két levelem. Az egyik a Drop-ból származik és rossz. A másik a SaveMail könyvtárából származik és jó. Semmi gond. Hasonlítsuk össze őket. Sok különbség nem lehet, hiszen ugyanannak a bejövő OpenEMM-es levélnek a két lementéséről van szó.
Hexa editor előkap, két levél kinyit, döbbent pofáraesés. Ezek forrás szinten nem is hasonlítanak egymásra.
Ez meg hogy lehet?
Gondolkoz, gondolkoz:
Mit csinál az SMTP szolgáltatás? Bejön a levél, fogja a protokoll DATA parancsa és a . közötti részt, megfejeli az X-Sender és az X-Receiver mezőkkel, majd lerakja a Drop könyvtárba.
Mit csinál a SaveMail? bejön a levél, odaadja a protokoll DATA parancs és a . közötti részt a CDO-nak. A CDO feldolgozza. Kér a CDO-tól egy datastream-et (ez nem az eredeti stream lesz, hanem egy, a CDO mezőkből újra felépített valami), és lementi egy fájlba.
Tehát a jó levelek átmentek a CDO teljes feldolgozásán. Akár hibás a levél, akár nem, a CDO tud vele valamit kezdeni, ami meg kijön belőle az már szabványos.
Na már csak egy olyan Sink kell ami tud mit kezdeni ezzel az információval. Megírtam. RENDKÍVÜL BONYOLULT (CDOFilt.js):
function ISMTPOnArrival::OnArrival(Msg, EventStatus)
{
Msg.DataSource.Save();
EventStatus = 0;
}
Azt hiszem ezek után joggal állítható, amit a cikk elején írtam. Csak azt nem értem, hogy a Microsoftnál a különböző csapatok időnként miért nem használják fel egymás kódjait.