English (United States) Magyar (Magyarország)
You are hereBlogs
Register   |  Login
  
  
  
aug. 7

Written by: SUF
2009. 08. 07. 12:08 

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

Tags:
 Comments

In order to add comments, you must register on the site. Simply select the Register link in the top right portion of the screen and enter your contact information. Once you are logged-in, you will be able to add comments.

Already registered? Click here to login to the site. 

 

 Keresés