Menü
Bedava
giriş
ana  /  Multimedya / Yandex posta koleksiyonunu ayarlama. Birinde farklı kutulardan tüm harfleri topla

Yandex Mail Koleksiyonunu Ayarlama. Birinde farklı kutulardan tüm harfleri topla

Muhtemelen sadece birimler, oldukları soruna rastlamadı. elektronik adres Onları böyle durdurdu ya da gerekli değil. Ancak, eğer çok sayıda kişinin kutuya bağlı olması, istemediğimi kaybetmek için.

Aklıma gelebilecek ilk çözüm, yeni bir güzel adresi oluşturmak ve aynı zamanda saniyeyi sürekli kontrol etmektir. Karmaşık. Bu durumda, daha fazla kutu oluşturmaya başlıyoruz ve çok sayıda adresle karıştırılmaya başlıyoruz.

Çok rahatsızlık var: bir risk var şifreyi unutur, adresi rahatsız etmeye devam ediyor [E-posta Korumalı]Ciddi bir şirketin direktörü olduğunuzda ve çok daha fazlası var!

Çözüm ve çok basittir. Ve uygun.

İdeal bir adresi olan bir kutu oluşturduğunuzda, eski postalardan harflerin toplanmasını bağlayın. Bağlı kutulardan gelen tüm harfler, ana posta içerisinde aynı adın klasörlerinde bulunabilir. Her şey düzgünce, anlaşılır ve sipariş edilir.

Koleksiyoner kutudan kutuya geçmek için zaman kazandırır ve birinin cevapsız kalacağı korkmadan tamamen yeni bir adrese gitmenize izin verir.

Nasıl kurulur?

Bir kez daha. Her şey çok basit. Söyleriz:

  1. Posta kutunuzun ayarlarına gidin;
  2. "Diğer kutulardan posta" bölümünü seçin;
  3. Harf toplamak istediğiniz kutusundan e-posta adresini ve şifreyi girin.

Yeni bir adres bağladıktan sonra, onu göreceksiniz toplam Liste Aynı sayfada.

Bu bölümde, kollektörü kolayca yönetebilirsiniz: İşi duraklatabilir, ek kutular ekleyin veya ekleyin. Toplanan harfler, eski kutusunda sizin tarafınızdan oluşturulan iç alt klasörlerle ayrı bir klasörde saklanacaktır.

Bu arada, yeni bir güzel adresi kullanmaya sıkıca karar verdiyseniz, ancak eski postalara yazan herkesi bildirmek için çok tembelsiniz, filtreleme kurallarını yeni bir adresden otomatik yanıtla yapılandırın.

Bunu yapmak için, filtreyi ve "birine harflerse" sütununda yapılandırın eski adresinizi belirtin. "Sonuç Mesajı" eylemini seçin. Mesajındaysanız, yeni kutunun adresini belirtirseniz, o zaman eski postalara yazacak olan herkes cevabı alır ve kişilerinizi kaybetmez.

Bir sekmeden gmail ile "Yandex. İyi" oldukça sıkıcı. Ve eğer bir düzine varsa hesap Farklı posta sağlayıcılarda, yeni yazışmaların sabah kontrolü ve işkenceye dönüşür. Harfleri tek bir yerde birleştirerek, bu rahatsızlıktan kurtulursunuz.

Web arayüzü

Çoğu e-posta sağlayıcı, birden fazla posta kutusundan yerleşik bir e-posta koleksiyonu özelliği sağlar. Örneğin, bir Gmail hesabındaki tüm kutularınızdan harfler toplamaya çalışalım.

Her şeyden önce, posta servisinde, mektupları almak istediğiniz yerden, POP protokolü üzerinden erişebileceğinizden emin olun. Ardından Gmail ayarlarına gidin ve sağ üst köşedeki "Ayarlar" ı tıklayın. Hesaplar sekmesini tıklayın ve "Diğer Hesaplardan Posta Al" bölümünü bulun.

Bir hesap ekle, e-posta adresini girin ve "İleri" yi tıklayın, ardından şifrenin tadını çıkarın. Posta değişiminin sağlayıcılar arasında daha güvenli olmaları için, "her zaman korumalı bir bağlantı (SSL) kullan seçeneğinin etkinleştirildikten emin olun. Ardından "Hesap Ekle" ye tıklayın.

Şimdi eklenen adrese gelen harfler, Gmail'inizin Gelen Kutusuna otomatik olarak toplanacaktır. İhtiyacınız olana göre çok fazla posta adresi ekleyebilirsiniz.

Masaüstü istemcileri

E-posta gereği yazılım. Evet, posta istemcisinde çok şey yapabilirsiniz (bazen Google'dan çok daha fazlası, Gmail'de yapmanızı sağlar). Ancak web arayüzü, yerel uygulamayla karşılaştırılmamıştır. En modern web UI bile posta ile çalışmada bir darboğazdır.

Rife nidlman, cne.com

Masaüstü posta istemcileri Bu konuda, çeşitli hesaplardan gelen harfleri toplayabilirler. Aynı zamanda, düzinelerce adresle çalışabilir ve hangi sağlayıcının bir servis sağlayıcısı olduğunu bile düşünmeyin.

Çoğu el yapımı e-posta istemcisinin yerleşik bir toplam gelen kutusuna sahiptir. Favori istemciniz yalnızca gelen harfler için ayrı klasörlerle çalışmasını destekse bile, hala akıllı filtrelerle birlikte kolayca birleştirebilirsiniz.

Outlook'un birden fazla posta kutusunun eşzamanlı yönetimi için tasarlandığına rağmen, her hesap için hala ayrı bir gelen kutusu görüntüler. Ancak filtreler kullanılarak kolayca düzeltilebilir.

Outlook Outlook, "Klasör" sekmesine gidin ve araç çubuğundaki "Ara Klasörü Oluştur" ı tıklayın. Ardından "Özel bir arama klasörü oluşturma" seçeneğini seçin. "Seç", ancak tüm yeni mesajların klasöre gitmesi için arama kriterlerini seçmeyin. Klasörü istediğiniz gibi adlandırın, örneğin "tüm posta".

"Genel Bakış" na tıklayın, posta toplamak istediğiniz tüm klasörleri ve kutuları seçin ve "Inned Klasörlerde Ara" seçeneğini kontrol edin.

Şimdi Outlook'a eklediğiniz tüm posta hesaplarından gelen harfler, oluşturduğunuz akıllı klasörde görünecektir. Yeni postanızın her zaman göründüğü için "Sık Kullanılanlar" seçeneğini etkinleştirebilirsiniz.

MAC E-posta istemcisi, tüm bağlı hesaplardan gelen harfler için tek bir klasör sağlar. Sadece hesaplarınızı ekleyin ve tüm yeni harfler tek bir yerde toplanacaktır.

Thunderbird'de "Gelen" bir klasördeki tüm mektuplarınızı toplamak için çok basittir. Görünüm menüsüne gidin (Menü Çubuğu görüntülenmiyorsa, ALT tuşuna basın). Ardından "Klasörler" → "Kombine" seçeneğini seçin. Artık yeni harfler için bir "Gelen Kutu" klasörüne, bir "Cherniviki" klasörü, bir "gönderilen" ve bir "arşiv" olacak. Uzun zamandır yalan söylemeniz gerekmez. Bu durumda, mesajlar daha önce olduğu gibi, posta sağlayıcılarınızın sunucularında saklanır.

Mobil Müşteriler

Kombine gelen kutusu, Gmail de dahil olmak üzere birçok mobil posta istemcisindedir. Gmail uygulaması, Yahoo, Outlook veya diğer hizmetler de dahil olmak üzere gelen e-posta hesaplarınızı toplar.

Google'dan uygulamayı beğenmediyseniz, Outlook veya Mymail gibi üçüncü taraflı posta istemcilerini deneyebilirsiniz.

