【问题标题】:Notify C# Client, when SMTP Server receive a new Email通知 C# 客户端,当 SMTP 服务器收到新电子邮件时
【发布时间】:2011-11-13 13:44:10
【问题描述】:

我想在我的 ASP.NET 应用程序中获取所有具有特定 CC 收件人的电子邮件。为了将它用于未来的电子邮件,我不想一直轮询来获取它们。但我找不到方法,如何使用推送来立即获取电子邮件。他们有 C# 中的任何框架来帮助我吗?

我想将我的应用程序连接到邮件服务器并注册一个方法“X”。总是当有新消息到达邮件服务器时,我的应用程序必须得到通知并且我的应用程序应该执行方法'X'。

我希望这样的代码可以实现:

void Application_Start() 
{
    ...
    ConnectWithTheSmtpServer();
    RegisterMethodForNotification(DoSomethink);
    ...
}
void DoSomethink(Mail newMail)
{
    // Do Somethink with the mail
}

编辑:

我用MailSystem.Net 做到了。它工作得很好,也很容易实现。

示例代码:

void Application_Start() 
{
    var worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(StartIdleProcess);

    if (worker.IsBusy)
        worker.CancelAsync();

    worker.RunWorkerAsync();
}

private void StartIdleProcess(object sender, DoWorkEventArgs e)
{
    if (_imap != null && _imap.IsConnected)
    {
        _imap.StopIdle();
        _imap.Disconnect();
    }

        _imap = new Imap4Client();
        _imap.ConnectSsl(server-name, 993);
        _imap.Login(username, passwort);

        var inbox = _imap.SelectMailbox("INBOX");

        _imap.NewMessageReceived += new NewMessageReceivedEventHandler(NewMessageReceived);

        inbox.Subscribe();

        _imap.StartIdle();
    }

    public static void NewMessageReceived(object source, NewMessageReceivedEventArgs e)
    {
        // Do something with the source...
    }

【问题讨论】:

  • 如果你想要服务器推送功能(实时推送,推送通知)并且你想自己托管,那么你应该看看: * WebSync * XSockets * Pokin 如果你不想安装和管理您自己的实时基础架构,那么您可以查看我为之工作的Pusher。您可以使用我们的.NET library 并简单地调用我们的 REST API,然后将电子邮件/通知推送到任何监听客户端。也值得看看我的 [re
  • 如何在 Web 解决方案中实现?

标签: c# .net email push


【解决方案1】:

你从错误的角度接近这个。

SMTP 不支持接收邮件(更不用说 PUSH 邮件)。 POP3 可用于检索邮件,但它也不支持 PUSH(因此您必须拉取邮件)。

IMAP4 IDLE 扩展名最常被称为 PUSH 邮件 - 因此您需要找到支持 IMAP4 IDLE 的 C# 库。我发现了一些信息可以让你朝着正确的方向前进(没有理由在这里重复):

在选择支持 IDLE 所需的解决方案时请记住。 我真的很喜欢MailSystem.Net 的外观,因为它满足您的要求。

请记住,您的邮件服务器还需要启用 IMAP4 和 IMAP4 IDLE。一些邮件服务器不支持它,所以你可能不走运(并且必须使用 POP3 拉取)。

【讨论】:

    【解决方案2】:

    您可以将您的电子邮件副本(即使用 PostFix 中的 /etc/aliases 文件)发送到您可以处理的邮件服务器。在那里,您可以实现一个 MAIL PROCESSOR,它可以在满足某些条件的邮件到达时执行任何您想要的操作。

    希望对你有帮助,

    【讨论】:

    • 你能解释一下你的邮件处理器是什么意思吗?我该如何实现它?
    • 以 Procmail 为例。
    【解决方案3】:

    你可以试试这个:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using EAGetMail; //add EAGetMail namespace
    
    namespace receiveemail
    {
       class Program
       {
           static void Main(string[] args)
           {
                // Create a folder named "inbox" under current directory
                // to save the email retrie enter code here ved.
                string curpath = Directory.GetCurrentDirectory();
                string mailbox = String.Format("{0}\\inbox", curpath);
    
                // If the folder is not existed, create it.
                if (!Directory.Exists(mailbox))
                {
                    Directory.CreateDirectory(mailbox);
                }
    
                // Gmail IMAP4 server is "imap.gmail.com"
                MailServer oServer = new MailServer("imap.gmail.com",
                    "gmailid@gmail.com", "yourpassword", ServerProtocol.Imap4 );
                MailClient oClient = new MailClient("TryIt");
    
                // Set SSL connection,
                oServer.SSLConnection = true;
    
                // Set 993 IMAP4 port
                oServer.Port = 993;
    
                try
                {
                    oClient.Connect(oServer);
                    MailInfo[] infos = oClient.GetMailInfos();
    
                    for (int i = 0; i < infos.Length; i++)
                    {
                        MailInfo info = infos[i];
                        Console.WriteLine("Index: {0}; Size: {1}; UIDL: {2}",
                            info.Index, info.Size, info.UIDL);
    
                        // Download email from GMail IMAP4 server
                        Mail oMail = oClient.GetMail(info);
    
                        Console.WriteLine("From: {0}", oMail.From.ToString());
                        Console.WriteLine("Subject: {0}\r\n", oMail.Subject);
    
                        // Generate an email file name based on date time.
                        System.DateTime d = System.DateTime.Now;
                        System.Globalization.CultureInfo cur = new
                            System.Globalization.CultureInfo("en-US");
                        string sdate = d.ToString("yyyyMMddHHmmss", cur);
                        string fileName = String.Format("{0}\\{1}{2}{3}.eml",
                            mailbox, sdate, d.Millisecond.ToString("d3"), i);
    
                        // Save email to local disk
                        oMail.SaveAs(fileName, true);
    
                        // Mark email as deleted in GMail account.
                        oClient.Delete(info);
                    }
    
                    // Quit and purge emails marked as deleted from Gmail IMAP4 server.
                    oClient.Quit();
                }
                catch (Exception ep)
                {
                    Console.WriteLine(ep.Message);
                }
            }
        }
    }
    

    【讨论】:

    • 你应该为你的解决方案添加一个解释。
    • 代码中有注释,说明每一行代码的作用...
    • EAGetMail 是付费软件
    猜你喜欢
    • 2016-10-07
    • 2013-07-09
    • 2014-02-11
    • 2014-07-16
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2011-01-21
    相关资源
    最近更新 更多