Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Windows 10
  • Prikupljanje pošte iz različitih poštanskih sandučića na jednom Gmail računu. Postavite sakupljač pošte na Gmailu, upute korak po korak

Prikupljanje pošte iz različitih poštanskih sandučića na jednom Gmail računu. Postavite sakupljač pošte na Gmailu, upute korak po korak

Danas je to možda najpopularnija poštanska usluga. A mi smo, razmatrajući ovaj ili onaj resurs, slučajno odredili da se svaki poštanski sandučić može spojiti na drugu poštansku adresu iz druge usluge.

Uostalom, nije uvijek zgodno otići u svaki poštanski sandučić i provjeriti poštu. Stoga je, radi praktičnosti, stvorena mogućnost dodavanja poštanskog sandučića na postojeću adresu. Tada će se sva pošta prikupljati na jednom mjestu, u jednom poštanskom sandučiću. Danas ćemo samo naučiti kako organizirati prikupljanje pošte iz drugih kutija.

Počnimo s Mail.ru

Kako dodati poštanski sandučić u Mail ru

Usluga pošte ru mail pruža mogućnost dodavanja poštanskog sandučića treće strane u vaš glavni.

Da biste dodali još jedan poštanski sandučić, idite na svoj glavni mail ru mail račun i kliknite na svoju adresu u gornjem desnom kutu

I kliknite na gumb da dodate poštanski sandučić».

Nakon unosa podataka pritisnite " Ući».

Kao rezultat naših radnji, pojavila se mapa s našim imenom i prezimenom, a tamo će biti isporučena pisma iz Yandex pošte. I više nećete morati ići u poštanski sandučić iz Yandexa da biste provjerili novu poštu.

Sada ćemo učiniti nešto slično u Yandex pošti.

Kako dodati poštanski sandučić u Yandex?

Da bismo dodali poštanski sandučić s druge usluge pošte u sustav Yandex, također idemo na naš račun pošte Yandex

I kliknite na ikonu zupčanika i odaberite " Prikupljanje pošte iz drugih poštanskih sandučića».

Idite na "Postavke" Prikupljanje pošte". Sada ćemo dodati okvir s mail ru. Upisujemo naš e-mail pretinac, lozinku za njega i kliknemo " Omogući kolektor»

U sljedećem koraku možete dodati oznaku e-porukama iz Mail-a. Sva pisma iz e-pošte ići će u mapu Inbox. Stare e-poruke treba označiti kao pročitane. Zatim ponovo unesite lozinku i kliknite " Spremi promjene».

To je to, povezali smo dodatni poštanski sandučić s Yandex poštom. Ako u budućnosti više ne želite primati pisma iz povezanog pretinca, možete ga isključiti u bilo kojem trenutku.

Na isti se način mogu dodati i druge kutije.

Za prebacivanje između glavnog i dodanog okvira koristite glavni izbornik, a zatim odaberite okvir koji vam je potreban.

Kako dodati poštanski sandučić na Gmail?

Mail from Google također vam omogućuje povezivanje dodatnih 5 poštanskih sandučića.

I odaberite stavku ""

Idi na karticu " Računi i uvoz"i kliknite na link" Dodajte račun e-pošte»

U novom prozoru unesite adresu okvira koji ćemo dodati. kliknite " Dalje».

Zatim, zauzvrat, navedite lozinku za poštanski sandučić koji se dodaje, a zatim promijenite POP poslužitelj u pop3.pošta. en. Označite okvir koji kontrolira hoće li se kopije primljenih e-poruka spremati na poslužitelj. Ovo će biti vaše osiguranje u slučaju da se nešto dogodi vašem Google računu, vaša će pisma biti spremljena na mail ru poslužitelju. Za praktičnost prepoznavanja u koji poštanski sandučić je pismo stiglo, dodajte oznaku svim dolaznim pismima s mail ru

Nakon toga pritisnite " Dodaj račun».

Na sljedećoj stranici ništa ne mijenjamo, osim što možete postaviti svoje Korisničko ime. Unesite lozinku za poštanski sandučić i kliknite " Dodaj račun».

Nakon toga, e-mail s kodom za potvrdu bit će poslan u vaš dodani poštanski sandučić. Možete potvrditi na dva načina: slijedite vezu u pismu ili kopirajte kod iz pisma i zalijepite ga u polje. Pritisnite " Potvrdite».

Sada su se postavke promijenile. Kao što možete vidjeti dolje na snimci zaslona, ​​pojavila se naša poštanska adresa dodatka, koja se može promijeniti ili izbrisati.

Također možete postaviti zadani okvir s mail ru za slanje pisama klikom na odgovarajuću vezu.

A sada su pisma iz mail ru boxa uspješno stigla u kutiju od Googlea. Kao što vidite, sva slova su označena oznakom koju smo postavili u procesu dodavanja poštanskog sandučića.

A kada kreirate novo pismo, možete odabrati iz kojeg poštanskog sandučića želite poslati pismo.

Također, za prikupljanje pisama na jednom mjestu možete koristiti posebne programe - klijente pošte. Najpopularniji je " Šišmiš". Ali ovaj program se plaća. Među slobodnim Mozilla Thunderbird. O čemu, pročitajte na našoj web stranici.

Napišite u komentarima koristite li klijente e-pošte ili sakupljač pisama, kao što smo danas opisali.

I da završim s ovim. Sretno i uspjeh svima vama!

Moramo nastojati da nas ne razumiju svi, već da ne budemo pogrešno shvaćeni.

Zadnji put sam pokrenuo seriju članaka o prikupljanju pošte iz nekoliko različitih poštanskih sandučića, čak i kreiranih na različitim servisima, u jedan glavni poštanski sandučić, kojim korisnik stalno kontrolira i lakše mu je raditi sam s njim nego pregledavati svu svoju e-poštu kutije odvojeno. Pročitajte više o potrebi prikupljanja pošte i njezinoj implementaciji na usluzi GMail.

Planiram ovu seriju članaka za 3 članka do sada. Danas ću vam reći o postavljanju prikupljanja pošte u jednako poznatoj poštanskoj usluzi - Yandex.

Prikupljanje pošte s drugih računa u Yandexu postavlja se jednako jednostavno kao i u drugim uslugama.

Proces postavljanja prikupljanja pošte u Yandexu.

Da biste aktivirali mogućnost prikupljanja sve pošte u poštanskom sandučiću Yandexa s bilo kojeg od svojih računa na istim ili drugim poštanskim uslugama, prije svega se prijavite na svoj Yandex račun, koji će biti glavni. U njemu ćete skupljati poštu iz drugih kutija.

Otvorite odjeljak postavki pošte i odaberite "Prikupi poštu iz drugih poštanskih sandučića".

Možete prikupljati poštu iz bilo kojeg poštanskog sandučića koji se nalazi na bilo kojoj poštanskoj usluzi, a ne samo iz svoje pošte koja se nalazi na istoj usluzi Yandex!

Primjer za ovaj članak će pokazati proces prikupljanja pisama s Mail.ru pošte.

Unesite punu adresu e-pošte s koje ćete prikupljati pisma i lozinku s nje, a zatim kliknite "Omogući sakupljač".