Belki fikirlerinizi size bir yerde nasıl gruplandırılacağınız? Yorumlarda paylaşın.

Bu makalede, "diğer kutulardan posta adresinden" ve "diğer hesaplardan harf toplama" nı tartışacaktır. Posta hizmetlerinin ve karşılaştırmaların görüşleri.

Posta servis işlevi güncellendikçe, bu makalenin sonunda haberleri yayınlayacağız.

Posta Hizmeti Sonrası Hizmeti, arama motorları Yandex ve Google, birkaç yıldır çok faydalı ve gerekli bir işlevsellik sunuyor, bu da diğer tüm e-posta hesaplarını bir postayla birleştirmenize olanak sağlar. Başka bir deyişle, bir kez eklemek ve tüm "postalarınızı" yapılandırın ve bunları kalıcı giriş ve şifre olmadan bir pencerede yönetmek mümkün olacaktır.

Posta hizmetleri, tüm gelen harfleri, uygun bir arayüzü, iyi yönetim işlevselliğini ve çok daha fazlasını saklamak için bize büyük bir yer sunar. Listelenen posta hizmetlerinin yeteneklerini test etmek için, çalışmalarını değerlendirmek için üç parametre seçin: 1) Dahil olmak üzere çeşitli e-posta hesaplarını yönetmeniz gerekir. farklı hizmetler ve siteler, bir posta istemcisi aracılığıyla; 2) Her posta için kişisel imza ve bir isim var; 3) Posta, Yandex veya Google Mail'e eklenen posta hesaplarının sunucularından harfleri silin.

Görevimiz şöyle görünüyor:

Öyleyse devam et. Hizmeti ilk önce mail.ru'dan test ediyoruz: "Bize şunları söyler:" Tüm posta kutularınızdan posta adresinden bir kutuda posta.ru.

Üzerinde çalışan herhangi bir sunucudan harflerin toplanmasını ayarlayın İmap protokolü veya pop3. " @Mail, @inbox, @ list, @ BK, @ SLID, @ BK, listelenen sunucularda posta adresinden en az bir postaya sahip olmalısınız. Başka bir deyişle, önce posta postasını kaydedin ve ardından başka posta hesapları ekleyin. Posta üzerindeki kayıt işlemi basittir, tanımlamak için hiçbir anlam ifade etmiyor, ancak tarif ettiğimiz bu post hesabına başka bir e-posta ekleyerek.

Daha sonra, kullandığınız herhangi bir kutudan bir kullanıcı adı ve şifreyi girmeniz istenir ve "posta kollektörü" içinden 3-5 dakika içinde "Gelen Kutusu" klasörlerinin yanındaki ekli postanın adına sahip bir klasör oluşturur, "Gönderildi", "spam" ve diğer.

Aslında, mektup toplayıcı 10-15 dakika içinde kazanır ve belirttiğiniz kutudan yeni oluşturulan klasörde tüm harfleri ekleyecektir. Yeni e-posta için gelen tüm harfler bu klasöre gelecek, ayrıca ekli kutudan harf göndermek mümkün olacaktır. Yeni bir mektup oluştururken, hangi posta kutusunun mektubuna gönderileceğini seçebileceğiniz "dan" alan görünecektir.

Posta servis mailinin avantajları.ru, diğer kutuları ayarlama ve kolaylık kolaylığı, çeşitli protokoller belirlemeye gerek yoktur (POP3, SMTP) içerebilir. Çok önemlidir, çünkü her kullanıcı ne olduğunu bilmiyor.

Mail'in eksileri, eklenen her yeni posta için bir isim ve imza atamak (ana ek olarak yeni bir e-posta), yani ana postanın adı ve imzası her adrese dağıtılacaktır. Bir başka önemli dezavantaj, postalarda harf indirerken, ekteki kutudan orijinal harflerin otomatik olarak çıkarılması imkanı yoktur. Eklenen kutu sunucusundan harfleri silmek için neden bu kadar önemlidir? Bu, ekli postayı doldurmayı önler, çünkü Dış e-posta hesapları, kural olarak, harfleri saklamak için çok küçük boyuta sahiptir. Örneğin, harici bir hesapta bir posta alanını taşırken, posta.ru, harici bir posta arayüzüne girene kadar ve doğrudan oradan gelen yeni harfler göstermez. Ek olarak, postalarımızın depolanması için çok fazla yer alma umuduyla postayla posta getireceğiz, bu da barındırma kaynakları ile sınırlı olabilecek. Böylece, Posta.RU'un başka bir etki alanı bölgesinden posta eklerken neredeyse sınırsız posta kutusu birimi sunmasına rağmen (örneğin, [E-posta Korumalı]), Ek e-posta kaynaklarınız Mail.ru'da artmaz ve barındırma kaynakları ile sınırlı olmaya devam edecektir (bizim durumumuzda, kaynaklar primer.ru).

Posta servisine başka bir posta ekleme olasılığı, görevimizi üçün iki noktasında memnun değildi ve toplam bir puanla gol attı.

True, mail.ru, harici bir posta eklemek için başka bir yolu ve daha kesin olarak, dış postaya bağlantı veya girişi. Buna benziyor:

Bu yöntem görevimiz için uygun değildir, çünkü Bu bir posta koleksiyonu değil, postaya bağlanan ve her seferinde tüm klasörleri ve harfleri posta arayüzüne yükleyen bir kullanıcı modudur. Ancak, her posta için kişisel imza ve isim eklemek mümkündür, yapılandırılmış postadan harf göndermek mümkündür. Harflerin yüklü kutulardan çıkarmak işe yaramaz, çünkü Bu bir posta koleksiyonu değil.

Önemli! Bazı kullanıcılar yanlışlıkla, harflerin postayla çıktığını, indirmeden oluşan postaların temizlenebileceğini düşünüyor. Mail.ru'nin bir posta görüntüleyici olarak çalıştığı bir kez daha dikkat edeceğiz ve postayı temizlerseniz, ana kutuda ve posta ile kaldırılır.

İkinci Test Yandex mektubu koleksiyoncusu ile. Görevler benzer şekilde teslim edilir: Posta toplayın, her posta ve ad için imzanızı ve adınızı atayın, ayrıca tüm postaları eklenen kutusundan silme.

Yandex'te bir harf toplayıcı benzer bir şema ile yapılandırılmıştır, ancak posta bağlantısı bazı sitelerden oluşursa, örneğin, site.ru, ek ayarlar kaydetmeniz gerekir, ekran görüntüsüne bakın.

Posta hizmeti bu çalışmayı bizim için yaptı, Yandex teklifler manuel mod Tüm ayarları üçüncü taraf postalardan durdurun. Burada karmaşık bir şey yok: Giriş alanında, postanın tam adını giriyoruz ( [E-posta Korumalı]), Sunucu alanında, yalnızca Etki alanını (site.ru) girin, diğer tüm ayarlar varsayılandan ayrılmak için daha iyidir veya ne yaptığınızı biliyorsanız değiştirin. Başarılı postaların eklenmesinden sonra, yazıt görünecektir:

Postanın aksine, kollektör, Yandex, orijinal harflerin ek çekmecede veya olmadığını seçmeyi seçmeyi önerir. Genel olarak, Yandex'in mektubunun mektubu Mail.ru ile benzer bir şemada çalışır, bir mektup gönderilecek bir posta kutusu seçmek mümkündür. Ancak, yandex'in harflerinin imzası ile aynı problem: Her eklenen posta kutusu için eklenen her posta kutusu için bireysel bir isim ayarlamanın bir yolu yoktur.

