Мы используем стороннее программное обеспечение для массовой рассылки электронных писем. Программное обеспечение не позволяет добавлять адреса электронной почты в скрытую копию. Однако в соответствии с Правилами соответствия нам необходимо добавлять адрес 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 +.
Вам придется переписать свой "фильтр" как Раковина транспортного события. Это похоже, так что это не займет много времени.