Ako ste unijeli ispravnu prijavu i lozinku s e-pošte, tada ćete u sljedećem prozoru vidjeti poruku o uspješnoj vezi i ovdje možete napraviti neke postavke za prikupljanje pisama. Na primjer, možete dodijeliti oznaku prikupljenim porukama, kao i prikazati stare proslijeđene poruke kao pročitane. Provjerite opcije koje su vam potrebne, zatim ponovno unesite lozinku iz svoje druge e-pošte na dnu i kliknite "Spremi promjene". Pošta će se početi prikupljati za 10 minuta.

U ovom prozoru postavki nećete moći odabrati zasebnu mapu za prikupljanje pisama iz povezanog poštanskog sandučića. U početku će biti navedena mapa Inbox i neće se mijenjati. To je zbog činjenice da se u početku pošta prikuplja pomoću IMAP protokola i ovaj protokol kopira cjelokupnu strukturu mapa iz pošte koju ste povezali.

Ako postoje 2 opcije za prisilno razvrstavanje prikupljene pošte u mape:

    Promijenite postavke prikupljanja pošte i stavite POP3 protokol umjesto IMAP (koji je inicijalno postavljen);

    Postavite filtriranje e-pošte kasnije, tj. stvorite uvjet pod kojim će primljena pošta ići u mapu koja vam je potrebna, zaobilazeći Inbox.

Druga je opcija, mislim, poželjnija, posebno za početnike, kako ne bi petljali po postavkama veze s drugom poštom.

Sada će sva pisma koja stignu na poštu koju ste povezali pretočiti u trenutnu, koja je vaša glavna. I tada nema potrebe ići zasebno na drugu poštu da provjerite ima li u njoj novih slova.

Kako zasebno pogledati sva pisma prikupljena iz povezane pošte?

Nakon što dodate poštu, vidjet ćete oznaku s njenim imenom na lijevoj strani ispod mapa pošte. Primjer:

Klikom na ovu oznaku vidjet ćete zasebno sva pisma iz povezanog poštanskog sandučića.

Kako promijeniti postavke ili onemogućiti prikupljanje pošte iz određenog poštanskog sandučića?

Ako trebate bilo što promijeniti u postavkama za prikupljanje pošte iz dodanog poštanskog sandučića, to možete učiniti tamo u postavkama pošte Yandexa, kroz odjeljak "Prikupljanje pošte iz drugih poštanskih sandučića".

Ako trebate onemogućiti ili ponovno omogućiti prikupljanje pošte iz određene spojene kutije, pritisnite prekidač "Uključeno". / Isključeno na popisu povezanih poštanskih sandučića.

Ako trebate otvoriti postavke prikupljanja pošte, kliknite na naziv poštanskog sandučića, a zatim kliknite na poveznicu "Postavke" koja se pojavi. Kao rezultat toga, otvorit će se isti prozor postavki kao pri povezivanju pošte ().

Zaključak.

Zaključno, želim napomenuti da obično nema problema s prikupljanjem e-pošte u usluzi Yandex i ništa ne treba konfigurirati u drugoj pošti (koju povezujete). Ali postoji vrlo hirovita usluga koja se zove GMail :) Kada je povežete (i ne samo s Yandexom, već čak i sa sobom), često nastaju problemi i to zbog povećane sigurnosti ove Google pošte. Ne, ne raspravljam, sigurnost je dobra! Ali ponekad dosegne razinu ludila, na primjer, kada Gmail blokira vezu s vlastitim drugim GMail boxom, a oba su prijavljeni s istog računala i istog IP-a :)) Govorit ću o sličnim problemima s povezivanjem Google mail-a u zasebnom članku.

U ovom članku ćemo govoriti o tome što je "pošta iz drugih kutija" i "prikupljanje pisama s drugih računa". Pregledi i usporedbe usluga e-pošte.

Kako se funkcionalnost mail servisa ažurira, vijesti ćemo objaviti na kraju ovog članka.

Usluga pošte Mail.ru, tražilice Yandex i Google već nekoliko godina nude vrlo korisnu i potrebnu funkcionalnost koja vam omogućuje kombiniranje svih ostalih računa e-pošte u jednoj pošti. Drugim riječima, vrijedi dodati i konfigurirati sve svoje "mailove" jednom, a postat će moguće upravljati njima u jednom prozoru bez stalnog unosa prijave i lozinke.

Usluge pošte nude nam veliko mjesto za pohranu svih dolaznih pisama, korisničko sučelje, dobru funkcionalnost upravljanja i još mnogo toga. Za provjeru mogućnosti navedenih mail servisa izdvojit ćemo tri parametra za ocjenjivanje njihovog rada: 1) potrebno je upravljati različitim e-mail računima, uključujući i one s raznih servisa i stranica, putem jednog mail klijenta; 2) imati osobni potpis i ime za svaku poštu; 3) izbrisati poruke s poslužitelja onih računa pošte koji su dodani u poštu, yandex ili google mail.

Naš zadatak izgleda ovako:

Pa počnimo. Prvi smo koji je testirao uslugu Mail.ru, koja nam kaže: „Možete prikupiti poštu iz svih svojih poštanskih sandučića u jedan poštanski sandučić na Mail.ru.

Postavite prikupljanje e-pošte s bilo kojeg poslužitelja koji koristi IMAP ili POP3 protokol. Da biste dodali vanjsku poštu osim @mail, @inbox, @list, @bk, morate imati barem jednu poštu koja već postoji na navedenim poslužiteljima iz pošte. Drugim riječima, prvo registrirajte e-poštu, a zatim dodajte druge račune e-pošte. Proces registracije za mail je jednostavan, nema smisla ga opisivati, ali ćemo opisati dodavanje drugih e-mailova na ovaj mail račun.

Zatim će od vas biti zatraženo da unesete prijavu i lozinku za bilo koji poštanski sandučić koji koristite, a u roku od 3-5 minuta, "Sakupljač pošte iz pošte" stvorit će mapu s nazivom dodane pošte pored "pretinca" , "poslano", "spam" i ostalo.

Zapravo, sakupljač pošte će raditi u roku od 10-15 minuta i dodati će sva slova u novostvorenu mapu iz okvira koji ste naveli. Sva pristigla pisma za novu e-poštu bit će poslana u ovu mapu, a također će biti moguće slati pisma iz priloženog pretinca. Prilikom izrade novog pisma pojavit će se polje "Od" u kojem možete odabrati iz kojeg poštanskog sandučića će pismo biti poslano.

Prednosti Mail.ru usluge pošte uključuju jednostavnost dodavanja i jednostavnost postavljanja drugih poštanskih sandučića, nema potrebe za specificiranjem raznih protokola (POP3, SMTP). To je vrlo važno jer ne zna svaki korisnik što je to.