Navigasyona göre yargılama, her posta kutusu için bireysel bir imza ekleme olasılığı, ancak aslında çalışmıyor. Posta'yı seçin, ad ve imzayı reçete ediyoruz, Kaydet'i tıklatın. Her şey, imza kaydedilir ve çalışıyor, ancak aynı zamanda diğer tüm posta kutuları için de kaydedilir, yani bir kutuya ad ve imza atan, bu parametreleri Yandex'te tüm birleşik postalarda otomatik olarak değiştirirsiniz. Başka bir kutu seçerken bile, imza şimdi her yerde benzer olacaktır.

Toplam Yandex, ücret ve sıralama ile başarılı bir şekilde başa çıkmış, harflerin orijinallerinin eklenen kutusundan nasıl kaldırılacağını biliyor, ancak imzalarla nasıl çalışacağını bilmiyor! Görevimizle birlikte, Yandex'in harfleri mektubu başa çıkmadı ve üçte iki nokta çevirdi.

"Koşma", harflerin montajındaki her üç sette "koşan", paranızın ambulans elindeki işlevselliğini "uyuduğunu" not etmek istiyorum. Çoğu kullanıcıyı tatmin edeceği halde, ancak dürüstçe, posta, rekabetçi bir yarışta kutlamak için bir onay posta koleksiyoncusu yaptı. İyi ve başarısızlıksız çalışıyor, ancak görevimizle birlikte postadan toplayıcı başa çıkmadı. Posta arayüzünde birkaç reklam bloğu var, ancak harflerle çalışmaya müdahale etmiyorlar.

Uzun zaman önce bir mektup toplayıcı yaratan Yandex'e gelince, bu özel endüstrinin desteğinin nişanlanmadığı görülüyor, çünkü böyle basit bir işlevselliğin düzeltilmesi mümkün değil (çekmeceler için birden fazla imza ekleme yeteneği) Böyle güçlü bir arama motoru için zor değil. Bununla birlikte, Yandex, DNS sunucusundaki alanları bağlamanıza olanak sağlayan ve daha sonra posta oluşturmak ve yapılandırmak için zaten bir benzersiz işlevselliğe sahiptir. Ancak bu tür işlemler ve ayarlar için bilgi ve zaman gerektirir. Ve orada karmaşık bir şey olmamasına rağmen, her durumda, çoğu runet kullanıcısı için değil. Büyük avantaj - Yandex Mail arayüzünde reklam yok! Eksi - 10 posta kutusundaki harflerin kolektöründeki kısıtlama.

Finalist ve Kazanan - GOOGLE'DAN BİR KOLEKTÖRÜ, SUGESSİMİZE KOLAYOR, SUGESS 5 kutuda kısıtlama

Muhtemelen, uygulamamızda birçoğunuz, birçok kutudan posta toplama görevini karşıladı. Neden gerekli olabilir? Muhtemelen sistemler arasında veri alışverişi için evrensel bir mekanizma olduğundan. Mesaj yığınını uygulamak için SMTP, POP3, IMAP, Hazır çözümler uygulanan herhangi bir dil için birçok kütüphane (posta kutusunu çağırmayı zor buluyormuş gibi ...), vb.

Posta yoluyla birçok entegrasyon görevinin uygulanması şaşırtıcı değildir. Bu postanın nasıl hızlı bir şekilde toplandığını, sınıflandırılmasını ve gerekli eylemleri gerçekleştirdiğini bilen belirli bir hizmet vardır.

Aşağıdaki kodun aşağıda yeterli olduğu için - daha fazla okunamayabilir:

(VAR Müşteri \u003d Yeni POP3Client ()) (Client.Connect (Ana Sayfa, Port, False); Client.Authenticate (Kullanıcı, Şifre); VAR Count \u003d Client.GetMessageCount (); i \u003d 0; ben< count; i++) { Mail = client.GetMessage(i + 1); var cat = SortMail(Mail); DoSomething(Mail, cat); } }

Biz ne yaptık

Hemen bir dizi varsayım yapın:
1) Birkaç sistem için posta toplamanız gerekir. Belki gelecekte, birkaç için daha fazla. Ve yine de ... genel olarak, çözüm evrensel olmalıdır;
2) Posta çok olabilir - fıkra 1'den takip eder (ve aksi takdirde bu yazıyı yazmazdım);
3) Posta pars'a sahip olacak
4) Tüm servis kutuları - kullanıcılar oraya tırmanmazlar.

Ne kullanacağımız

Sistem 24/7 çalışmalı, bu yüzden Windows hizmeti biçiminde uyguluyoruz. Bu amaçlar için, derhal topsfelf kullanmayı öneriyorum.

Tabii ki, her şey paralel olmalı. Burada, favori tpl Dataflow kütüphanem sahneye geliyor.

Postayı POP3 ile alacağız. Bu görevdeki tüm "moda şeyler" imap gereksizdir - kaynak mektubu almak ve sunucuya silmek için mümkün olduğunca çabuk ve daha kolaydır. POP3 gözler için yeterli. OpenPOP.NET'i kullanın.

İsteğe bağlı olarak, Zabbix'te izlemeyi sabitleyin. (24/7 çalışmak ve övgüye değer bir hız vermek için toplandık - bunu takip etmeniz gerekir).

Git

Düzenli bir konsol uygulaması oluşturun. Bir Nuget Konsolu'nu açın ve gerekli tüm paketleri koyun:

Yükleme-Paketi NLOG yükleme-paketi OpenPOP.NET Yükleme-Paketi TopOSF Kurulum Paketi Microsoft.Tpl.Dataflow
Proje klasörüne gidin, bir app.debug.config ve app.Release.config oluşturun. Studio'dan bir proje yükleyin, kodunu açın (burada ve ardından TopCrawler.csproj). Yapılandırma ile bölümü ekleyin.

Yapılandırma

App.config App.config


Ve MSBUILD için alt hedef:

Hedefi dönüştürün.

$ (Targetfilename) config


Şahsen, tam olarak bu şekilde kullandım - eski şekilde - ortamı ayırmak için yapılandırmaların dönüşümünü ekle.
Kolaylık sağlamak için güçlü bir şekilde yapılandırılıyor. Ayrı bir sınıf yapılandırmayı okuyacaktır. (Böyle bir çözeltinin teorik yönleri hakkında yorumlarda iletilebilir). Yapılandırmalar, günlükler, izleme - Singleton desenini uygulamak için harika bir neden.

Projede bir klasör oluşturun Aynı isim (bir sipariş olmalıdır). Inside 3 sınıf - config, logger, zabbix oluşturun. Bizim logger:

Ağaç kesicisi.

statik sınıf logger (olsun; özel set;) halka açık statik nlog.logger arşivi (olsun; özel set;) statik logger () (log \u003d logmanager.getlogger ("Global"); arşiv \u003d logmanager. GetLogger ("arşivleme"); ))


Zabbix ile izleme ayrı bir yazı hak ediyor, bu yüzden burada sadece ajan uygulayan bir sınıf bırakacağım:

Zabbix.

