You are here:   Blogs
  

...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.

 Megjegyzés

Ahhoz, hogy megjegyzést tégy a bejegyzésekhez, regisztrálnod szükséges. Egyszerűen válaszd ki a regisztráció linket a jobb felső sarokban és add meg a szükséges információkat. Ha bejelentkeztél, fűzhetsz megjegyzést a bejegyzésekhet. 

Már regisztráltál? Kattints ide a bejelentkezéshez. 

 

 Keresés