Nedostaci Mail.ru su to što je nemoguće dodijeliti ime i potpis za svaku novododanu poštu (bilo koju novu e-poštu osim glavne), odnosno, ime i potpis glavne pošte će se distribuirati na svaka adresa i to je to. Još jedan veliki nedostatak je to što prilikom učitavanja e-pošte na poštu ne postoji način da se izvorne e-poruke automatski izbrišu s priloženog poslužitelja poštanskog sandučića. Zašto je toliko važno brisati poruke s poslužitelja dodanog poštanskog sandučića? Time ćete izbjeći popunjavanje priložene pošte, jer. Vanjski računi e-pošte obično su premali za pohranjivanje e-pošte. Na primjer, ako je prostor za poštu na vanjskom računu pun, Mail.ru neće prikazati nove poruke sve dok ne uđete u vanjsko sučelje pošte i izravno izbrišete poruke odatle kako biste oslobodili prostor. Osim toga, vezujemo poštu za Mail u nadi da ćemo dobiti puno prostora za pohranu naše pošte, što može biti ograničeno resursima za hosting. Dakle, unatoč činjenici da Mail.ru nudi gotovo neograničenu veličinu poštanskog sandučića, prilikom dodavanja pošte iz druge domenske zone (npr. [e-mail zaštićen]), vaši dodani resursi e-pošte neće se povećati na Mail.ru, ali će i dalje biti ograničeni resursima hostinga (u našem slučaju resursi primer.ru).

Mogućnost dodavanja druge pošte servisu Mail nije zadovoljila naš zadatak u dva od tri boda, ukupno je osvojio jedan bod.

Istina, Mail.ru ima još jedan način za dodavanje vanjske pošte, točnije, povezivanje ili prijavu na vanjsku poštu. izgleda ovako:

Ova metoda nije prikladna za naš zadatak, jer ovo nije sakupljač pošte, već korisnički način koji se povezuje s poštom i svaki put učitava sve mape i pisma u sučelje pošte. Ali ovdje je moguće dodati osobni potpis i ime za svaku poštu, moguće je slati pisma iz konfigurirane pošte. Brisanje e-pošte iz preuzetih poštanskih sandučića ne funkcionira. nije skupljač pošte.

Važno! Neki korisnici pogrešno misle da ako se slova prikazuju u pošti, onda se poruka s koje je došlo do preuzimanja može obrisati. Još jednom obratimo pažnju da Mail.ru radi kao preglednik pošte, a ako izbrišete poštu, ona će se izbrisati i u glavnom poštanskom sandučiću i u pošti.

Drugi subjekt Yandex sa svojim sakupljačem pisama. Zadaci su slični: prikupiti poštu, dodijeliti potpis i ime svakoj pošti i izbrisati svu poštu iz dodanog poštanskog sandučića.

Yandexov sakupljač pošte konfiguriran je na sličan način, ali ako je pošta povezana s nekog web-mjesta, na primjer site.ru, tada će trebati navesti dodatne postavke, pogledajte snimku zaslona.

Za nas je to odradila usluga Mail, dok Yandex nudi ručno postavljanje svih postavki iz pošte treće strane. Ovdje nema ništa komplicirano: u polje za prijavu unesite puno ime e-pošte ( [e-mail zaštićen]), u polje poslužitelja unesite samo domenu (site.ru), bolje je ostaviti sve ostale postavke prema zadanim postavkama ili ih promijeniti ako znate što radite. Nakon uspješnog dodavanja pošte pojavit će se natpis:

Za razliku od sakupljača pošte, Yandex nudi odabir hoće li originalna pisma spremiti u dodani poštanski sandučić ili ne. U svim ostalim aspektima, Yandexov sakupljač pisama radi na sličan način s Mail.ru, moguće je odabrati poštanski sandučić iz kojeg ćete poslati pismo. Ali Yandex ima isti problem s potpisivanjem pisama: ne postoji način za postavljanje pojedinačnog imena i potpisa za svaki dodani poštanski sandučić.

Sudeći po navigaciji, moguće je dodati pojedinačni potpis za svaki poštanski sandučić, ali u stvarnosti to ne funkcionira. Odabiremo mail, propisujemo ime i potpis, kliknemo spremi. To je to, potpis je spremljen i radi, ali se sprema i za sve ostale poštanske sandučiće, odnosno dodjeljivanjem imena i potpisa jednom poštanskom sandučiću automatski mijenjate ove postavke u svim mailovima kombiniranim u Yandexu. Čak i ako je odabran bilo koji drugi okvir, potpis će sada svugdje biti isti.

Sveukupno, Yandex se uspješno nosio sa prikupljanjem i sortiranjem pošte, može izbrisati originalna pisma iz dodanog poštanskog sandučića, ali ne može raditi s potpisima! Yandexov sakupljač e-pošte nije se nosio s našim zadatkom i osvaja dva od tri boda.

Želio bih primijetiti da se, nakon što je “preturao” po sva tri servisa za sklapanje pošte, čini da je Mail u žurbi “promisao” svoju funkcionalnost. Iako će zadovoljiti većinu korisnika, ali, da budem iskren, Mail je napravio skupljača pošte za nastup, kako bi se zabilježio u natjecateljskoj utrci. Sve radi dobro i bez kvarova, ali asembler iz Mail-a nije se nosio s našim zadatkom. U sučelju pošte postoji nekoliko oglasnih blokova, ali oni ne ometaju rad sa slovima.

Što se tiče Yandexa, koji je davno stvorio sakupljač e-pošte, čini se da ova konkretna industrija nije podržana, jer popravljanje tako jednostavne funkcionalnosti (mogućnost dodavanja više potpisa za poštanske sandučiće) ne bi trebalo biti teško za tako moćnu pretragu motor. Međutim, Yandex ima još jednu jedinstvenu funkcionalnost koja vam omogućuje da domene povežete s njihovim dns poslužiteljima, a kasnije kreirate i konfigurirate poštu. Ali takve operacije i postavke zahtijevaju znanje i vrijeme. I iako tu nema ništa komplicirano, u svakom slučaju, to nije za većinu korisnika Runeta. Velika prednost- nema oglasa u sučelju Yandex pošte! Minus— ograničenje u sakupljaču pošte za 10 poštanskih sandučića.

Finalist i pobjednik je Googleov sakupljač e-pošte, koji se s našim zadatkom snašao unatoč Ograničenje od 5 kutija

Naravno, sve se mora usporediti. Ovdje na scenu stupa moja omiljena TPL DataFlow biblioteka.

Poštu ćemo preuzeti putem POP3. Sve "modne stvari" IMAP-a u ovom zadatku su suvišne - potrebno je što brže i lakše uzeti izvor pisma i izbrisati ga na serveru. POP3 je dovoljan za oči. Koristimo OpenPop.NET.

Kao dodatni dodatak, Zabbixu ćemo dodati nadzor. (Radit ćemo 24/7 i izdavati hvaljene brzine - ovo morate slijediti).

Ići

Izrađujemo normalnu konzolnu aplikaciju. Otvorite NuGet konzolu i instalirajte sve potrebne pakete:

Instalacijski paket Nlog Instalacijski paket OpenPop.NET Instalacijski paket TopShelf Instalacijski paket Microsoft.TPL.DataFlow
Idite u mapu projekta, kreirajte App.Debug.config i App.Release.config. Iskrcavamo projekt iz studija, otvaramo njegov kod (U daljnjem tekstu TopCrawler.csproj). Dodajte u odjeljak za konfiguraciju:

Konfiguracije

app.config app.config


A ispod je prilagođeni cilj za MSBuild:

Transformirajte cilj

$(TargetFileName).config


