Уведомить клиента C #, когда SMTP-сервер получит новое письмо - PullRequest
18 голосов
/ 09 сентября 2011

Я хочу получить все электронные письма в моем приложении ASP.NET, в которых есть определенный CC-получатель.Чтобы использовать это для будущих электронных писем, я не хотел все время опрашивать, чтобы получить их.Но я не могу найти способ, как я могу использовать push, чтобы мгновенно получать электронные письма.Помогают ли мне в этом какие-то фреймворки в 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...
    }

Ответы [ 3 ]

16 голосов
/ 09 сентября 2011

Вы подходите к этому с неправильной точки зрения.

SMTP не поддерживает получение почты (не говоря уже о PUSH почте).POP3 - это то, что вы можете использовать для получения почты, но он также не поддерживает PUSH (так что вам придется тянуть за почту).

Расширение IMAP4 IDLE - это то, что больше всего нужнов PUSH почту - так что вам нужно будет найти библиотеку для C #, которая поддерживает IMAP4 IDLE.Я нашел некоторую информацию, которая поможет вам двигаться в правильном направлении (нет причин дублировать ее здесь):

Помните, выбирая решение, которое должно поддерживать IDLE.Мне действительно нравится внешний вид MailSystem.Net , поскольку он отвечает вашим требованиям.

Помните, что на вашем почтовом сервере также должны быть включены IMAP4 и IMAP4 IDLE.Некоторые почтовые серверы не поддерживают его, поэтому вам может не повезти (и вам придется использовать POP3).

0 голосов
/ 06 января 2017

Вы можете попробовать это:

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);
            }
        }
    }
}
0 голосов
/ 09 сентября 2011

Вы можете отправить копию своих электронных писем (например, используя файл / etc / aliases в PostFix) на почтовый сервер, который вы можете обработать.Оказавшись там, вы можете внедрить ПОЧТОВЫЙ ПРОЦЕССОР, который делает все, что вы хотите, в любое время, когда приходит почта, удовлетворяющая определенным условиям.

Надеюсь, это поможет,

...