Уведомлять клиента С#, когда SMTP-сервер получает новый адрес электронной почты
Я хочу получить все письма в моем приложении ASP.NET с определенным получателем CC. Чтобы использовать это для будущих писем, я не хотел все время опросить их. Но я не могу найти способ, как я могу использовать push, чтобы мгновенно получать электронные письма. Являются ли их какими-либо фреймворками на С#, чтобы помочь мне в этом?
Я хочу подключиться к моему приложению на почтовый сервер и зарегистрировать метод "X". Всегда, когда на почтовый сервер поступает новое сообщение, мое приложение должно быть уведомлено, а мое приложение должно выполнить метод "X".
Я надеюсь, что это возможно с кодом вроде этого:
void Application_Start()
{
...
ConnectWithTheSmtpServer();
RegisterMethodForNotification(DoSomethink);
...
}
void DoSomethink(Mail newMail)
{
// Do Somethink with the mail
}
EDIT:
Я сделал это с 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...
}
Ответы
Ответ 1
Вы приближаетесь к этому с неправильного угла.
SMTP не поддерживает получение почты (не считая почты PUSH). POP3 - это то, что вы можете использовать для получения почты, но у нее нет поддержки PUSH (так что вам придется тянуть за почту).
Расширение IMAP4 IDLE - это то, что больше всего называют почтой PUSH, поэтому вам нужно будет найти библиотеку для С#, которая поддерживает IMAP4 IDLE, Я нашел некоторую информацию, которая заставит вас идти в правильном направлении (нет причины дублировать его здесь):
Имейте в виду, выбирая решение, необходимое для поддержки IDLE.
Мне очень нравится внешний вид MailSystem.Net, поскольку он соответствует вашим требованиям.
Помните, что ваш почтовый сервер также должен иметь IMAP4 и IMAP4 IDLE. Некоторые почтовые серверы не поддерживают его, поэтому вам может быть не повезло (и вам придется использовать POP3 pulling).
Ответ 2
Вы можете отправить копию своих писем (например, используя файл /etc/aliases в PostFix) в ПОЧТОВЫЙ СЕРВЕР, ВЫ МОЖЕТЕ ОБРАТИТЬСЯ. После этого вы можете реализовать ПОЧТОВЫЙ ПРОЦЕССОР, который сделает все, что захочет, в любое время, когда придет письмо, в которое входят ПОСЛЕДОВАТЕЛЬНЫЕ УСЛОВИЯ.
Надеюсь, что это поможет,
Ответ 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",
"[email protected]", "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);
}
}
}
}