将传入的电子邮件通过管道传输到 Windows IIS SMTP 上的脚本?

Posted

技术标签:

【中文标题】将传入的电子邮件通过管道传输到 Windows IIS SMTP 上的脚本?【英文标题】:Pipe incoming email to a script on Windows IIS SMTP? 【发布时间】:2009-05-29 14:44:04 【问题描述】:

我有一个在 Windows IIS 上运行的 Web 应用程序。这个应用程序有一个数据库,其中每个项目都有一个唯一的键(1、2、3...)和一个电子邮件地址列表(除其他外)。

我希望用户使用标识项目的电子邮件地址向服务器发送电子邮件,然后让服务器将消息中继到该项目的电子邮件地址。例如,如果用户向以下地址发送电子邮件:

item-75@myserver.example.com

然后服务器将接收电子邮件并将其通过管道传输到脚本。该脚本将在数据库中查询第 75 项以获取电子邮件地址列表,然后重新发送电子邮件。

我可以在 unix 系统上使用 sendmail 轻松完成此操作,但我不知道是否可以在 Windows 系统上完成类似的设置(或者是否需要额外的软件)。

【问题讨论】:

【参考方案1】:

(这听起来像是你想实现像 craigslist 这样的功能)。

IIS SMTP 服务可以发送邮件,也可以接受邮件。

这就是你想要做的。

将您的 IIS SMTP 服务配置为接受域的电子邮件(您可以在域下的 IIS SMTP 服务的属性中进行配置)。说出域名“myserver.example.com”

然后,在您的 DNS 服务器中,配置指向“myserver.example.com”的 MX 记录。

现在,当电子邮件发送到您的 IIS SMTP 服务器时,它实际上会被放置在您的 mailroot/drop 文件夹中(您也可以在 IIS SMTP 服务属性中更改此文件夹)。

现在您正在接受电子邮件,下一步是编写一个脚本:

1)解析邮件。

2) 相应地修改它们(您只是想更改“to”地址吗?)。

3)如果你想重新发送邮件,那么你需要相应地修改它们。 您将需要添加一个 X-Sender 标头,用于标识发送电子邮件的电子邮件地址,以及一个 X-Receiver 标头,用于每个将接受电子邮件的收件人。以下是修改后的示例电子邮件:

X-Sender: me@mywebsite.com
X-Receiver: recip1@theirdomain.com
X-Receiver: recip2@theirdomain.com
From: "jim bob" <jim@example.com>
To: <item-75@myserver.example.com>
Subject: test
MIME-Version: 1.0
Content-Type: text/plain;
Message-ID: <024f01c9e130$b3eca500$0401a8c0@local>


test

一旦你有了这个修改过的内容,你就会想把它写到 mailroot/pickup 目录中的一个文件中。请务必使用唯一的名称。

IIS SMTP 服务将过来,提取电子邮件,并将其转发,使用 X-Sender 作为 MAIL FROM 地址发送电子邮件,并将其发送到每个 X-Receiver 标头中列出的每个电子邮件地址。

4)将此脚本作为计划任务运行。另一种选择是将其构建为 Windows 服务,或实现类似文件系统观察器的功能,每次将电子邮件创建为文件时都会在其中执行。

5)所有这一切的另一个选择是实际实现一个 SMTP 事件接收器,但我认为这对于你想要做的事情来说太过分了,并且可能会带来更多的麻烦,而不是它所解决的问题。如果我喜欢痛苦,我只会走事件接收器路线。

希望我没有把它弄得像泥巴一样清晰。

【讨论】:

也不清楚:S,我更喜欢下面的接收器选项,因为它直接在服务器接收时处理电子邮件,我假设涉及交换服务器。 我不知道如何做第一步。我发布了一个关于它的问题here。或许你能帮忙?【参考方案2】:

事件汇一点都不难!事实上,大约有十几个用 VBS 编写的示例(在使用 WSH 的 Win 服务器上运行)完全可以完成您希望做的事情。 OnArrival 事件接收器使用您希望没有任何安全风险的任何计算机用户帐户实时运行,因为消息是异步的并且不会报告。

这实际上是一件非常容易做的事情 - 最简单的事情之一。一旦设置,它也永远不会中断。在一台服务器上,我已经运行了 9 年多,每天处理几千条传入消息!我已经设置了大约十几个这样的东西——如果它需要你几个小时以上,你就大错特错了。如果在 UNIX 上比这更容易,我的祖母可能是一名 UNIX 程序员,所以我不会吹嘘这在 UNIX 服务器上更容易。

http://msdn.microsoft.com/en-us/library/ms528023.aspx

http://support.microsoft.com/kb/894286

http://msdn.microsoft.com/en-us/library/ms526206.aspx

http://msdn.microsoft.com/en-us/library/ms526620.aspx

【讨论】:

谢谢尼克 - 如果您有任何链接或其他指针将不胜感激。 我认为这是最好的选择,因为它是在到达时直接处理的!你也知道我在哪里可以找到一个工作示例,我还有一个 old 服务器。我找不到任何关于如何加载/运行 SINK 以便它注册的信息。【参考方案3】:

您可以使用定时脚本通过 POP3 或 IMAP 阅读电子邮件。我也是一个 UNIXer,所以我很难理解这样的事情是如何如此困难的,但是你有它。这是我认为你应该做的。

用您喜欢的任何语言编写脚本。只要它可以从 POP3 或 IMAP 读取。

让 Windows 每 5 分钟运行一次脚本

让脚本访问邮箱并操作它需要的任何电子邮件。

我个人的偏好是安装 Python,但如果你是有限的......我不知道。 ASPNET 还不错,但我以前从未将它用于编写脏脚本。

【讨论】:

谢谢 - 这是我正在研究的一个选项。但是,我还需要知道是否可以按需创建多个地址,例如“item-1”、“item-2”。例如,是否可以将所有收到的电子邮件放入一个文件中? 这似乎是一个非常不可靠的解决方案,更不用说慢了!

以上是关于将传入的电子邮件通过管道传输到 Windows IIS SMTP 上的脚本?的主要内容,如果未能解决你的问题,请参考以下文章

通过管道将电子邮件发送到 python 脚本

Windows CLI:将列表通过管道传输到 awk 并用外部文件中的文本替换文本并写入 output.txt

在 Vim 中将缓冲区管道传输到外部命令

在 Bash 脚本中通过管道传入/传出剪贴板

使用管道将文件 i/o 传输到另一个进程

将 ffmpeg 输出通过管道传输到命名管道