SMTP Sink – A hiányzó láncszem

Egy kicsit szomorú vagyok. Alapvetően azért, mert az itt leírtakra ma jöttem rá és nem két évvel ezelőtt. Ez ma, hogy az Exchange 2007 megjelent és egy egész más SMTP eseménykezelést használ mint elődjei, már nem tűnik időszerűnek.
Miről is van szó?
Az Exchange 2000-ben és 2003-ban ha az SMTP-n a rendszerből kimenő üzenetekkel akarunk valamit tenni (olyan levelekről beszélek amiket Outlookból, vagy OWA-ból adtunk fel) akkor szükségünk van egy második SMTP Virtual Serverre, mert a script-ben elkövetett SMTP Event Sink nem hajtódik végre az ilyen üzeneteken.
Ezt mint tényt nagyon régen tudom. Írtam is róla itt: http://www.gomori.hu/smtp_event_sink_hu.htm
Sosem értettem ennek a jelenségnek az okát, mert az ok amit különböző források említenek és a saját tapasztalataim ellentétben állnak egymással.
 
A hivatalos ok:
A MAPI-val küldött leveleket nem tudjuk megváltoztatni az SMTP OnArrival (OnTransportSubmission) Sinken mert az ilyen levelek eredeti MailMsg objektumát az SMTP átkonvertálja CDO.Message objektumra (amit a script-ben megírt Sink kezelni képes) majd amikor a Sink végrehajtása befejeződött, ezt eldobja és az eredeti MailMsg objektummal dolgozik tovább.
 
A saját tapasztalatom:
A fenti leveleken egyáltalán nem hajtja végre a Sinket.
 
Mi támasztja alá a saját tapasztalatomat?
Írtam egy nagyon egyszerű Sink-et: http://www.gomori.hu/savemail_hu.htm. Ez a Sink összesen annyit tesz, hogy az áthaladó levelet lementi. Ha igaz amit hivatalosan mondanak akkor az én Sink-emnek végre kell hajtódnia a MAPI kimenő leveleken is, hiszen nem módosítok semmit és nem érdekel, hogy az általam megkapott CDO.Message objektumot később eldobja a rendszer, mert ekkorra már lementettem a levelet. Ebből ugye az következik, hogy ha a MAPI-s levelet lementi a Sink-em akkor a hivatalos ok igaz, ha nem menti le akkor nekem van igazam.
Kipróbáltam.
Nem menti le.
 
Tehát nekem van igazam.
 
ROSSZ!!!
 
Nincs igazam. A hivatalos indoklás igaz, csak épp egy apróság kimaradt.
Nézzük meg, hogy mi is hiányzik! Tegnap rámjött, hogy a fenti Sink-et megírom csharp-ban. Ehhez újra elolvastam ezt:
Ebben megakadt a szemem egy mondaton:
"If a rule is placed on a transport event, it will only fire if the message entered the system via the SMTP protocol or the SMTP service "Pickup" directory. Messages submitted from Microsoft Outlook® clients via Exchange 2000 will not cause an event to fire if there is any rule on the event."
Hoppá. Lehet, hogy a savemail Sink-em azért nem hajtódik végre, mert a regisztrációnál használtam egy MAIL FROM=* rule-t?
Akkor játszunk kicsit ezzel a Rule-al!
 
A fenti sink regisztrációja valahogy így néz ki:
cscript smtpreg.vbs /add 1 OnArrival SaveMail CDO.SS_SMTPOnArrivalSink "MAIL FROM=*"      
cscript smtpreg.vbs /setprop 1 OnArrival SaveMail Sink ScriptName "c:\Scripts\savemail.js"
 
Erről tudjuk, hogy nem hajtódik végre a MAPI-s levelekre. Ez a regisztráció, ha megnézzük:
cscript smtpreg.vbs /enum
 
Így fog kinézni:
    Binding {656FB2C4-CD70-4040-BD1D-7EC7F7810FDC} {
      DisplayName = SaveMail                        
      SinkClass = CDO.SS_SMTPOnArrivalSink          
      Status = Enabled                              
      SourceProperties {                            
        Priority = 28010                            
        Rule = mail from=*                          
      }                                             
      SinkProperties {                              
        ScriptName = c:\Scripts\savemail.js         
      }                                             
 
Akkor próbáljuk meg Rule nélkül:
cscript smtpreg.vbs /add 1 OnArrival SaveMail CDO.SS_SMTPOnArrivalSink                    
cscript smtpreg.vbs /setprop 1 OnArrival SaveMail Sink ScriptName "c:\Scripts\savemail.js"
 
Erre hibát kapunk. Akkor nézzük meg üres Rule-al:
cscript smtpreg.vbs /add 1 OnArrival SaveMail CDO.SS_SMTPOnArrivalSink ""                 
cscript smtpreg.vbs /setprop 1 OnArrival SaveMail Sink ScriptName "c:\Scripts\savemail.js"
 
Ezt kipróbálva szintén nem fog működni, ugyanakkor megnézve, hogy mi került a rendszerbe ezt fogjuk látni:
    Binding {656FB2C4-CD70-4040-BD1D-7EC7F7810FDC} {
      DisplayName = SaveMail                        
      SinkClass = CDO.SS_SMTPOnArrivalSink          
      Status = Enabled                              
      SourceProperties {                            
        Priority = 28010                            
        Rule =                                       
      }                                             
      SinkProperties {                              
        ScriptName = c:\Scripts\savemail.js         
      }                                             
 
Ebben láthatjuk ugyanakkor, hogy a Rule szerepel de üres. Valahogy ki kellene szednünk onnan. Erre két lehetőségünk kínálkozik. Az egyik, hogy írunk egy saját regisztrációs script-et, a másik, hogy módosítjuk az smtpreg.vbs-t. Én ez utóbbit választottam.
Egy nagyon pici módosításra van szükségünk. Mindösszesen a RegisterSink szubrutinban ezt a sort:
Binding.SourceProperties.Add "Rule", szRule
ki kell cserélnünk erre:
If szRule <> "" Then                           
    Binding.SourceProperties.Add "Rule", szRule
End If                                          
Ezek után az előbbi regisztráció eredménye így fog kinézni:
    Binding {656FB2C4-CD70-4040-BD1D-7EC7F7810FDC} {
      DisplayName = SaveMail                        
      SinkClass = CDO.SS_SMTPOnArrivalSink          
      Status = Enabled                              
      SourceProperties {                            
        Priority = 28010                             
      }                                             
      SinkProperties {                              
        ScriptName = c:\Scripts\savemail.js         
      }                                             
 
És láss csodát, máris működik a Sink-ünk.
Ez számomra előrevetíti, hogy képes leszek olyan Sink-et írni ami képes a kimenő üzenetekkel is dolgozni, két SMTP Virtual Server létrehozása (és az azzal járó macerák nélkül).
 
Kategória: Exchange | Közvetlen link a könyvjelzőhöz.

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