Osobno sam navikao na ovaj način - na staromodan način - dodati transformaciju konfiguracija u odvojena okruženja.
Radi praktičnosti, predlažem konfiguracije jakog tipa. Zasebna klasa će pročitati konfiguraciju. (O teorijskim aspektima takve odluke možete govoriti u komentarima). Konfiguracije, zapisnici, nadzor - izvrstan razlog za implementaciju uzorka Singleton.

Napravite mapu istog naziva u projektu (mora postojati red). Unutar kreiramo 3 klase - Config, Logger, Zabbix. Naš drvosječa:

drvosječa

statički zapisnik klase (javni statički zapisnik NLog.Logger ( get; privatni skup; ) javni statički NLog.Logger arhiv ( get; privatni skup; ) statički Logger() ( Dnevnik = LogManager.GetLogger("Global"); Arhiva = LogManager. GetLogger("Arhivator"); ) )


Nadgledanje pomoću Zabbixa zaslužuje zaseban post, pa ću ovdje ostaviti samo klasu koja implementira agenta:

Zabbix

imenski prostor TopCrawler.Singleton( ///

/// Singleton: zabbix klasa pošiljatelja /// static class Zabbix ( public static ZabbixSender Sender ( get; privatni skup; ) static Zabbix() ( Sender = new ZabbixSender(Config.ZabbixServer, Config.ZabbixPort); ) ) struct ZabbixItem ( javni string Host; javni string ključ javni niz; ; ) klasa ZabbixSender ( interna struktura SendItem ( // ReSharper onemogući InconsistentNaming - Zabbix je javni host niza osjetljiv na velika i mala slova; javni ključ niza; javna vrijednost stringa; javni sat stringa; // ReSharper vraća InconsistentNaming ) #pragma warning onemogućuje internu strukturu 0649 ZabbixResponse ( public string Response; public string Info; ) #pragma warning restore 0649 #region --- Konstante --- public const string DefaultHeader = "ZBXD\x01"; public const string SendRequest = "podaci pošiljatelja"; public const int Default Timeout = 10000 ;#endregion #region --- Polja --- privatno samo za čitanje DateTime _dtUnixMinTime = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); privatno samo za čitanje int _timeout; privatni string samo za čitanje _zabbixserver; privatno samo za čitanje int _zabbixport; #endregion #region --- Konstruktori --- javni ZabbixSender(string zabbixserver, int zabbixport) : this(zabbixserver, zabbixport, DefaultTimeout) ( ) public ZabbixSender(string zabbixserver, int zabbixport =server_zabbixport_server_zabbix) zabbixport; _timeout = timeout; ) #endregion #region --- Metode --- javni string SendData(ZabbixItem itm) (vrati SendData(novi popis (1) (itm)); ) javni niz SendData(List lstData) ( pokušaj ( var serijalizer = novi JavaScriptSerializer(); vrijednosti var = novi popis (lstData.Count); values.AddRange(lstData.Select(itm => novi SendItem (host = itm.Host, ključ = itm.Key, vrijednost = itm.Value, sat = Math.Floor((DateTime.Now.ToUniversalTime() - _dtUnixMinTime).) TotalSeconds).ToString(CultureInfo.InvariantCulture) ))); var json = serializer.Serialize(novo (zahtjev = SendRequest, podaci = vrijednosti.ToArray())); var zaglavlje = Encoding.ASCII.GetBytes(DefaultHeader); dužina var = BitConverter.GetBytes((long)json.Length); var podaci = Encoding.ASCII.GetBytes(json); var paket = novi bajt; Buffer.BlockCopy(zaglavlje, 0, paket, 0, zaglavlje.Duljina); Buffer.BlockCopy(duljina, 0, paket, zaglavlje.Dužina, dužina.Dužina); Buffer.BlockCopy(podaci, 0, paket, zaglavlje.Dužina + duljina.Dužina, podaci.Dužina); koristeći (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) ( socket.Connect(_zabbixserver, _zabbixport); socket.Send(packet); //Header var buffer = Da new byte (Rece). , međuspremnik, 0, buffer.Length, _timeout); if (DefaultHeader != Encoding.ASCII.GetString(buffer, 0, buffer.Length)) throw new Exception("Nevažeće zaglavlje"); //Međuspremnik duljine poruke = novi bajt ; ReceivData(socket, buffer, 0, buffer.Length, _timeout); var dataLength = BitConverter.ToInt32(buffer, 0); if (dataLength == 0) throw new Exception("Invalid data length"); //Message buffer = novi bajt; ReceivData(socket, buffer, 0, buffer.Length, _timeout); var response = serializer.Deserialize (Encoding.ASCII.GetString(buffer, 0, buffer.Length)); return string.Format("Odgovor: (0), Info: (1)", odgovor.Odgovor, odgovor.Info); ) ) catch (Exception e) ( return string.Format("Exception: (0)", e); ) ) private static void ReceivData(Socket pObjSocket, byte buffer, int offset, int size, int timeout) ( var startTickCount = Environment.TickCount; var primljen = 0; učini (ako (Environment.TickCount > startTickCount + timeout) izbaci novi TimeoutException(); pokušajte (primljeno += pObjSocket.Receive(buffer, offset + primljeno, veličina - primljeno, SocketFlags.None) ; ) catch (SocketException ex) ( if (ex.SocketErrorCode == SocketError.WouldBlock || ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferEp) ThreatError.NoBufferSpace; ) dok (primio< size); } #endregion } }


Konfiguracije… Vrijeme je da učinite barem nešto zanimljivo. Prvo, u konfiguracije ćemo pohraniti kutije koje anketiramo. Drugo, postavke protoka podataka. predlažem ovako:

konfiguracije



Dakle, host i port na koji se spaja, korisnik i lozinka - ovdje je sve jasno. Sljedeća je vrsta kutije. Recimo da uslugu koristi marketing (kao i drugi odjeli). Imaju poštanske sandučiće u koje padaju automatski odgovori na mailing liste, kao i FBL prijave neželjene pošte. Sama kutija već kategorizira slovo, pa za takve situacije odmah postavljamo vrstu kutije. S postavkama DataFlowa bit će dalje jasno kada krenemo stvarati objekte. Ovdje ćemo imati svoje odjeljke u konfiguraciji. Postoji hrpa priručnika kako to učiniti, pa ću samo pokazati rezultat:

Definiranje vrsta

#region --- Vrste --- statička klasa MailboxType (javni const string Bo = "bo"; javni const string Crm = "crm"; javni const string Fbl = "fbl"; javni const string Bounce = "bounce"; ) class MailboxInfo ( javni string Vrsta ( get; set; ) javni niz ime hosta ( get; set; ) javni string Korisnik ( get; set; ) javni niz Lozinka ( get; set; ) public int Port ( get; set; ) ) class DataBlockOptions ( public int Maxdop ( get; set; ) public int BoundedCapacity ( get; set; ) public DataBlockOptions() ( Maxdop = 1; BoundedCapacity = 1; ) ) #endregion


Izrada sekcija

///

/// Odjeljak prilagođene konfiguracije /// javna klasa CustomSettingsConfigSection: ConfigurationSection (javni CredentialsCollection CredentialItems ( get ( return base["CredentialsList"] as CredentialsCollection; ) ) public DataBlockOptionsCollection DataFlowOptionsItems ( get ( return base["DataFlowOptions") astionsL;


///

/// Prilagođena zbirka - popis vjerodajnica /// javna klasa CredentialsCollection: ConfigurationElementCollection, IEnumerable ( zaštićeno nadjačavanje ConfigurationElement CreateNewElement() (vrati novi CredentialsElement(); ) zaštićeni nadjačavajući objekt GetElementKey(ConfigurationElement element) (vrat ((CredentialsElement)element).Korisničko ime; ) public CredentialsElement this (dobi (vrati kao BaseGetialsindex)E ) javni novi IEnumerator < Count; i++) { yield return BaseGet(i) as CredentialsElement; } } } /// /// Stavka prilagođenih vjerodajnica /// javna klasa CredentialsElement: ConfigurationElement ( javni niz Hostname ( get ( return base["hostname"] kao string; ) ) javni niz Korisničko ime ( get ( return base["username"] kao string; ) ) javni niz Lozinka ( get ( return base ["password"] kao string; ) ) public string Type ( get ( return base["type"] kao string; ) ) public string Port ( get ( return base["port"] kao string; ) ) ) /// /// Prilagođena zbirka - popis opcija DataBlock /// javna klasa DataBlockOptionsCollection: ConfigurationElementCollection, IEnumerable ( zaštićeno nadjačavanje ConfigurationElement CreateNewElement() (vrati novi DataBlockOptionsElement(); ) zaštićeni objekt nadjačavanja GetElementKey(ConfigurationElement element) ( return ((DataBlockOptionsElement)element).Name; ) public CredentialsElement this ( get ( return index) BaseG; ) javni novi IEnumerator GetEnumerator() ( za (var i = 0; i< Count; i++) { yield return BaseGet(i) as DataBlockOptionsElement; } } } /// /// Stavka prilagođenih opcija DataBlock /// javna klasa DataBlockOptionsElement: ConfigurationElement ( javni string Name ( get ( return base["name"] kao string; ) ) javni string Maxdop ( get ( return base["maxdop"] kao string; ) ) javni niz BoundedCapacity ( get ( return base ["boundedcapacity"] kao niz; ) ) )


Neću pisati potpunu implementaciju konfiguracije, podrazumijeva se da će parametri koji su nam potrebni biti dodani tamo tijekom procesa razvoja.

Naše prilagođene postavke čitamo ovako:

Čitanje

javna lista CredentialsList ( get; privatni skup; ) javni rječnik DataFlowOptionsList ( get; privatni skup; ) ... static Config() ( pokušaj ( var customConfig = (CustomSettingsConfigSection)ConfigurationManager.GetSection("CustomSettings"); //Dohvati poštanske sandučiće za svaki (var stavka u customConfig.CredentialItemsL) CredentialItems. novi MailboxInfo (Hostname = item.Hostname, Port = Convert.ToInt32(item.Port), User = item.Username, Type = item.Type, Password = item.Password )); //Dohvatite postavke protoka podataka za svaki (var stavku u customConfig.DataFlowOptionsItems) DataFlowOptionsList.Add(item.Name, new DataBlockOptions ( Maxdop = Convert.ToInt32(item.Maxdop), BoundedCapacity = Convert.ToInt32(item.BoundedCapacity) ) (Exception); ) catch Lo.L.) Fatal("Pogreška pri čitanju konfiguracije: (0)", npr. Poruka); baci; ) )


Nekako ispadne jako dugo, a nismo ni došli do najzanimljivijeg dijela.

Izostavimo za sada uvez s TopShelfa, brojače performansi, komunikaciju s bazom podataka i bacimo se na posao! Stvaramo klasu Crawler - jezgru. Počnimo čitanjem pošte:

Privatni volatile bool _stopPipeline; ... public void Start() ( do ( var getMailsTasks = _config.CredentialsList.Select(credentials => Task.Run(() => GetMails(credentials))).ToList(); foreach (var zadatak u getMailsTasks) zadatak .Wait(); Thread.Sleep(2000); ) while (!_stopPipeline); //Zaustavi cjevovod - pričekajte dovršetak svih krajnjih točaka //DataFlow cjevovod će se zaustaviti ovdje ako (_stopPipeline) Logger.Log.Warn("Cjevovod ima zaustavio korisnik");)
Evo, lijenost je učinila svoje i odlučio sam se ne zamarati - ako ih ima oko 20-30 kutija, možete pokrenuti zadatak za svaku i ne brinuti o broju niti. (Dopuštam vam da bacate rajčice.)

Prijeđimo na čitanje:

Private void GetMails(Informacije o MailboxInfo) (pokušajte (koristeći (var client = new Pop3Client()) (
Odmah izračunajmo vrijeme pristupa kutiji - bit će korisno za dijagnosticiranje opterećenja mreže i poslužitelja.

//Nabavite Zabbix metriku var štoperica = nova Štoperica(); štoperica.Start(); //Nabavite broj pošte client.Connect(info.Hostname, info.Port, false); client.Authenticate(info.Korisnik, info.Lozinka); štoperica.Stop();
Slanje podataka u Zabbix. Sve je jednostavno - navodimo ime hosta (kao što je u Zabbixu), ključ (opet, strogo, kao u Zabbixu) i vrijednost niza.

//Pošalji u Zabbix Zabbix.Sender.SendData(new ZabbixItem (Host = Config.HostKey, Key = info.Type + Config.TimingKey, Value = štoperica.ElapsedMilliseconds.ToString())); Logger.Log.Debug("Pošalji [(0)] vrijeme na Zabbix: spojeno na "(1)" kao "(2)", vrijeme (3)ms", info.Type, info.Hostname, info.User, štoperica.ElapsedMilliseconds); varcount = client.GetMessageCount(); if (broj == 0) povratak; Logger.Log.Debug("Imamo novih (0) poruka u "(1)"", count, info.User); //Pošalji poruke u blok za sortiranje za (var i = 0; i< count; i++) { try { var mailInfo = new MessageInfo { IsSpam = false, Mail = client.GetMessage(i + 1), Type = MessageType.UNKNOWN, Subtype = null, Recipient = null, Mailbox = info }; Logger.Log.Debug("Download message from "{0}". Size: {1}b", info.User, mailInfo.Mail.RawMessage.Length);
Cjevovod DataFlow će se kreirati kada se kreira klasa Crawler. Smatramo da je naša prva faza sortiranje pisma.

Dok (!_sortMailDataBlock.Post(mailInfo)) Thread.Sleep(500);
Vidite kako je jednostavan - sam transporter je jedan. Svi zadaci koji čitaju poštu bacaju poruke jednu po jednu. Ako je blok zauzet, Post će vratiti lažno i samo ćemo pričekati dok se ne oslobodi. Struja tada u ovom trenutku nastavlja raditi. To je ono što ja bez brige zovem paralelizam.

Poruka je otišla na pokretnu traku, sada se može mirno spremiti u RAW arhivu (da, sve što pročitamo sprema se u arhivu datoteka. Služba podrške će nam se naknadno zahvaliti).

Postavimo, na primjer, rotaciju arhive:

Nlog.config



Onda možete postaviti logStash na to, ali to je druga priča...

//Spremi svaki mail u arhivu Logger.Log.Debug("Arhiviraj poruku"); Logger.Archive.Info(Functions.MessageToString(mailInfo.Mail)); ) catch (Exception ex) ( Logger.Log.Error("Parse email error: (0)", ex.Message); Functions.ErrorsCounters.Increment(); //Archive mail anyway Logger.Log.Debug("Arhiviraj poruku "); Logger.Archive.Info(Encoding.Default.GetString(client.GetMessageAsBytes(i + 1))); ) if (_config.DeleteMail) client.DeleteMessage(i + 1); if (_stopPipeline) break; ) Logger.Log.Debug("Gotovo s "(0)"", info.User); ) ) catch (Exception ex) ( Logger.Log.Error("Opća pogreška - vrsta: (0), poruka: (1)", ex, ex.Message); Functions.ErrorsCounters.Increment(); ) )
Ovdje smo koristili statičke brojače grešaka (po vrsti okvira), gdje je ErrorsCounters:

Javni statički rječnik ErrorsCounters = novi rječnik ();
A sami brojači mogu se napraviti ovako:

Counter.cs

class Counter ( private long _counter; public Counter() ( _counter = 0; ) public void Increment() ( Interlocked.Increment(ref _counter); ) public long Read() ( return _counter; ) public long Refresh() ( return Interlocked .Exchange(ref _counter, 0); ) public void Add (duga vrijednost) (Interlocked.Add(ref _counter, value); ) public void Set (duga vrijednost) (Interlocked.Exchange(ref _counter, value) ;))


Prijeđimo na stvaranje cjevovoda. Recimo da imamo kutije u koje se slijevaju automatski odgovori. Takva slova treba raščlaniti (kakav auto-odgovor, od koga, po kojoj mailing listi itd.) i dodati rezultat u pohranu (DB). Recimo da postoje kutije u koje padaju FBL izvještaji. Takva slova odmah dodajemo u bazu podataka. Sva ostala pisma smatraju se "korisnima" - treba ih provjeriti za neželjenu poštu i poslati u vanjski sustav, na primjer, CRM.

Kao što ste već shvatili, ovaj primjer uglavnom razmatra korištenje sakupljača za marketinške zadatke - prikupljanje statistike o isporuci pošte, informacija o neželjenoj pošti.

Dakle, odlučili smo se za tijek rada. U klasi Crawler deklariramo potrebne blokove:

Class MessageInfo ( public bool IsSpam ( get; set; ) javna poruka Mail ( get; set; ) public string Subtype ( get; set; ) public string Recipient ( get; set; ) public MessageType Type ( get; set; ) public MailboxInfo Poštanski sandučić ( get; set; ) ) class Crawler ( //Pipeline private TransformBlock _sortMailDataBlock; privatni TransformBlock _spamFilterDataBlock; privatni TransformBlock _checkBounceDataBlock; privatni TransformBlock _identifyDataBlock; privatni ActionBlock _addToCrmDataBlock; privatni ActionBlock _addToFblDataBlock; privatni ActionBlock _addToBounceDataBlock; ...
Kreiramo metodu inicijalizacije i stvaramo blokove cjevovoda (koristimo naše divne odjeljke iz konfiguracija za inicijalizaciju blokova):

Public void Init() ( //*** Kreirajte cjevovod *** //Kreirajte TransformBlock da biste dobili vrstu poruke var blockOptions = _config.GetDataBlockOptions("_sortMailDataBlock"); _sortMailDataBlock = new TransformBlock (mail => SortMail(mail), novi ExecutionDataflowBlockOptions ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Kreiraj TransformBlock za filtriranje neželjene pošte blockOptions = _config.GetDataBlockOptions("_spamFilterDataBlock"); _spamFilterDataBlock = novi TransformBlock (mail => FilterSpam(mail), novi ExecutionDataflowBlockOptions ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Kreiraj TransformBlock za sortiranje odbijanja blockOptions = _config.GetDataBlockOptions("_checkBounceDataBlock"); _checkBounceDataBlock = novi TransformBlock (mail => BounceTypeCheck(mail), novi ExecutionDataflowBlockOptions ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Kreiraj TransformBlock za identifikaciju vlasnika odbijanja blockOptions = _config.GetDataBlockOptions("_identifyDataBlock"); _identifyDataBlock = novi TransformBlock (mail => GetRecipient(mail), novi ExecutionDataflowBlockOptions ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Kreiraj ActionBlock za slanje pošte u CRM blockOptions = _config.GetDataBlockOptions("_addToCrmDataBlock"); _addToCrmDataBlock = novi ActionBlock (mail => AddToCrm(mail), novi ExecutionDataflowBlockOptions ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Kreiraj ActionBlock za slanje FBL-a na MailWH blockOptions = _config.GetDataBlockOptions("_addToFblDataBlock"); _addToFblDataBlock = novi ActionBlock (mail => AddToFbl(mail), novi ExecutionDataflowBlockOptions ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Kreirajte ActionBlock za slanje Bounce na MailWH blockOptions = _config.GetDataBlockOptions("_addToBounceDataBlock"); _addToBounceDataBlock = novi ActionBlock (mail => AddToBounce(mail), novi ExecutionDataflowBlockOptions ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity ));
Sastavljamo transporter u skladu s našom shemom:

//*** Izrada cjevovoda *** _sortMailDataBlock.LinkTo(_spamFilterDataBlock, info => info.Type == MessageType.GENERAL); _sortMailDataBlock.LinkTo(_addToFblDataBlock, info => info.Type == MessageType.FBL); _sortMailDataBlock.LinkTo(_checkBounceDataBlock, info => info.Type == MessageType.BOUNCE); _sortMailDataBlock.LinkTo(DataflowBlock.NullTarget (), info => info.Type == MessageType.UNKNOWN); /*STUB*/ _checkBounceDataBlock.LinkTo(_identifyDataBlock); _identifyDataBlock.LinkTo(_addToBounceDataBlock); _spamFilterDataBlock.LinkTo(_addToCrmDataBlock, info => !info.IsSpam); _spamFilterDataBlock.LinkTo(DataflowBlock.NullTarget (), info => info.IsSpam); /*STUB*/
Kao što vidite, sve je krajnje jednostavno - povezujemo blok sa sljedećim (s mogućnošću postavljanja uvjeta povezivanja). Svi blokovi se izvode paralelno. Svaki blok ima stupanj paralelizma i kapaciteta (uz pomoć kapaciteta možete regulirati red čekanja prije bloka, odnosno blok je primio poruku, ali je još ne obrađuje). Dakle, moguće je postaviti visok stupanj paralelizma za "složene" i duge operacije, kao što je raščlanjivanje sadržaja e-pošte.

Neću opisivati ​​DataFlow hardver, bolje je sve pročitati u izvornom TPL DataFlow izvoru.

SortMailDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_spamFilterDataBlock).Fault(t.Exception); else _spamFilterDataBlock.Complete(); )); _sortMailDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_addToFblDataBlock).Fault(t.Exception); else _addToFblDataBlock.Complete(); )); _sortMailDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_checkBounceDataBlock).Fault(t.Exception); else _checkBounceDataBlock.Complete(); )); _spamFilterDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_addToCrmDataBlock).Fault(t.Exception); else _addToCrmDataBlock.Complete(); )); _checkBounceDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_identifyDataBlock).Fault(t.Exception); else _identifyDataBlock.Complete(); )); _identifyDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_addToBounceDataBlock).Fault(t.Exception); else _addToBounceDataBlock.Complete(); )); )
Sve, zapravo, cjevovod već radi, možete mu slati poruke. Ostaje samo zaustaviti ga dodavanjem naše Start metode:

