Coletores de eventos SMTP no Windows 2008 R2

2

Usamos um software de terceiros para enviar e-mails em massa. O software não fornece opções para adicionar endereços de email no BCC. No entanto, conforme as Regras de Conformidade, é necessário adicionarmos um endereço BCC a cada E-mail enviado. Até agora, nós costumávamos retransmitir todos os e-mails desse software para um servidor intermediário com o serviço SMTP instalado nele. Nós implantamos uma DLL VB6 nesse servidor que funcionava como um coletor de eventos SMTP e ele era executado toda vez que o evento "OnArrival" do serviço SMTP era disparado. A DLL adicionou o endereço BCC ao email. Tudo estava correndo bem até agora. Agora, temos que atualizar esses servidores para o Windows Server 2008 R2. Eu reescrevi o Coletor de Eventos VB6 em C #. O código é assim:

using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using ADODB;
using CDO;
using SEOLib;

namespace OnArrivalSink
{
 [Guid("8E9B5A44-ADC3-4752-9CF6-C5333A6B17CF")]
 public class CatchAll : ISMTPOnArrival, IEventIsCacheable
 {
    void IEventIsCacheable.IsCacheable()
    {
        //This will return S_OK by default
    }

    void ISMTPOnArrival.OnArrival(Message msg, ref CdoEventStatus eventStatus)
    {
        try
        {
            ProcessMessage(msg);
        }
        catch (Exception e)
        {
            string errorInfo = "ERROR MESSAGE: " + e.Message + "\n" +
                "INNER EXCEPTION: " + e.InnerException + "\n" +
                "SOURCE: " + e.Source + "\n" +
                "STACK TRACE: " + e.StackTrace + "\n";

            //Write to Event Log
            EventLog evtLog = new EventLog();
            evtLog.Source = "OnArrivalSink";
            evtLog.WriteEntry(errorInfo, EventLogEntryType.Error);
        }
        eventStatus = CdoEventStatus.cdoRunNextSink;
    }

    private void ProcessMessage(IMessage msg)
    {
        //Get the list of recipients that the message will be actually delivered to
        string recipientList = msg.EnvelopeFields["http://schemas.microsoft.com/cdo/smtpenvelope/recipientlist"].Value.ToString();

        //Add a recipient in BCC form
        recipientList = recipientList + "SMTP:[email protected];";
        msg.EnvelopeFields["http://schemas.microsoft.com/cdo/smtpenvelope/recipientlist"].Value = recipientList;        
        msg.EnvelopeFields.Update();
        msg.DataSource.Save();
    }
  }

}

A DLL gerada pelo código acima foi registrada usando RegAsm.exe e foi registrada com sucesso. A DLL foi vinculada ao evento "OnArrival" do SMTP usando um VBScript fornecido pela Microsoft e isso também aconteceu sem problemas. No entanto, a DLL não está funcionando em todos os. Eu tentei registrar cada etapa, mas é como se a DLL não está funcionando em tudo. Funciona bem em uma máquina com Windows XP. Nós não estamos interessados em usar o Microsoft Exchange Server, pois é um exagero para nós. Por favor ajude.

    
por user171655 29.04.2013 / 15:11

1 resposta

0

Alguns criadores da MS tiveram a brilhante ideia de que as rotinas de registro devem retornar indicando sucesso, mesmo que o serviço SMTP não use mais 'Event Sinks' no IIS7 +.

Terá de reescrever o seu "filtro" como um Transport Coletor de Eventos . É semelhante, por isso não deve demorar muito.

    
por 29.04.2013 / 15:41