İsim alanı topcrawler.singleton (///

/// Singleton: Zabbix Gönderen Sınıfı /// Statik Statik ZabbixSender Gönderen (GET; Özel Set;) Statik Zabbix () (Gönderen \u003d Yeni ZabbixSender () (Config.zabbixServer, Config.zabbixport);)) Struct Zabbixitem (Genel Dize Ana Bilgisayarı; Genel Dize Anahtarı; Genel Dize Değeri;) Sınıf ZabbixSender (Dahili Struct Senditem (// Resharper Tutarsızlaştırılmayı Devre Dışı Bırak - Zabbix, Kısa Dize Dönüşü Anahtarı; Genel Dize Tuşu; Genel Dize Değeri; // Resharper Tesis Edilen Tespitler; Ortak dize yanıtı; halka açık dize bilgisi;) #pragma uyarı geri yükleme 0649 #Region --- Sabitler --- halk const string defaultheader \u003d "zbxd \\ x01"; halk const string sentrequest \u003d "Gönderen verileri"; halk const Int DefaultTimeout \u003d 10000 ; #EndRegion #Region --- alanlar --- Özel okunik olarak Datetime _dtunixmintime \u003d datetime.specififyind (Yeni DateTime (1970, 1, 1), datetimekind.utc); özel okuması int _timeout; Özel Repetonly String _zabbixserver; Özel okuması int _zabbixport; #endRegion #Region --- Yapıcılar --- Public ZabbixSender (String ZabbixServer, Int Zabbixport): Bu (ZabbixServer, Zabbixport, DefaultTimeout) () Public ZabbixSender (String ZabbixServer, Int Zabbixport, INT Zaman Aşımı) (_zabbixserver \u003d zabbixserver; _zabbixport \u003d zabbixport; _timeout \u003d zaman aşımı;) #endRegion #Region --- Yöntem --- Halk string SendData (Dönüş SendData (Yeni Liste) (1) (ITM)); ) Ortak string senddata (liste Lstdata) (TRY (var serializatör \u003d yeni javascriptserierizer (); var değerleri \u003d yeni liste (lstdata.count); Değerler.adrange (Host \u003d itm.host, tuşu \u003d iTM.key, değer \u003d itm.value, clock \u003d math.floor ((datetime.now.touniversaltime () - _dtunixmintime). Totalseconds) .Tostring (cultureinfo.invariantculture))) )); var json \u003d serializer.Serialize (Yeni (istek \u003d sentrequest, veri \u003d değerler.toarray ())); var header \u003d encoding.ascii.getbytes (DefaulTheader); var uzunluğu \u003d bitConverter.getbytes ((uzun) json.length); var data \u003d encoding.ascii.getbytes (json); Var paketi \u003d yeni bayt; Arabellek.blockCopy (başlık, 0, paket, 0, başlık. Uzun boylu); Arabellek.blockcopy (uzunluk, 0, paket, başlık. Uzunluğu, uzunluğu. Uzunluğu); Arabellek.BlockCopy (veri, 0, paket, başlık. Uzun boylu + uzunlukta. Uzun boylu, veri. Uzun boylu); Kullanımı (var soketi \u003d yeni soket, SOCKETTYPE.Stream, ProtocolType.tcp)) (_zabbixserver, _zabbixport); Socket.send (paket); // başlık var arabellek \u003d yeni bayt; alacaklar (soket, tampon, 0, tampon. , _timeout); eğer (DefaulTheader! \u003d encoding.ascii.getstring (Tampon, 0, Buffer.Length)) Yeni İstisna ("Geçersiz Başlık"); // Mesaj Uzunluğu Tamponu \u003d Yeni Bayt; Alacaklar (Soket, Tampon, 0 , Buffer.length, _timeout); var datalength \u003d bitConver.Toint32 (Tampon, 0); eğer (Datalength \u003d\u003d 0) Yeni İstisna ("Geçersiz Veri Uzunluğu"); // Mesaj Buffer \u003d Yeni Bayt; Alacaklar (Soket, Tampon, 0, buffer.length, _timeout); var yanıtı \u003d serializer.deyeSerialize (Encoding.Astii.getString (Tampon, 0, Buffer.Length)); İade string.format ("Yanıt: (0), bilgi: (1)", yanıtı.Response, response.info); )) Yakalamak (istisna e) (iade string.format ("istisna: (0)", e);)) Özel statik boşluk alacak (soket pobjsocket, byte tamponu, int ofset, int boyutu, int zaman aşımı) (var starttickCount \u003d Çevre.tickcount; var aldı \u003d 0; yapmak (eğer (çevre.tickcount\u003e starttickcount + zaman aşımı) yeni timeoutexception (); deneyin (alındı \u200b\u200b+ \u003d pobjsocket.Receive (Tampon, Ofset + Alınan, Boyut - Alınan, SoketFlags.None) ;) Catch (SocketException EX) (if (ex.Socketetercode \u003d\u003d socketerror.wouldBlock || ex.SocketErrorCode \u003d\u003d SocketError.IOPENTERORCODE || ex.SocketErrorCode \u003d\u003d socketError.NobufferspaceAvaVaVailable) iplik.Sleep (30); atması;) ) İken (alındı)< size); } #endregion } }


Konfigürasyonlar ... En azından ilginç bir şey yapmanın zamanı geldi. İlk olarak, yapılandırmalarda röportaj yaptığımız kutuları saklayacağız. İkinci DataFlow ayarlarında. Öneririm:

Configings



Öyleyse, bağlı olduğu ana bilgisayar ve bağlantı noktası, kullanıcı ve şifre - her şey burada açık. Başka bir kutu türü. Hizmetin pazarlama (diğer bölümlerin yanı sıra) tarafından kullanıldığını varsayalım. Otomobillerin postalara düşeceği ve FBL spam raporlarının bulunduğu çekmeceler var. Kutunun kendisi zaten bir mektubu kategorize edilmiştir, bu nedenle bu durumlar için hemen kutu türünü belirtin. DataFlow ayarlarıyla, nesneleri oluşturmaya başladığımda daha da açık olacaktır. Burada, Yapılandırma'da kendi bölümlerimiz olacak. El Kitapları Heap Nasıl Yapılır, bu yüzden sonucu gösterdim:

Tipleri tanımlıyoruz

#REGION --- Tip --- Statik Sınıf PostaBoxtype (Halk Const String Bo \u003d "Bo"; Toplu Const String CRM \u003d "CRM"; Halk Const String Fbl \u003d "FBL"; halk Const String Bounce \u003d "sıçrama";) Class PostaBoxInfo (Genel Dize Tipi (GET;) Genel Dize Ana Sayfa Adamı (Get; Set;) Public Dize Kullanıcı (Get; Set;) Public Dize Şifresini (Get; Set;) Public Int Limanı (Get; Set;)) Class DataBlockOptions ( Almak; ayarlamak;) kamu int nouseddedcapacity (get; set;) Halk DataBlockOptions () (maxdop \u003d 1; bountedcapacity \u003d 1;)) #endRegion


Bölümleri oluştur

///

/// Custom Config Bölümü /// Public Sınıf GümrüksettingsConfigSection: ConfigurationSection (Halkın Kredi Bilgisi İsteğe Bağlantısı Kredi Başkanı (Get (iade üss (iade üssü ["CreadentialShlist"] Kimlik BilgileriKollection olarak;)) Kamu DataBlockOptionScollection DataFlowOptionSitems (GET (iade üss ["DataflowoptionStistist"] DataBlockOptionScollection;)))


///

/// Özel Koleksiyon - Kimlik Bilgileri Listesi /// Kamu sınıfı kimlik maddesi özelliği: ConfigurationElementCollection, IEnumerable (Korumalı Geçersiz Kılma ConfigurationElement CreateNewelement () () (Yeni CreederalitySelement ()) Korumalı Korumalı Geçersiz Kılma Nesnesi GetElementkey (ConfigurationElementSelementSelementSelement) (iade ((((((((creadentialSelementSelement) öğesi). Kullanıcı adı;) Kamu Kredi BilgisiSeleme BU ((RETURNE BASEGET (DISINGE) KREDİSİSİSELİBİSİSİSELİBİ) ) Kamu yeni ienumerator < Count; i++) { yield return BaseGet(i) as CredentialsElement; } } } /// /// özel kimlik bilgileri maddesi /// Kamu sınıfı kimlik bilgileri: ConfigurationElement (iade üss ["Ana Sayfa] dizesi olarak;)) Public Dize Kullanıcı Adı (Dönüş üssü [" kullanıcı adı "] Dize olarak;)) Public Dize Şifresi (Geturn Base [" şifre "] dize olarak;) Dize Türü (GET (Dönüş Tabanı ["Tipi"] Dize olarak;)) Popüler Dize Bağlantı Noktası (Dönüş tabanı ["bağlantı noktası"] dize olarak;))) /// /// Özel Koleksiyon - DataBlock Seçenekleri Listesi /// Kamu Sınıfı DATABLOCKOPTIONScollection: ConfigurationElementCollection, IEnumerable (Korumalı yüzdesel ConfigurationElement CreateNewElement () (), yeni DataBlockOptionsElement (return;) korumalı geçersiz kılma amacı GetElementKey (ConfigurationElement elemanı) (dönüş ((DataBlockOptionsElement) eleman) .Name;) halka CredentialsElement bu (olsun (dönüş BaseGet CredentialsElement olarak (indeks)) ) Kamu yeni ienumerator GetEnumerator () (için (var i \u003d 0; ben< Count; i++) { yield return BaseGet(i) as DataBlockOptionsElement; } } } /// /// Özel DataBlock Seçenekleri Ürün /// Kamu Sınıf DataBlockOptionSelement: ConfigurationElement (Kamu Dize Adı] AS String;)) Kamu Dize MAXDOP (İade Tabanı [MAXDOP] AS String;)) Kamu Dize BoundedCapacity (Geturn Tabanı [ "BoundedCapacity"] OLARAK dize;)))


Config'in tam bir uygulamasını yazmayacağım, orada eklenmemiz gereken parametreleri geliştirme sürecinde ima edilir.

Özel ayarlarımız şöyle okunacaktır:

hazır

kamu listesi. CreedalityShlist (olsun; özel set;) Public Sözlük DataflowoptionSlist (GET; özel set;) ... statik config () (deneyin (var customconfig \u003d (customettingsconfigsection) ConfigurationManager.getSection ("customettings"); // posta kutuları foreach (customconfig.credentialitems) (var öğesi) alectionalslist.add ( Yeni PostaBoxInfo (HostName \u003d item.hostname, port \u003d convert.toint32 (item.port), user \u003d item.username, type \u003d item.type, password \u003d item.password); // DataFlow Ayarları Foreach (var öğesi customconfig.dataflowoptionsitems) dataflowoptionslist.add (item.Name, yeni datablockOptions (Maxdop \u003d Convert.Toint32 (item.maxdop), BoundCapacity \u003d Convert.Toint32 (item.boundcapacity)));) Catch (İstisna EX) (logger.log. Ölümcül ("Konfigürasyon Okuma: (0)", Ex.Message); atmak;)))


Her nasılsa çok uzun süreli ve biz en ilginç olanlara bile ulaşamadık.

Torsefelf, performans sayaçlarından, veritabanıyla iletişim yoluyla eşleşmeyi indirin ve noktaya çevirin! Bir paletli sınıfı oluşturun - çekirdek. Başlamak için posta oku:

Özel uçucu bool _stoppipeline; ... genel boşluk başlangıcı () (do (var getmailsks \u003d _config.credentialslist.Select (((kimlik bilgileri \u003d\u003e task.run ((() \u003d\u003e GetAmails (kimlik bilgileri)). Tolist (); foreach (getmailstasks'ta var görevi) Görev .wait (); thread.sleep (2000);) iken (! _Stoppipeline); // Boru Hattı - Tüm son noktaları tamamlamak için bekleyin // ise eğer konveyör (_Stoppipeline) logger.log. uyar ("boru hattı kullanıcı tarafından durduruldu");)
Burada, Lena kendi aldı ve rahatsız etmemeye karar verdim - yaklaşık 20-30 kutuları her görev için kullanılabilir ve akışın sayısı hakkında buhar yapmaz. (Domates atmanıza izin veriyorum.)

Okumaya git:

Özel Void GetAmails (PostaBoxInfo Info) (Deneyin (Kullanma (Kullanma (Var Client \u003d New Pop3Client ()) (
Hemen, kutuya erişim zamanlamalarını göz önünde bulundurun - ağ teşhisi ve sunucu iş yükü için kullanışlıdır.

// Zabbix Metrics'ü Get VAR Stopwatch \u003d Yeni Kronometre (); stopwatch.start (); // Posta Sayımı Client.Connect'i alın (info.hostname, info.port, false); Client.authenticate (info.user, info.password); stopwatch.stop ();
Zabbix'e veri gönderiyoruz. Her şey basittir - Ana bilgisayar adını (Zabbix'e giderken), anahtar (tekrar Zabbix'te olduğu gibi) ve bir dize değeri belirtin.

// adresini gönderin zabbix.sender.senddata (Yeni Zabbixitem (Host \u003d Config.Hostkey, Tuş \u003d Info.Type + config.timingkey, değer \u003d stopwatch.elapsedmilliseconds.tostring ())); Logger.log.debug ("Gönder [(0)] Zabbix'e zamanlama:" (1) "ile" (2) ", zamanlama (3) MS", info.type, info.hostname, info.user, stopwatch.elapsedmilliseconds); var sayımı \u003d client.getMessageCount (); eğer (sayım \u003d\u003d 0) geri dönüş; Logger.log.debug ("Biz" "(1)", sayım, info.user'da yeni (0) mesajları aldık); // Mesajları sıralama bloğuna (var i \u003d 0; i) gönderdik.< 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);
Bir paletli sınıfı oluştururken DataFlow boru hattı oluşturulacaktır. İlk aşamamızın mektubu sıralamak olduğuna inanıyoruz.

Süre (! _Sortmaildatablock.post (mailinfo)) iplik.Sleep (500);
Konveyörün ne kadar basit olduğunu görün. Diğerleri, postaları okumak, mesajları birer birer atmak. Blok meşgulse, posta yanlış döner ve biz ücretsiz olana kadar bekleyeceğiz. O zaman daha sonra şu anki çalışmaya devam ediyor. Endişesiz paralelliği aradım.

Mesaj konveyöre gitti, şimdi ham arşivde sakin bir ruhla kaydetmek mümkündür (evet! Okuduğumuz her şey - dosya arşivine kaydedin. Destek hizmeti sonra daha sonra teşekkür ederim).

Örneğin, arşivin dönüşünü yapılandıralım:

Nlog.config



O zaman logstash'ı yükseltebilirsin, ama bu başka bir hikaye ...

// Her postayı arşiv logger.log.debug ("Arşiv mesajı") için kaydedin; Logger.archive.info (fonksiyonlar.MessageTostring (mailinfo.mail)); ) Yakalamak (istisna eki) (logger.log.Error ("ayrıştırma e-posta hatası: (0)", ex.Message); fonksiyonlar.Errorscounters.increment (); // Anyway logger.log.debug ("Arşiv mesajı) "); Logger.archive.info (encoding.default.getstring (Client.getMessageAsbytes (i + 1)));) Eğer (_config.deeteMail) Client.DeletEmessage (i + 1); if (_stoppipeline) kırıldı; ) Logger.log.debug ("" (0) ", info.user ile yapıldı); )) Yakalamak (istisna örneği) (logger.log.Error ("Genel Hata - Tip: (0), Mesaj: (1)", Ex, Ex.Message); fonksiyonlar.errorscounters.increment ();)))
Burada statik hata sayaçları kullandık (kutuların türleri bağlamında), burada hata yapanlar:

Halka açık sözlük HatalarCounters \u003d Yeni Sözlük ();
Ve sayaçların kendileri böyle yapılabilir:

Karşı.cs.

sınıf sayacı (özel uzun _counter; kamu sayacı () () () () () () () () () () () (interloked.increment (ref _Counter);) halkın uzun okuma () () (dönüş _) (döndürülmüş) (döndürülmüş) .Exchange (ref _counter, 0);) halka açık boşluk ekle (ref _Counter, değer);) halk void set.exchange (ref _Counter, değer);)))


Konveyörün oluşturulmasına dönüşelim. Diyelim ki, otomatik ototların RAWD olduğu çekmeceler var. Bu tür harfler boyanmalıdır (hangi posta listesine, vb. Tarafından, hangi posta listesine, vb.) Depodaki (veritabanı) içindeki sonucu katlayın. FBL raporlarının düştüğü kutular olduğunu varsayalım. Bu tür harfler derhal veritabanına ekleyin. Diğer tüm harfler "yararlı" olarak kabul edilir - Spam'da kontrol edilmeleri ve örneğin CRM'ye harici sisteme gönderilmeleri gerekir.

Daha önce anlaşıldığınız gibi, bu örnek esas olarak pazarlama görevleri için kollektörün uygulanması göz önüne alındığında - posta teslimatı, spam bilgilerinin istatistiklerinin toplanması.

Yani, iş akışına karar verdik. Paletli sınıfındaki gerekli blokları ilan ediyoruz:

Class MessageInfo (GET; Halk Bool ISSpam (Get; Set;) Genel Dize Alt tipi (GET; SET;) Genel Dize Alıcısını (Get; Set;) Genel MessageType Tipi (Get; Set;) Public PostaBoxInfo Posta Kutusu (GET; SET;) ) Class Crawler (// Boru Hattı Özel DönüştürBlock _Sortmaildatablock; Özel transformblock. _SpamFilterDatablock; Özel transformblock. _CheckBouncedatablock; Özel transformblock. _identifydatablock; Özel actionblock. _AddTocrmdatablock; Özel actionblock. _Addtofbldatablock; Özel actionblock. _addtobouncedatablock; ...
Bir başlatma yöntemi oluşturun ve bir konveyör blok oluşturun (blokları başlatmak için, harika bölümlerimizi yapılandırmalardan kullanırız):

Halka Açık Void Init () (// *** Boru Hattı Oluştur *** // Mesaj Tipini Olmak İçin DristmBlock Oluşturun Var BlockOptions \u003d _Config.getDatablokOptions ("_ SortMaildatablock"); _Sortmaildatablock \u003d Yeni Transformblock (Mail \u003d\u003e SortMail (Posta), yeni yürütmedataflowblockOptions (MaxDeGreeOfParallelism \u003d BlockOptions.maxdop, BoundCapacity \u003d BlockOptions.BoundCapacity); // spam blockoptions filtrelemek için transformblock oluştur \u003d _config.getdatablokoptions ("_ spamfilterdatablock"); _SpamFilterDatablock \u003d Yeni transformblock (Posta \u003d\u003e FilTersPam (Posta), yeni yürütmedataflowblockOptions (MaxDegreeOfParallism \u003d BlockOptions.maxdop, SoundedCacity \u003d BlockOptions.boundCapacity); // Bounes BlockOptions'u sıralamak için TransformBlock Oluştur \u003d _config.getdatablocoptions ("_ checkbouncedatablock"); _CheckBouncedatablock \u003d yeni transformblock (Posta \u003d\u003e Bouncetypecheck (posta), yeni yürütmedataflowblockOptions (MaxDegreeOfParallelism \u003d BlockOptions.maxdop, BounedCapacity \u003d BlockOptions.boundCapacity); // Sıçrama sahibi BlockOptions \u003d _config.getdatablockOptions ("_ identifydatablock"); _identifydatablock \u003d yeni transformblock (Posta \u003d\u003e GetRecipient (posta), yeni yürütmedataflowblockOptions (MaxDegreeOfParallelism \u003d BlockOptions.maxdop, BoundCapacity \u003d BlockOptions.boundCapacity); // CRM BLOCKOPTIONS'a posta göndermek için Actionblock oluşturun \u003d _config.getdatablokpsiyonlar ("_ AddTocrmdatablock"); _ADDTOCRMDATABLOCK \u003d Yeni ActionBlock (Posta \u003d\u003e AddTocrm (posta), yeni yürütmedataflowblockOptions (MaxDegreeOfParallism \u003d BlockOptions.maxdop, SoundedCapacity \u003d BlockOptions.boundCapacity); // posta göndermek için ActionBlock'u oluşturun. _ADDTOFBLDATABLOCK \u003d Yeni ActionBlock (Posta \u003d\u003e AddTofbL (Posta), yeni yürütmedataflowblockOptions (MaxDegreeOfParallelism \u003d BlockOptions.maxdop, SoundedCapacity \u003d BlockOptions.boundCapacity); // Posta noktasına zıplama göndermek için ActionSblock oluşturun \u003d _config.getdatablocoptions ("_ addtobouncedatablock"); _AddTobouncedatablock \u003d yeni actionblock (Posta \u003d\u003e AddToBounce (Posta), yeni yürütmedataflowblockOptions (MaxDegreeOfParallism \u003d BlockOptions.maxdop, BoundedCapacity \u003d BlockOptions.boundCapacity);
Konveyörü şemamıza göre toplayın:

// *** Boru Hattı inşa *** _Sortmaildatablock.Linkto (_spamfilterdatablock, info \u003d\u003e info.type \u003d\u003d messageType.General); _Sortmaildatablock.linkto (_addtofbldatablock, info \u003d\u003e info.type \u003d\u003d messageType.fbl); _Sortmaildatablock.Linkto (_checkbouncedatablock, info \u003d\u003e info.type \u003d\u003d messageType.Bounce); _Sortmaildatablock.Linkto (Dataflowblock.NullTarget. (), bilgi \u003d\u003e info.type \u003d\u003d messageType.unknown); / * Saplama * / _CHECKBOUNTABLOCK.LINKTO (_IDIDIDYDATABLOCK); _identifydatablock.linkto (_addtobouncedatablock); _Spamfilterdatablock.linkto (_addtocrmdatablock, info \u003d\u003e! İnfo.isspam); _Spamfilterdatablock.linkto (Dataflowblock.NullTarget. (), bilgi \u003d\u003e info.isspam); / * Taslak * /
Gördüğünüz gibi, her şey son derece basittir - bloğu aşağıdakilerle ilişkilendiririz (bağlantı durumunu ayarlama olasılığı ile). Tüm bloklar paralel olarak yürütülür. Her birimin bir dereceye kadar paralellik derecesine ve bir kap vardır (tankı kullanarak, sırayı bloktan önce ayarlayabilirsiniz, yani, birim mesajı kabul edilir, ancak henüz devam etmiyor). Böylece, "karmaşık" ve mektubun içeriğinin ayrıştırılması gibi uzun işlemler için yüksek derecede paralellik yapmak mümkündür.

Matchaw Dataflow'u tarif etmeyeceğim, TPL Dataflow kaynağındaki her şeyi okumak daha iyidir..

SortMaildatablock.Copling.continuewith (t \u003d\u003e (iFataflowblock) ((iDataflowblock) .fault (t.Exception); else _spamfilterdatablock.complete ();)); _sortmaildatablock.com.continuewith (t \u003d\u003e (ifataflowblock) _addtofbldatablock) .fault (t.Exception); else _addtofbldatablock.complete ();)); _sortmaildatablock.cking.continuewith (t \u003d\u003e (ifataflowblock) .fault (t.exception); else _checkbouncedatablock.complete ();)); _Spamfilterdatablock.complettion.continuewith (t \u003d\u003e (eğer ((t.isfaulted) ((((t.exception) .fault (t.Exception); else _addtocrmdatablock.complete ();)); _Checkbouncedatablock.complettion.continuewith (t \u003d\u003e (iFataflowblock) ((iDataflowblock) .fault (t.exception); else _identifydatablock.complete ();)); _identifydatablock.com.continuewith (t \u003d\u003e (ifataflowblock) _addtobouncedatablock) .fault (t.Exception); else _addtobouncedatablock.complete ();)); )
Her şey, aslında, konveyör zaten çalışıyor, mesaj gönderebilirsiniz. Sadece başlangıç \u200b\u200byöntemimizi eklemesini durdurmak için kalır:

Başlat.

kamu Void Başlat () (DO (var GetMailSks \u003d _config.credentialslist.select (() \u003d\u003e getmails (() \u003d\u003e getmails (())) ToList ();. Foreach (GetMailSks Var Görev) task.wait () ; Thread.Sleep (2000); // Dur Boru Hattı - Tamamlanma bekleyin tüm uç noktaları _sortmaildatablock.complete ait ();;) (_Stoppipeline) iken! _addtocrmdatablock.completion.wait (); _addtofbldatablock.comtenance.wait (); _AdDTOBOUNCEDATABLOCK. Tamamlama.wait (); eğer (_stoppipeline) logger.log.warn ("boru hattı kullanıcı tarafından durduruldu");)


Delegelere git.
Sıralama ... Şey, hepimizin var olduğunu söyleyelim (komplike, sonra daima karmaşıklık için zamanımız var):

Özel MessageInfo Sortmail (MailBoxType.CRM: Mail.Type \u003d MessageType.General; Molası; Vaka MailboxType.Bounce: Mail.Type \u003d MessageType.Bounce; Molası; Vaka MailBoxType FBL. Mail.Type \u003d MessageType.fbl; Molası;) Dönüş Posta;)
Spam filtresi. Bu ev ödevinde - spamassassin kullanın.
İşte bir delege:

Özel MessageInfo Filtspam (MessageInfo Mail) (// TODO: SpamAssassin Mantıka Dönüş Posta Ekleyin;)
Ve API spamassassin ile çalışmak için sınıflar (projeye bağlantı).
Ve biz harflerin ayrılmasına gidiyoruz. Parsim biz oto otomobiliz. MEF işine geliyor.
Eklentilerimiz için arayüzlere sahip bir proje (DLL) oluşturun (hadi arayüzleri arayalım).
Bir arayüz ekleyin:

Halka açık arayüz icondition (dize kontrolü (mesaj mimemessage);) Genel arayüz Iconditionmetadata (Tip Tipi (GET;))
Ve herşey. Bizim TopCrawler bu projeye bağlıdır ve eklentilerle olan proje de kullanacaktır.
Yeni bir proje oluşturun (ayrıca DLL), Hadi koşulları arayalım.
Answan türleri ekleyin:

#region --- Çeşitleri --- statik sınıf BounceType (kamu const dize Tam \u003d "BounceTypeFull"; kamu const dize Zaman Aşımı \u003d "BounceTypeTimeout"; \u003d "BounceTypeRefused" reddetti kamu const dize, kamu const dize NotFound \u003d "BounceTypeNotFound"; kamu Const String Inactive \u003d "BouncetypeINActive"; Toplu Const String Outofoffice \u003d "Bouncetypeoutofoffice"; Public Const String HostNotfound \u003d "BouncetypeHostnotfound"; "Bouncetypenotauthorized"; "BouncetypenTyuthorized";) "Bouncetypemanynectionnections";) #endRegion
Ve arayüzümüzü uygulayan sınıflar:

Kamu sınıfı durumsuzluk1: Simge Mimemessage (eğer (! Mimemessage.MessagePart.ismultipart) NULL; Const String Desen \u003d "Teşhis Kodu :. + SMTP. + 550"; VAR REGEXP \u003d Yeni Regex (Desen, RegExOptions.ignorecase); geri dönüş Mimemessage.MessagePart.MessageParts.Any (Parça \u003d\u003e part.contenttype.mediatype \u003d\u003d "Mesaj / Teslimat Durumu" && regexp.ismatch (part.getbodyastext ()))? Bouncetype.Notfound: null;) ... halk Sınıf KoşulluTüm2: icondition (iade bouncetype.timeout;) ...
Niteliklerde tüm durumun fark ederken. Eklentileriyle birlikte yüklenecektir.
Projemize geri dönün ve eklentileri yükleyin:

Class Crawler (... // eklentileri halka açık iInumerable \u003e Bouncetypeconditions (Get; Set;) Özel VoD Loadplugins () (TL (VAR Container \u003d New CompoutionContainer (Yeni DizinCatalog (_config.plugindirectory); container.composeparts (bu);) Catch (İstisna EX) .Error ("Eklentiler yüklenemiyor: (0)", Ex.Message);)) ...
LoadPlugins sınıfımızın tasarımcısını çeker. İndirme mekanizması hakkında ayrıntılı bilgi edinmeyecek - Google daha iyi baş edecek.

Delege kontrol tipimize sıçramaya gidin. Koşullar ilk işe yarayacak kadar sırayla uygulanacak - özel yöntem:

ÖZEL MESAJIFO BOUNCETYPECHECHECK (TL (VAR Res \u003d Crima.Value.Check (Mailinfo.mail); eğer (res \u003d\u003d null) devam eder; mailinfo.subtype \u003d res; logger.log .debug ("Sıçrama tipi koşulu [(0)] Mesaj için tetiklenen [(1)] ", crimred.metadata.type, mailinfo.mail.headers.messageID); Break;)) Yakala (İstisna EX) (Logger.log .error (" Mesaj için sıçrama türü belirlenemedi " (0) ": (1)", mailinfo.mail.headers.messageId, ex.Message); logger.Errorscounters.increment ();) Mailinfo iade;)
Böylece, eğer yeni bir mantık, arayüzümüzü uygulayan eklentilerle projeye yeni bir sınıf eklemek için yeterli görünüyorsa ve - Voila! Mektubun gönderenini tanımlamak için ikinci eklentinin bir örneği geçerli değildir - bu yüzden zaten uzun bir yazı (otomatik cevap sunucuyu oluşturur, böylece gönderici harfin başlıklarından da boyanmalıdır).

Veritabanındaki sonuçların kaydedilmesiyle de olağandışı bir şey yok. Örneğin, şöyle:

Özel Void AddTobounce (MailWh.Bounceadd (Posta); Functions.ProcessedCounters.Increment (); Functions.log.debug () "Mailwh için Bounce gönder";) (Exception Catch EX) (Functions.log Hata ( "Hata Tasarruf Bounce. "(0)" PostaNWH: (1) ", mail.mail.headers.MessageID, eski .Message); fonksiyonlar.errorscounters.increment ();)))

Bounceadd.

kamu Statik Uzun Bounceadd (VAR CONN \u003d new SqlConnection (ConnectionString) (VAR CMD \u003d New SqlDataAdapter ( "Bounceadd", Conn)) (var gövde \u003d message.mail.findfirstPlainTextVersion () \u003d\u003d NULL? Message.mail.findfirsstmlversion Kullanma () .. getbodyastext (): message.mail.findfirstPlainTextVersion () getbodyastext (); var Outid \u003d Yeni SqlParameter ( "id @", sqldbtype.bigint) (Yön \u003d ParameterDirection.Output); cmd.selectcommand .CommandType \u003d CommandType.StoredProcedure; (Rawmessage, message.mail.rawmessage) 'yeni SqlParameter () cmd.selectcommand.parameters.add; cmd.selectcommand.parameters.add (() Gövde, "Mesaj @ yeni SqlParameter) cmd.selectcommand.parameters.add (yeni SqlParameter (message.mail.headers.subject, "subjecters @" ?? "")); cmd.selectcommand.parameters.add (yeni SqlParameter (@ MessageID", message.mail .Headers.MessageID ?? "")); cmd.selectcommand.parameters.add (yeni sqlparameter ("@ addressto", mesaj.mail.headers.to.address ?? "")); cmd.selectcomm and.parameters.add (Yeni Sqlparameter ("@ AddressFrom", Message.mail.headers.From.address ?? "")); cmd.selectcommand.parameters.add (yeni sqlparameter ("@ dateencieved", datetime.now); cmd.selectcommand.parameters.add (yeni sqlparameter ("@ bouncetypesyname", (nesne) mesajı.Subtype ?? dbnull.value)); cmd.selectcommand.parameters.add (yeni kaynak, (@ sourcefrom ", (nesne) mesajı.Recipient ?? dbnull.value); // TODO: Listid Destek Ekle cmd.selectcommand.parameters.add (Yeni SQLParameter ("@ Listid", dbnull.value); cmd.selectcommand.parameters.add (anut); conn.open (); cmd.selectcommand.executenonquery (); Dön. ?? 0; ))


Üzgünüm, topsfelf'i göstermek için zamanım yoktu - direk ve çoktan şişmiş.

sonuç

Bu derste, posta toplama görevinin basit olmayabileceğini öğrendik. Geliştirilen çekirdek, mevcut mantığı etkilemeden veri blokları - DataFlow blokları hızlı bir şekilde eklemenizi sağlar. Eklenti alt sistemi, ayrıştırmanın komut dosyası benzeri mantığını hızlı bir şekilde artırmanıza ve veriflow'un kendisi tüm hesaplamaları paralelleştirmenize olanak sağlar (ve belirli bir makine için çoklu atılmayı esnek bir şekilde yapılandırma yeteneğine sahibiz). TOPSHELF, hata ayıklamayı kolaylaştırmak için hem servis modunda hem de konsol modunda hizmet çalıştırma yeteneğini bize veriyor.

Bence Gmail, e-posta ile çalışmak için en uygun web arayüzlerinden birine sahiptir. Sadece keyifli ve uygun bir arayüze ek olarak, yaratıcılar fonksiyonel parçayı unutmadılar. Elektrik zincirleri, çeşitli klasörler, filtreler vb. Oluşturma. Bütün bunlar Gmail'i dünyanın en popüler posta hizmetlerinden birini yaptı. Birçoğu, bir posta koleksiyoncusu olarak böyle harika bir fırsat hakkında bilmiyor. Örneğin, etki alanı adınızda bir veya daha fazla posta kutunuz var, ancak standart arayüz Webmail ve posta istemcileri sizinden memnun değil ( Mozilla Thunderbird, Microsoft Outlook, Yarasa). Bu durumda, posta toplayıcısını kullanabilir ve tüm postaları Gmail aracılığıyla işleyebilir, şimdi nasıl yapacağız.

  1. Gmail'deki bir hesap gereklidir, kayıt işlemi oldukça basittir ve düşünmek ve bununla uğraşmak zor olmayacaktır.
  2. Kayıttan sonra, Gmail'de ayarlara gitmeniz gerekir.
  3. Ayarlarda, "Hesaplar ve İçe Aktarma" öğesini seçin

  4. Bu bölümde, iki eşya ile ilgileniyoruz: "Mektupları şu şekilde gönder:" ve "Diğer hesaplardan gelen postaları kontrol edin (POP3'ü kullanarak):". "Diğer e-posta adresini ekle" ve "POP3 e-posta hesabınızı ekleyin" bağlantılarına sahiptirler.

  5. Başka bir posta kutusundan posta toplamak için, "POP3 e-posta hesabınızı ekle" ye tıklayın. Posta kutusunun adresini girmeniz ve "İleri" yi tıklamanız gereken yeni bir pencere görünür. Birkaç alandan sonra doldurmanız gerekir:
    Kullanıcı adı
    Parola
    POP Sunucu ve Bağlantı Noktası - POP sunucusu adresi ve postanın hangi postanın toplanacağı sunucuya bağlanmak için bağlantı noktası. Bu bilgiyi posta hizmetinizi desteklemek için bulabilirsiniz, genellikle "Soru-Cevaplar" bölümünde yayınlanır.
    Alınan harflerin kopyalarını sunucuda tutun - Onay kutusu yüklenmemişse, harf indirdikten sonra, bu harfler posta kutusundan kaldırılır. .
    Her zaman harflerin alındığında güvenli bir bağlantı (SSL) kullanın. - Posta servisiniz güvenli bir SSL bağlantısı kullanıyorsa, yüklemelisiniz.
    Gelen mesajların etiketini atayın - Etiket, bu mektubun yakınında görsel bir işarettir. Posta kutusunun bir mektubun gönderildiği anlayış için kullanımı uygundur.
    Arşiv Gelen harfleri (gelenleri atla) - Bu posta kutusundan toplanan harfler arşivlenecek, gelenlerinde olmayacak.

  6. Gmail'in belirttiğiniz posta kutusuna bir çek mektubu gönderdikten sonra "Hesap Ekle" yi tıklayın. Mektup kontrol etmek, link ve kod için iki seçenek seçer. Sadece gitmeniz gereken bağlantı ve kodu onay alanına yerleştirin. Bağlantıyı geçmek daha kolaydır, kod görünüşte açıkça sönerse, aniden bağlantı mektupta yanlış görüntülenecektir.
  7. Aslında, hepsi, şimdi Gmail'deki hesabımız otomatik olarak başka bir posta kutusundan mektup toplar. Aynı Gmail'i kullanarak bundan veya başka bir adresden yanıt vermesi gerekliyse, ayarlardaki "Diğer E-posta Adresini Ekle" bağlantısını tıklayın, alanları doldurun:
    "İsim:" - Adınız gibi herhangi bir veri girebilirsiniz.
    "E:" - Yanına cevap vereceğimiz posta adresini belirtin.
    Onay işareti "Sözde olarak kullanın. "- Bu adres, ana adresinizin bir takdirimi olarak kullanılacaktır ve bir harf gönderirken, Google'da "daha fazla ..." linkinde Google Yardımı'nda daha ayrıntılı olarak açıklanan şekilde görüntülenecektir.
    "Cevap" alanında başka bir adres belirtin (isteğe bağlı) - Varsayılan olarak, cevap gönderilecek aynı adrese gelir. Bağlantıya tıklayarak, bu adrese gönderilen harflerin gönderileceği başka bir posta kutusu belirleyebilirsiniz.
    "Daha fazla" ı tıklayın

  8. Sonra, doldurulması gereken birkaç alan daha görüyoruz.
    SMTP Sunucusu ve Bağlantı Noktası - Bu bilgiler posta hizmetinde bulunmalıdır.
    Kullanıcı adı - Genellikle bu bir e-posta adresidir, bu posta kutusuna erişmek için bir giriş.
    Parola - Posta kutusuna şifre erişimi.
    SSL kullanarak TLS (önerilen) ve güvenli bağlantı kullanarak korumalı bağlantı - İkinci seçenek (SSL) yalnızca posta servisiniz bu tür güvenli bağlantı kullanıyorsa seçilebilir. Temel olarak ilk öğeyi seçebilirsiniz.

    "Hesap Ekle" tıkladıktan sonra, posta kutusunun posta kutusunun eklenmesiyle analoji ile bir kontrol mektubu gönderilecektir. Onaylıyorum ve her şey hazır.

Aslında, hepsi, böylece harflerin montajını ve diğer kutulardan gelen cevabı Gmail üzerinden yapılandırabilirsiniz. Küçük nüans, diğer Gmail posta kutularından posta koleksiyonu programları, böyle bir posta kutusu için ayrı ayrıdır. Yani, posta kutusuna posta kutusuna gönderdiğiniz bir mektup, Gmail arayüzünde, hemen görüntülenmez, ancak yalnızca kontrol ettikten sonra görüntülenmez. Çekin periyodikliği, bu posta kutusuna mektup girmenin sayısına ve sıklığına, posta kutusuna, harfler daha sık gelir, doğrulama daha sık ortaya çıkacaktır. Bu parametreyi değiştiremezsiniz, ancak kontrolü ayarlara zorlayabilirsiniz.