početak

public void Start() ( do ( var getMailsTasks = _config.CredentialsList.Select(credentials => Task.Run(() => GetMails(credentials))).ToList(); foreach (var zadatak u getMailsTasks) task.Wait( ); Thread.Sleep(2000); ) while (!_stopPipeline); //Zaustavi cjevovod - pričekajte dovršetak svih krajnjih točaka _sortMailDataBlock.Complete(); _addToCrmDataBlock.Completion.Wait(); _addToFblDataBlock.Completion.WaaddTo); .Completion.Wait(); if (_stopPipeline) Logger.Log.Warn("Cijevovod je zaustavio korisnik"); )


Prijeđimo na delegate.
Razvrstavanje ... Pa, recimo da nam je sve jednostavno (uvijek ćemo imati vremena zakomplicirati):

Private MessageInfo SortMail(MessageInfo mail) ( switch (mail.Mailbox.Type) ( case MailboxType.Crm: mail.Type = MessageType.GENERAL; prekid; case MailboxType.Bounce: mail.Type = MessageType.BOUNCE;T breakype; case . Fbl: mail.Type = MessageType.FBL; prekid; ) vrati poštu; )
Filter za neželjenu poštu. Ovo je za domaću zadaću - koristite SpamAssassin.
Evo delegata:

Private MessageInfo FilterSpam(MessageInfo mail) ( //TODO: Add SpamAssassin logic return mail; )
I klase za rad sa SpamAssassin API-jem (link na projekt).
I prelazimo na raščlanjivanje slova. Analiziramo automatske odgovore. Ovdje MEF dolazi u igru.
Izrađujemo projekt (dll) sa sučeljima za naše dodatke (Nazovimo Interfaces).
Dodavanje sučelja:

Javno sučelje ICondition ( Provjera niza (Message mimeMessage); ) javno sučelje IConditionMetadata ( Vrsta Vrsta ( get; ) )
I sve. Naš TopCrawler ovisi o ovom projektu i projekt dodataka će ga također koristiti.
Napravite novi projekt (također dll), nazovimo ga Uvjeti.
Dodajte vrste automatskih odgovora:

#region --- Vrste --- statična klasa BounceType ( public const string Full = "BounceTypeFull"; public const string Timeout = "BounceTypeTimeout"; public const string Refused = "BounceTypeRefused"; public const string NotFound = "BounceTypeNotFound"; const string Inactive = "BounceTypeInactive"; public const string OutOfOffice = "BounceTypeOutOfOffice"; public const string HostNotFound = "BounceTypeHostNotFound"; public const string NotAuthorized = "BounceTypeNotAuthorized"; public constnegConstpe =TounceendnegConstpe;
I klase koje implementiraju naše sučelje:

Javna klasa ConditionNotFound1: ICondition ( javni string Check(Message mimeMessage) (ako (!mimeMessage.MessagePart.IsMultiPart) vrati null; const string pattern = "Diagnostic-Code:.+smtp.+550"; var regexppa = new Regex , RegexOptions.IgnoreCase); vrati mimeMessage.MessagePart.MessageParts.Any(part => part.ContentType.MediaType == "message/delivery-status" && regexp.IsMatch(part.GetBodyAsText())) ? No BounceText())) ? ; ) ) ... javna klasa ConditionTimeout2: ICondition ( vrati BounceType.Timeout; ) ...
Kao što ste primijetili, sve je u atributima. Uz pomoć njih će se učitavati dodaci.
Vraćamo se na naš projekt i učitavamo dodatke:

Class Crawler ( ... //Plugins public IEnumerable > BounceTypeConditions ( get; set; ) private void LoadPlugins() ( pokušaj ( var container = new CompositionContainer(new DirectoryCatalog(_config.PluginDirectory), true); container.ComposeParts(this); ) catch (Exception ex) ( Logger.Log .Error("Nije moguće učitati dodatke: (0)", npr. Poruka); ) ) ...
Povlačimo LoadPlugins u konstruktoru naše klase. Neću detaljno objašnjavati mehanizam učitavanja - Google će proći bolje.

Prijeđimo na naš delegat za provjeru valjanosti vrste odbijanja. Uvjeti će se primjenjivati ​​naizmjence sve dok prva - ekskluzivna metoda - ne proradi:

Private MessageInfo BounceTypeCheck(MessageInfo mailInfo) ( pokušajte ( foreach (var uvjet u BounceTypeConditions) ( var res = condition.Value.Check(mailInfo.Mail); if (res == null) nastavi; mailInfo.Subtype = res; Logger.Log) .Debug("Uvjet vrste odbijanja [(0)] pokrenut za poruku [(1)]", condition.Metadata.Type, mailInfo.Mail.Headers.MessageId); break; ) ) catch (Exception ex) ( Logger.Log .Error("Neuspjelo odrediti vrstu odbijanja poruke "(0)": (1)", mailInfo.Mail.Headers.MessageId, ex.Message); Logger.ErrorsCounters.Increment(); ) return mailInfo; )
Dakle, ako se pojavi nova logika, dovoljno je samo dodati novu klasu projektu s dodacima koji implementiraju naše sučelje i - voila! Neću prilagati primjer drugog dodatka za određivanje pošiljatelja pisma - tako da je to već dugačak post (Auto-odgovor je generirao sam poslužitelj, tako da pošiljatelja također treba raščlaniti iz zaglavlja pisma pismo).

