如何在发送带有特定关键字的电子邮件时 运行 一个 .exe

How to run an .exe when email with certain keywords is sent out

有2台机器:
-笔记本电脑
-服务器(包含 运行s 测试的 .exe 文件)

目标场景:笔记本电脑发送一封包含关键字 "RUNTESTING" 的电子邮件。这会触发服务器 运行 .exe 文件,等待测试完成,然后将结果通过电子邮件发送回相同的电子邮件地址。

这可能吗?我正在寻找可以访问该特定人员的 outlook 和 "read" 电子邮件的东西。

我已经设置了 Jenkins,但这对电子邮件扫描没有帮助。

您可以像访问 Outlook 一样访问邮箱,而不需要直接访问 Outlook。

大多数语言都有可用的 POP3 和 IMAP 库。可以使用 Linux 上的 cron 或 Windows 上的 Windows 任务计划程序将您的程序安排为每十分钟一次(或必要时更频繁)一次 运行。当 运行 时,它会解析它没有看到的新邮件,当 "RUNTESTING" 在主题或正文中看到时,执行操作。

可能有商业产品可用于在电子邮件条件下自动执行任务,但是,编写您描述的内容应该不是一个特别大的项目。如果您喜欢 C# 语言,我会首先研究并尝试使用 IMAP 库。

我没有任何使用 jenkins 的经验,但您可以使用名为 MailKit 的库通过 C# 完成此操作。更具体地说,您可以在每 5 分钟左右迭代一次的定时循环中包含在邮件主题中搜索您的关键字的代码。

您还必须删除匹配的消息或使用某种日志来避免重复匹配。

您也可以使用此代码启动 .exe 并等待其完成,然后再发送结果(您可以使用 MailKit 执行此操作):

Process.Start(); 
Process.WaitForExit();

像这样:

using System.Diagnostics; 
using System.Net.Mail;
using MailKit;
using MailKit.Search;
using MailKit.Net.Imap;

void test()
    {
        const int period = 1000 * 60 * 5; //5 minutes
        do
        {
            using (var client = new ImapClient())
            {
                client.Connect(serverAddress, 993, true);
                client.Authenticate(username, password);
                var inbox = client.Inbox;
                inbox.Open(FolderAccess.ReadOnly);
                SearchQuery query = SearchQuery.SubjectContains("RUNTESTING");
                foreach (var uid in inbox.Search(query))
                {
                    var process = Process.Start("testing.exe");
                    process.WaitForExit();
                    using (var client = new SmtpClient())
                    {
                        var message = new MimeMessage();
                        message.Subject = "Testing complete";
                        client.Connect(serverAddress, port, false);
                        client.AuthenticationMechanisms.Remove("XOAUTH2");
                        client.Authenticate(username, password);
                        client.Send(message);
                        client.Disconnect(true);
                    }
                }
                client.Disconnect(true);
            }
            System.Threading.Thread.Sleep(period);
        } while (true);
    }