Windows 2008 R2 中的 SMTP 事件接收器

Windows 2008 R2 中的 SMTP 事件接收器

我们使用第三方软件发送批量电子邮件。该软件不提供在密件抄送中添加电子邮件地址的选项。但是,根据合规规则,我们必须为发送的每封电子邮件添加密件抄送地址。到目前为止,我们习惯于将该软件中的所有电子邮件转发到安装了 SMTP 服务的中间服务器。我们在该服务器上部署了一个 VB6 DLL,它充当 SMTP 事件接收器,每次触发 SMTP 服务的“OnArrival”事件时它都会运行。DLL 将密件抄送地址添加到邮件中。到目前为止,一切都运行良好。现在,我们必须将这些服务器升级到 Windows Server 2008 R2。我已经用 C# 重写了 VB6 事件接收器。代码如下:

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();
    }
  }

}

上述代码生成的 DLL 使用 RegAsm.exe 注册,并且成功注册。使用 Microsoft 提供的 VBScript 将 DLL 与 SMTP“OnArrival”事件绑定,并且也没有出现任何问题。但是,DLL 根本不起作用。我尝试记录每个步骤,但 DLL 似乎根本不起作用。它在 Windows XP 机器上运行良好。我们不想使用 Microsoft Exchange Server,因为它对我们来说太过分了。请帮忙。

答案1

微软的一些设计师想出了一个好主意:即使 SMTP 服务在 IIS7+ 中不再使用“事件接收器”,注册例程也应该返回成功指示。

你必须将“过滤器”重写为传输事件接收器。类似,所以应该不会花太长时间。

相关内容