Sa evidencijom rezultata u DB-u također ništa neobično. Na primjer, ovako:

Privatno void AddToBounce(MessageInfo mail) ( pokušaj ( MailWH.BounceAdd(mail); Functions.ProcessedCounters.Increment(); Functions.Log.Debug("Send Bounce to MailWH"); ) catch (Exception ex) ( Functions.Log. Error("Pogreška pri spremanju poruke odbijanja "(0)" na MailWH: (1)", mail.Mail.Headers.MessageId, ex.Message); Functions.ErrorsCounters.Increment(); ) )

Odskočiti Dodaj

javni statički dugi BounceAdd(MessageInfo poruka) (koristeći (var conn = new SqlConnection(ConnectionString)) koristeći (var cmd = new SqlDataAdapter("BounceAdd", conn)) ( var body = message.Mail.FindFirstPlainTextVersion() == null ? message.Mail.FindFirstHtmlVersion().GetBodyAsText() : message.Mail.FindFirstPlainTextVersion().GetBodyAsText(); var outId = new SqlParameter("@ID", SqlDbType.SqlDbType.BigInt) (Direkcija cmd.BigInt). .CommandType = CommandType.StoredProcedure;cmd.SelectCommand.Parameters.Add(new SqlParameter("@RawMessage", message.Mail.RawMessage)); cmd.SelectCommand.Parameters.Add(new SqlParameter("))Message", body ; cmd.SelectCommand.Parameters.Add(new SqlParameter("@Subject", message.Mail.Headers.Subject ?? "")); cmd.SelectCommand.Parameters.Add(new SqlParameter("@MessageID", message.Mail .Headers.MessageId ?? "")); cmd.SelectCommand.Parameters.Add(new SqlParameter("@AddressTo", message.Mail.Headers.To.Address ?? "")); cmd.SelectComm and.Parameters.Add(new SqlParameter("@AddressFrom", message.Mail.Headers.From.Address ?? "")); cmd.SelectCommand.Parameters.Add(new SqlParameter("@DateRecieved", DateTime.Now)); cmd.SelectCommand.Parameters.Add(new SqlParameter("@BounceTypeSysName", (object)message.Subtype ?? DBNull.Value)); cmd.SelectCommand.Parameters.Add(new SqlParameter("@SourceFrom", (object)message.Recipient ?? DBNull.Value)); // TODO: Dodajte podršku za ListId cmd.SelectCommand.Parameters.Add(new SqlParameter("@ListId", DBNull.Value)); cmd.SelectCommand.Parameters.Add(outId); conn.open(); cmd.SelectCommand.ExecuteNonQuery(); return outId.Value as long? ?? 0; ))


Žao mi je što nisam imao vremena pokazati TopShelf - post je već previše napuhan.

zaključke

U ovom vodiču naučili smo da zadatak prikupljanja pošte možda nije tako jednostavan. Razvijena jezgra omogućuje brzo dodavanje novih koraka procesa - DataFlow blokova, bez utjecaja na postojeću logiku. Podsustav dodataka omogućuje vam da brzo izgradite logiku raščlanjivanja nalik skripti, a sam DataFlow paralelizira sve izračune (i imamo mogućnost fleksibilnog konfiguriranja višenitnosti za određeni stroj). TopShelf nam daje mogućnost pokretanja usluge u servisnom i konzolnom načinu radi lakšeg otklanjanja pogrešaka.

Fuh... Ako ste zainteresirani, reći ću vam kako to staviti na tračnice kontinuirane integracije, postaviti autobuildove i objaviti izdanje putem VS Release Managementa.

Oznake: Dodajte oznake

Nastavljam niz članaka o funkciji prikupljanja pošte u jedan glavni e-mail pretinac iz bilo kojeg drugog koji se nalazi na bilo kojem servisu pošte. U prošlom članku govorili smo o postavljanju prikupljanja pošte na usluzi Yandex, što je jednostavno kao ljuštenje krušaka. A u ovom članku govorit ću o tome kako to učiniti na drugoj usluzi koja danas nije ništa manje popularna - Mail.ru, gdje mnogi još uvijek drže svoj glavni e-mail pretinac, unatoč činjenici da, na primjer, usluga GMail ima jasne prednosti (opisano je o postavljanju prikupljanja pošte u Gmailu). Ali kako se kaže, svakom svoje i ponekad je to samo stvar navike :)

Postavljanje prikupljanja pošte u usluzi Mail.ru jednostavno je kao, na primjer, na Yandexu. Samo nekoliko jednostavnih koraka i sve će biti spremno, pošta će početi teći iz poštanskih sandučića koje ste spojili na jedan, na Mail.

Proces postavljanja prikupljanja pošte u usluzi Mail.ru

Prije svega, prijavite se na svoj Mail račun, gdje ćete prikupljati poštu iz drugih e-mail kutija i otvoriti odjeljak "Pisma" (tamo se nalazi pošta).

Sada morate ići na postavke pošte. Da biste to učinili, kliknite gumb "Više" na vrhu i odaberite "Postavke".

Postavke možete otvoriti i klikom na svoju adresu e-pošte u gornjem desnom kutu, a zatim odabirom "Postavke pošte".

Zatim idite na odjeljak "Pošta iz drugih poštanskih sandučića".

Otvorit će se prvi prozor za povezivanje drugog e-mail pretinca.

Da vas podsjetim da se drugi e-mail pretinac iz kojeg želite prikupljati pisma može nalaziti na bilo kojem servisu, a ne samo na Mailu!

U primjeru za ovaj članak razmotrit ćemo povezivanje poštanskog sandučića koji se nalazi na Yandexu.

U ovom prozoru morate navesti korisničko ime i lozinku za e-poštu koju povezujete. Ako se okvir koji povezujete nalazi na jednoj od dolje navedenih usluga, kliknite na odgovarajući gumb na vrhu, unesite punu adresu povezane e-pošte ispod i kliknite na "Dodaj okvir":

Ako se okvir koji želite spojiti nalazi na nekom drugom servisu (nije s popisa iznad), kliknite na gumb “Ostala pošta” na vrhu, nakon čega trebate unijeti punu adresu povezane pošte, lozinku iz njega i kliknite "Dodaj okvir".

Ako se još niste ulogirali u ovaj preglednik u svojoj drugoj pošti koju povezujete, tada ćete u sljedećem prozoru morati unijeti svoju prijavu i lozinku iz njega. Primjer:

Nakon toga kliknite "Dopusti" (dopuštate pošti na Mail.ru da koristi neke podatke povezane druge pošte).

Ako je sve prošlo kako treba, dobit ćete poruku da je kolektor dodan. Sada trebate odabrati mapu za prikupljanje pošte: u posebno kreiranoj mapi prema nazivu pošte koju ste povezali ili u pristigloj pošti. Na vama je, ali, po mom mišljenju, prikladnije je kada pošta prikupljena iz drugog poštanskog sandučića ide u zasebnu mapu. Na ovaj ili onaj način, tada se može konfigurirati filtriranjem poruka.

Opcija "Primijeni filtre na primljene poruke" znači da će se svi filtri koje ste već konfigurirali u glavnoj pošti na Mail također primjenjivati ​​na poštu primljenu iz povezanog poštanskog sandučića. Onemogućiti ili ne - odlučite.

To je to, skupljač pošte je postavljen! Sada, u roku od nekoliko minuta (ponekad proces kasni ako ima puno pisama u povezanoj pošti), pošta iz drugog poštanskog sandučića počet će teći u vaš glavni.

Na ovaj način se možete povezati kako biste prikupili koliko god želite mailova.

Kako odvojeno vidjeti sva pisma iz povezane pošte?

Pisma možete zasebno pregledavati ako ste prilikom postavljanja prikupljanja pošte u Pošti naveli da se pisma trebaju prikupljati u zasebnoj mapi s nazivom povezanog poštanskog sandučića. U tom slučaju otvorite ovu mapu i vidjet ćete sva potrebna slova. Primjer:

Ako niste odmah postavili primanje pisama u zasebnu mapu, možete ga postaviti u bilo kojem trenutku otvaranjem kreiranog sakupljača (više o tome u nastavku).

Konfiguriranje kreiranog sakupljača pošte, njegovo onemogućavanje i omogućavanje

Ponekad ćete možda morati promijeniti postavke sakupljača pošte koji ste stvorili u Pošti, kao i isključiti ili ponovno uključiti.

To se može učiniti na istom mjestu u odjeljku "Postavke" - "Pošta iz drugih poštanskih sandučića", gdje ste izvorno kreirali svoj sakupljač pošte.

Ovdje ćete vidjeti stvoreni kolektor. Ako ga želite isključiti ili ponovno uključiti, kliknite na odgovarajući prekidač. Ako trebate otvoriti postavke kolektora, kliknite "Uredi".

I otvorit će se iste postavke za sakupljača pošte, kao u fazi njegovog stvaranja (vidi).

Vrhunski povezani članci