Назад | Перейти на главную страницу

Приемники событий SMTP в Windows 2008 R2

Мы используем стороннее программное обеспечение для массовой рассылки электронных писем. Программное обеспечение не позволяет добавлять адреса электронной почты в скрытую копию. Однако в соответствии с Правилами соответствия нам необходимо добавлять адрес BCC к каждому отправляемому электронному письму. До сих пор мы использовали для ретрансляции всех писем от этого программного обеспечения на промежуточный сервер с установленной службой SMTP. Мы развернули DLL VB6 на этом сервере, который функционировал как приемник событий SMTP, и он запускался каждый раз, когда запускалось событие «OnArrival» службы SMTP. DLL добавила в письмо адрес BCC. До сих пор все шло нормально. Теперь нам нужно обновить эти серверы до Windows Server 2008 R2. Я переписал приемник событий VB6 на C #. Код такой:

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:john.doe@xyz.com;";
        msg.EnvelopeFields["http://schemas.microsoft.com/cdo/smtpenvelope/recipientlist"].Value = recipientList;        
        msg.EnvelopeFields.Update();
        msg.DataSource.Save();
    }
  }

}

DLL, сгенерированная приведенным выше кодом, была зарегистрирована с помощью RegAsm.exe и успешно зарегистрирована. DLL была связана с событием SMTP «OnArrival» с помощью VBScript, предоставленного Microsoft, и это тоже произошло без каких-либо проблем. Однако DLL вообще не работает. Я пробовал регистрировать каждый шаг, но мне кажется, что DLL вообще не работает. Он отлично работает на машине с Windows XP. Мы не заинтересованы в использовании Microsoft Exchange Server, так как это для нас излишне. Пожалуйста помоги.

Некоторым разработчикам в MS пришла в голову блестящая идея, что процедуры регистрации должны возвращать, указывая на успех, даже если служба SMTP больше не использует «приемники событий» в IIS7 +.

Вам придется переписать свой "фильтр" как Раковина транспортного события. Это похоже, так что это не займет много времени.