نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی
  • خانه
  • ویندوز 10
  • نامه ها را از صندوق های پستی مختلف در یک حساب Gmail جمع آوری کنید. راه‌اندازی یک جمع‌آورنده ایمیل Gmail، دستورالعمل‌های گام به گام

نامه ها را از صندوق های پستی مختلف در یک حساب Gmail جمع آوری کنید. راه‌اندازی یک جمع‌آورنده ایمیل Gmail، دستورالعمل‌های گام به گام

امروزه اینها شاید محبوب ترین سرویس های ایمیل هستند. و زمانی که این یا آن منبع را در نظر می گرفتیم، گویی تصادفاً رزرو کردیم که آدرس پستی متفاوتی از سرویس دیگری را می توان به هر صندوق پستی متصل کرد.

از این گذشته ، همیشه راحت نیست که به هر صندوق پستی بروید و نامه خود را بررسی کنید. بنابراین، برای راحتی، امکان افزودن یک صندوق پستی به آدرس موجود ایجاد شد. سپس تمام نامه ها در یک مکان، در یک صندوق پستی جمع آوری می شود. امروز می خواهیم یاد بگیریم که چگونه مجموعه نامه های دیگر صندوق های پستی را سازماندهی کنیم.

بیایید با Mail ru شروع کنیم

چگونه یک صندوق پستی به Mail ru اضافه کنیم

سرویس پست الکترونیکی mail ru این امکان را فراهم می کند که یک صندوق پستی شخص ثالث را به صندوق پستی اصلی خود اضافه کنید.

به منظور افزودن صندوق پستی دیگر، به mail ru اکانت ایمیل اصلی خود بروید و روی آدرس خود در بالا سمت راست کلیک کنید.

و روی دکمه " برای افزودن یک صندوق پستی».

پس از وارد کردن داده ها، روی "کلیک کنید" وارد شدن».

در نتیجه اقدامات ما، پوشه ای با نام و نام خانوادگی ما ظاهر شد و نامه هایی از نامه Yandex در آنجا تحویل داده می شود. و دیگر نیازی به رفتن به صندوق پستی از Yandex برای بررسی نامه های جدید نخواهید داشت.

اکنون ما چیزی مشابه را در نامه Yandex انجام خواهیم داد.

چگونه یک صندوق پستی را به Yandex اضافه کنیم؟

برای افزودن یک صندوق پستی از سرویس پست دیگری در سیستم Yandex، ما همچنین به حساب ایمیل Yandex شما می رویم.

و روی نماد چرخ دنده کلیک کنید و مورد را انتخاب کنید " جمع آوری نامه از سایر صندوق های پستی».

به تنظیمات بروید" نامه جمع آوری کنید". اکنون یک صندوق پستی از mail ru اضافه می کنیم. ما جعبه ایمیل خود را وارد می کنیم، رمز عبور آن را وارد می کنیم و روی " کلیک می کنیم. شامل کلکسیونر»

در مرحله بعد، می توانید یک برچسب برای پیام ها با Mail تعیین کنید. تمام حروف از سرویس پست الکترونیکی به پوشه Inbox می رود. اجازه دهید حروف قدیمی به عنوان خوانده شده علامت گذاری شوند. سپس رمز عبور را دوباره وارد کنید و روی "کلیک کنید" ذخیره تغییرات».

تمام است، ما یک صندوق پستی اضافی را به نامه Yandex متصل کرده ایم. اگر در آینده دیگر نمی‌خواهید از صندوق پستی متصل نامه دریافت کنید، می‌توانید هر زمان که بخواهید آن را خاموش کنید.

به همین ترتیب می توانید جعبه های دیگری را اضافه کنید.

برای جابجایی بین کادر اصلی و اضافه شده، از منوی اصلی استفاده کنید، سپس کادر مورد نیاز خود را انتخاب کنید.

چگونه یک صندوق پستی به جیمیل اضافه کنم؟

ایمیل از Google همچنین اتصال 5 صندوق پستی اضافی را امکان پذیر می کند.

و مورد "" را انتخاب کنید

برو به برگه " حساب ها و واردات"و روی لینک کلیک کنید" اضافه کردن حساب ایمیل»

در پنجره جدید آدرس صندوق پستی را که اضافه خواهیم کرد وارد کنید. فشار می دهیم " دورتر».

سپس، به نوبه خود، رمز عبور صندوق پستی اضافه شده را مشخص کنید، سپس سرور POP را به تغییر دهید pop3.پست الکترونیکی. ru... کادری که مسئول نگهداری کپی نامه های دریافتی در سرور است را علامت بزنید. این شبکه ایمنی شما خواهد بود در صورتی که اتفاقی برای حساب Google شما بیفتد، نامه های شما در سرور ایمیل ru ذخیره می شود. برای راحتی تشخیص اینکه نامه به کدام صندوق پستی آمده است، یک میانبر به تمام نامه های دریافتی از mail ru اضافه کنید.

پس از آن ما " را فشار می دهیم اضافه کردن حساب».

در صفحه بعد، ما چیزی شبیه به آن را تغییر نمی دهیم، به جز اینکه می توانید درخواست خود را داشته باشید نام کاربری... رمز عبور صندوق پست را وارد کنید و روی "کلیک کنید" اضافه کردن حساب».

پس از آن، نامه ای با کد تأیید به صندوق پستی اضافه شده شما ارسال می شود. می توانید به دو روش تأیید کنید: پیوند موجود در نامه را دنبال کنید یا کد را از نامه کپی کنید و آن را در فیلد قرار دهید. کلیک " تایید».

اکنون تنظیمات تغییر کرده است. همانطور که در تصویر زیر می بینید، آدرس پستی اضافه شده ما ظاهر شده است که می توان آن را تغییر داد یا حذف کرد.

همچنین می‌توانید کادر پیش‌فرض mail ru را برای ارسال نامه‌ها با کلیک بر روی پیوند مناسب تنظیم کنید.

و اکنون نامه های صندوق پستی ru با موفقیت به صندوق گوگل رسیده است. همانطور که می بینید، همه حروف با برچسبی که در فرآیند افزودن صندوق پستی تنظیم می کنیم، مشخص می شوند.

و هنگام ایجاد یک نامه جدید، می توانید انتخاب کنید که از کدام صندوق پستی نامه را ارسال کنید.

همچنین، برای جمع آوری نامه ها در یک مکان، می توانید از برنامه های ویژه - مشتریان ایمیل استفاده کنید. محبوب ترین این است خفاش". اما این برنامه پولی است. در میان موارد رایگان - موزیلا تاندربرد... در مورد آن در وب سایت ما بخوانید.

همانطور که امروز توضیح دادیم، اگر از مشتریان ایمیل یا جمع‌آورنده نامه استفاده می‌کنید، در نظرات بنویسید.

بگذارید با این حرف را تمام کنم. با آرزوی موفقیت و موفقیت برای همه شما

ما باید تلاش نکنیم که همه ما را درک کنند، بلکه باید تلاش کنیم که نفهمیدن ما غیرممکن است.

آخرین بار من مجموعه ای از مقالات را در مورد جمع آوری نامه از چندین صندوق پستی مختلف، حتی در سرویس های مختلف، در یک صندوق پستی اصلی شروع کردم، که کاربر دائماً آن را نظارت می کند و برای او راحت تر است که تنها با او کار کند، نه اینکه همه چیز را بررسی کند. صندوق های پست خود را به طور جداگانه. در مورد نیاز به جمع آوری نامه و در مورد اجرای آن در سرویس GMail بیشتر بخوانید.

من این سری مقالات را تا کنون برای 3 مقاله در نظر دارم. امروز در مورد تنظیم مجموعه نامه در یک سرویس پستی به همان اندازه معروف - Yandex صحبت خواهم کرد.

جمع آوری نامه از سایر حساب های Yandex به راحتی مانند سایر سرویس ها تنظیم می شود.

روند تنظیم مجموعه نامه در Yandex.

برای اتصال توانایی جمع آوری تمام نامه های موجود در صندوق پستی Yandex خود از هر یک از حساب های خود در همان یا سایر خدمات پستی، ابتدا وارد حساب Yandex خود شوید که حساب اصلی خواهد بود. در آن است که نامه ها را از صندوق های پست دیگر جمع آوری می کنید.

بخش تنظیمات نامه را باز کرده و "Collect mail from other mailboxes" را انتخاب کنید.

می توانید نامه را از هر صندوق پستی که در هر سرویس پستی قرار دارد و نه تنها از نامه های خود که در همان سرویس Yandex قرار دارد جمع آوری کنید!

مثال برای این مقاله روند جمع آوری نامه ها از ایمیل Mail.ru را نشان می دهد.

آدرس ایمیل کامل را از جایی که نامه ها و رمز عبور را از آن جمع آوری می کنید وارد کنید و سپس روی "فعال کردن جمع آوری کننده" کلیک کنید.

اگر نام کاربری و رمز عبور صحیح را برای نامه مشخص کرده اید، در پنجره بعدی پیامی در مورد اتصال موفق ظاهر می شود و در اینجا می توانید تنظیماتی را برای جمع آوری حروف انجام دهید. به عنوان مثال، می توانید یک برچسب به حروف جمع آوری شده اختصاص دهید، و همچنین حروف قدیمی فوروارد شده را به صورت خوانده شده نمایش دهید. گزینه های مورد نیاز خود را علامت بزنید و سپس رمز عبور ایمیل دوم خود را دوباره در زیر وارد کنید و روی "ذخیره تغییرات" کلیک کنید. پس از 10 دقیقه، نامه ها شروع به جمع آوری می کنند.

در این پنجره تنظیمات، نمی توانید یک پوشه جداگانه برای جمع آوری نامه ها از صندوق پستی متصل انتخاب کنید. در ابتدا پوشه Inbox لیست می شود و تغییری نمی کند. این به این دلیل است که در ابتدا نامه ها با استفاده از پروتکل IMAP جمع آوری می شود و این پروتکل ساختار پوشه را به طور کامل از ایمیل متصل شما کپی می کند.

اگر 2 گزینه برای مرتب کردن نامه های جمع آوری شده در پوشه ها وجود دارد:

    تنظیمات مجموعه نامه را تغییر دهید و پروتکل POP3 را به جای IMAP (که در ابتدا تنظیم شده است) نصب کنید.

    فیلتر بعدی حروف را تنظیم کنید، یعنی شرایطی ایجاد کنید که در آن نامه های دریافتی با دور زدن "صندوق ورودی" به پوشه مورد نیاز شما برود.

گزینه دوم، به نظر من، به خصوص برای مبتدیان ترجیح داده می شود، تا در تنظیمات برای اتصال به ایمیل دیگر، زیر و رو نشوند.

اکنون همه نامه‌هایی که به نامه‌ای که متصل کرده‌اید می‌رسند در نامه فعلی، که نامه اصلی شماست، انباشته می‌شوند. و دیگر نیازی به رفتن جداگانه به نامه دوم برای بررسی حروف جدید در آن نیست.

چگونه می توان همه پیام های جمع آوری شده از نامه های متصل را به طور جداگانه مشاهده کرد؟

پس از افزودن نامه، یک میانبر با نام آن در سمت چپ زیر پوشه های حروف مشاهده خواهید کرد. مثال:

با کلیک بر روی این میانبر، تمام حروف صندوق پست متصل را به طور جداگانه مشاهده خواهید کرد.

چگونه می توانم تنظیمات را تغییر دهم یا مجموعه نامه های یک صندوق پستی خاص را غیرفعال کنم؟

اگر نیاز به تغییر در تنظیمات مربوط به جمع آوری نامه از صندوق پستی اضافه شده دارید، می توانید آن را در تنظیمات ایمیل Yandex از طریق بخش "جمع آوری نامه از سایر صندوق های پستی" انجام دهید.

اگر باید مجموعه نامه را غیرفعال یا دوباره فعال کنیداز یک جعبه متصل خاص، روی سوئیچ «روشن» کلیک کنید. / خاموش." در لیست جعبه های متصل

اگر نیاز به باز کردن تنظیمات مجموعه نامه دارید، روی نام کادر کلیک کنید، سپس روی پیوند "پیکربندی" که ظاهر می شود کلیک کنید. در نتیجه، همان پنجره تنظیمات مانند هنگام اتصال نامه باز می شود ().

نتیجه.

در پایان، می خواهم توجه داشته باشم که معمولاً در جمع آوری ایمیل در سرویس Yandex هیچ مشکلی وجود ندارد و نیازی به پیکربندی در ایمیل دوم (که به آن وصل می کنید) نیست. اما یک سرویس بسیار دمدمی مزاج به نام GMail وجود دارد :) هنگامی که آن را (نه تنها به Yandex، بلکه حتی به خودتان) متصل می کنید، اغلب مشکلاتی ایجاد می شود و این به دلیل افزایش امنیت این ایمیل گوگل است. نه، من بحث نمی کنم، ایمنی خوب است! اما گاهی اوقات به حد جنون می رسد، مثلاً وقتی Gmail اتصال به صندوق پست دوم GMail خودش را مسدود می کند و هر دو از یک رایانه و یک IP وارد شده اند :)) من در مورد چنین مشکلاتی در مورد اتصال ایمیل های Google صحبت خواهم کرد. در مقاله ای جداگانه

این مقاله بر روی «ایمیل از صندوق‌های پستی دیگر» و «جمع‌آوری نامه‌ها از سایر حساب‌ها» تمرکز خواهد کرد. بررسی خدمات پستی و مقایسه.

با به روز شدن عملکرد سرویس های پستی، اخباری را در پایان این مقاله منتشر خواهیم کرد.

سرویس ایمیل Mail.ru، موتورهای جستجوی Yandex و Google چندین سال است که عملکردهای بسیار مفید و ضروری را ارائه می دهند که به شما امکان می دهد تمام حساب های ایمیل دیگر را در یک ایمیل ترکیب کنید. به عبارت دیگر، ارزش آن را دارد که یک بار تمام «ایمیل‌های» خود را اضافه و پیکربندی کنید و مدیریت آن‌ها در یک پنجره بدون وارد کردن نام کاربری و رمز عبور دائمی امکان‌پذیر خواهد بود.

سرویس‌های پستی فضای ذخیره‌سازی عظیمی را برای همه ایمیل‌های دریافتی، یک رابط کاربرپسند، عملکرد مدیریت خوب و موارد دیگر به ما ارائه می‌دهند. برای آزمایش قابلیت‌های سرویس‌های پستی فهرست‌شده، ما سه پارامتر را برای ارزیابی کار آنها برجسته می‌کنیم: 1) لازم است حساب‌های ایمیل مختلف، از جمله از سرویس‌ها و سایت‌های مختلف، از طریق یک سرویس گیرنده ایمیل مدیریت شود. 2) برای هر نامه یک امضا و نام شخصی داشته باشید. 3) حروف را از سرورهای آن دسته از حساب های ایمیلی که به ایمیل، yandex یا google mail اضافه شده اند حذف کنید.

وظیفه ما به این صورت است:

پس بیایید شروع کنیم. ما اولین نفری هستیم که این سرویس را از Mail.ru آزمایش می کنیم، که به ما می گوید: "شما می توانید نامه ها را از تمام صندوق های پستی خود در یک صندوق پستی در Mail.ru جمع آوری کنید.

مجموعه ای از ایمیل ها را از هر سروری با استفاده از پروتکل IMAP یا POP3 پیکربندی کنید. برای افزودن ایمیل خارجی به غیر از @mail، @inbox، @list، @bk، باید حداقل یک ایمیل داشته باشید که از قبل در سرورهای فهرست شده از پست الکترونیکی موجود باشد. به عبارت دیگر، ابتدا ایمیل را ثبت کنید و سپس حساب های ایمیل دیگری را اضافه کنید. فرآیند ثبت نام برای نامه ساده است، توصیف آن بی معنی است، اما اضافه کردن ایمیل های دیگر به این حساب ایمیل را شرح خواهیم داد.

در مرحله بعد، از شما خواسته می شود که از هر صندوق پستی که استفاده می کنید، لاگین و رمز عبور خود را وارد کنید، و ظرف 3 تا 5 دقیقه "Mail collector from mail" پوشه ای با نام نامه اضافه شده در کنار پوشه های "inbox" ایجاد می کند. "ارسال شده"، "هرزنامه" و موارد دیگر.

در واقع جمع‌آورنده نامه در عرض 10-15 دقیقه شروع به کار می‌کند و تمام حروف را از صندوق پستی که مشخص کرده‌اید به پوشه جدید ایجاد شده اضافه می‌کند. تمام نامه‌های دریافتی برای یک ایمیل جدید به این پوشه می‌آیند، همچنین ارسال نامه‌ها از صندوق پستی پیوست شده امکان‌پذیر می‌شود. هنگام ایجاد یک نامه جدید، فیلد "از" ظاهر می شود که در آن می توانید انتخاب کنید نامه از کدام صندوق پستی ارسال شود.

از مزایای سرویس پست الکترونیکی Mail.ru می توان به سادگی اضافه کردن و پیکربندی سایر صندوق های پستی، عدم نیاز به تعیین پروتکل های مختلف (POP3، SMTP) اشاره کرد. این بسیار مهم است زیرا هر کاربر نمی داند چیست.

معایب Mail.ru این است که تعیین نام و امضا برای هر نامه جدید اضافه شده (هر ایمیل جدید به جز ایمیل اصلی) غیرممکن است، یعنی نام و امضای نامه اصلی توزیع می شود. به هر آدرس و بس. یکی دیگر از اشکالات بزرگ این است که هنگام آپلود پیام ها در نامه، هیچ راهی برای حذف خودکار پیام های اصلی از سرور صندوق پستی پیوست شده وجود ندارد. چرا حذف پیام ها از سرور صندوق پستی اضافه شده بسیار مهم است؟ با این کار از پر کردن نامه پیوست شده جلوگیری می شود، زیرا حساب‌های ایمیل خارجی معمولاً برای ذخیره ایمیل‌ها بسیار کوچک هستند. به عنوان مثال، اگر فضای ایمیل در یک حساب خارجی پر باشد، Mail.ru هیچ حرف جدیدی را نمایش نمی دهد تا زمانی که وارد رابط ایمیل خارجی شوید و برای آزاد کردن فضا، حروف را مستقیماً از آنجا حذف کنید. به‌علاوه، ما نامه‌ها را به Mail گره می‌زنیم به این امید که فضای ذخیره‌سازی زیادی برای نامه‌های خود داشته باشیم، که ممکن است توسط منابع میزبانی محدود شود. بنابراین، با وجود این واقعیت که Mail.ru حجم تقریباً نامحدودی از صندوق پستی را هنگام اضافه کردن نامه از یک منطقه دامنه دیگر ارائه می دهد (به عنوان مثال، [ایمیل محافظت شده]، منابع ایمیل اضافه شده شما در Mail.ru افزایش نمی یابد، اما با منابع میزبانی (در مورد ما، منابع primer.ru) محدود می شود.

توانایی افزودن نامه‌های دیگر به سرویس Mail در دو نقطه از سه، که در مجموع یک امتیاز است، با وظیفه ما سازگار نیست.

درست است، Mail.ru راه دیگری برای اضافه کردن نامه خارجی، یا به طور دقیق تر، اتصال یا ورود به ایمیل خارجی دارد. به نظر می رسد این است:

این روش برای کار ما مناسب نیست، زیرا این یک جمع آوری نامه نیست، بلکه یک حالت کاربری است که به نامه متصل می شود و هر بار همه پوشه ها و نامه ها را در رابط ایمیل بارگیری می کند. اما در اینجا امکان اضافه کردن یک امضا و نام شخصی برای هر نامه وجود دارد، امکان ارسال نامه از ایمیل پیکربندی شده وجود دارد. حذف پیام ها از صندوق های پستی بارگذاری شده کار نمی کند، زیرا این یک جمع آوری نامه نیست.

مهم!برخی از کاربران به اشتباه فکر می کنند که اگر حروف در نامه نمایش داده شوند، ایمیلی که بارگیری از آن انجام شده است می تواند پاک شود. مجدداً توجه داشته باشید که Mail.ru به عنوان یک نمایشگر ایمیل کار می کند و اگر نامه را پاک کنید، هم در صندوق پست اصلی و هم در ایمیل حذف می شود.

دومین موضوع آزمایشی Yandex با جمع کننده نامه خود است. وظایف مشابه هستند: جمع آوری نامه، اختصاص امضا و نام برای هر نامه، و حذف همه نامه ها از صندوق پستی اضافه شده.

جمع‌آورنده نامه Yandex به روشی مشابه پیکربندی شده است، اما اگر ایمیل از سایتی مانند site.ru متصل شده باشد، باید تنظیمات بیشتری را مشخص کنید، تصویر صفحه را ببینید.

سرویس Mail این کار را برای ما انجام داد، در حالی که Yandex پیشنهاد می کند تمام تنظیمات را به صورت دستی از نامه های شخص ثالث تنظیم کند. در اینجا هیچ چیز پیچیده ای وجود ندارد: در قسمت ورود نام کامل نامه را وارد کنید ( [ایمیل محافظت شده]، در قسمت سرور فقط دامنه (site.ru) را وارد کنید، بهتر است تمام تنظیمات دیگر را به طور پیش فرض رها کنید یا اگر می دانید چه کاری انجام می دهید تغییر دهید. پس از اضافه کردن موفقیت آمیز ایمیل، پیام زیر ظاهر می شود:

برخلاف جمع‌آورنده نامه، Yandex پیشنهاد می‌کند انتخاب کند که آیا اصل حروف در صندوق پست اضافه شده ذخیره شود یا نه. در هر چیز دیگری، جمع کننده نامه Yandex به روشی مشابه Mail.ru کار می کند، می توان صندوق پستی را انتخاب کرد که از آن نامه ارسال شود. اما Yandex با امضای حروف مشکل مشابهی دارد: هیچ راهی برای تنظیم نام و امضای فردی برای هر صندوق پستی اضافه شده وجود ندارد.

با قضاوت بر اساس ناوبری، امکان اضافه کردن یک امضای جداگانه برای هر صندوق پستی وجود دارد، اما در واقعیت کار نمی کند. ما نامه را انتخاب می کنیم، نام و امضا را یادداشت می کنیم، روی ذخیره کلیک می کنیم. تمام است، امضا ذخیره می شود و کار می کند، اما برای همه صندوق های پستی دیگر نیز ذخیره می شود، یعنی با اختصاص نام و امضا به یک صندوق پستی، شما به طور خودکار این پارامترها را در همه نامه های ترکیب شده در Yandex تغییر می دهید. حتی اگر کادر دیگری را انتخاب کنید، اکنون امضا در همه جا یکسان خواهد بود.

در مجموع ، Yandex با جمع آوری و مرتب سازی نامه ها با موفقیت کنار آمد ، می تواند اصل نامه ها را از صندوق پستی اضافه شده حذف کند ، اما نمی تواند با امضاها کار کند! جمع کننده نامه از Yandex با وظیفه ما کنار نیامد و از سه امتیاز دو امتیاز کسب می کند.

می خواهم توجه داشته باشم که با "جلوگیری" در هر سه سرویس برای مونتاژ حروف ، به نظر می رسد که Mail با عجله عملکرد خود را "سیلی" کرده است. اگر چه بیشتر کاربران را راضی می کند، صادقانه بگویم، Mail یک جمع آوری نامه برای نمایش ایجاد کرد تا رقابت رقابتی را بررسی کند. همه چیز به خوبی و بدون شکست کار می کند، اما گردآورنده ایمیل با وظیفه ما کنار نیامد. چندین واحد تبلیغاتی در رابط ایمیل وجود دارد، اما آنها در کار با حروف تداخلی ندارند.

در مورد Yandex که مدت‌ها پیش جمع‌آورنده نامه را ایجاد کرد، به نظر می‌رسد که این صنعت خاص پشتیبانی نمی‌شود، زیرا رفع چنین عملکرد ساده (قابلیت اضافه کردن چندین امضا برای صندوق‌های پستی) برای چنین جستجوی قدرتمندی نباید دشوار باشد. موتور با این وجود، Yandex عملکرد منحصر به فرد دیگری دارد که به شما امکان می دهد دامنه ها را به سرورهای dns آنها متصل کنید و سپس نامه را ایجاد و پیکربندی کنید. اما چنین عملیات و تنظیماتی نیاز به دانش و زمان دارد. و اگرچه هیچ چیز پیچیده ای در آنجا وجود ندارد، در هر صورت، برای اکثر کاربران اینترنت روسیه نیست. مزیت بزرگ- بدون تبلیغات در رابط ایمیل Yandex! منهای- محدودیت در جمع کننده نامه به 10 صندوق پستی.

فینالیست و برنده یک گردآورنده نامه از گوگل است که علیرغم یکنواختی، از عهده وظیفه ما برآمد محدودیت 5 جعبه

البته همه چیز باید موازی شود. اینجاست که کتابخانه TPL DataFlow مورد علاقه من وارد عمل می شود.

ما نامه ها را با استفاده از POP3 جمع آوری می کنیم. تمام "چیزهای شیک" IMAP در این کار اضافی هستند - باید منبع نامه را تا حد امکان سریع و آسان انتخاب کنید و آن را در سرور حذف کنید. POP3 اینجا برای چشم کافی است. ما از OpenPop.NET استفاده می کنیم.

به عنوان یک ویژگی اختیاری، ما نظارت را در Zabbix تشدید خواهیم کرد. (ما 24/7 کار می کنیم و سرعت فوق العاده را ارائه می دهیم - شما باید این را نظارت کنید).

برو

بیایید یک برنامه کنسول معمولی ایجاد کنیم. کنسول NuGet را باز کنید و تمام بسته های لازم را نصب کنید:

Install-Package Nlog Install-Package OpenPop.NET Install-Package TopShelf Install-Package Microsoft.TPL.DataFlow
به پوشه پروژه بروید، App.Debug.config و App.Release.config را ایجاد کنید. پروژه را از استودیو بارگیری کنید، کد آن را باز کنید (از این پس TopCrawler.csproj). اضافه کردن به بخش با پیکربندی:

پیکربندی

App.config App.config


و در زیر هدف سفارشی برای MSBuild آمده است:

تبدیل هدف

$ (TargetFileName) .config


من شخصاً به این روش - به روش قدیمی - برای اضافه کردن تبدیل تنظیمات به محیط های جداگانه عادت کردم.
برای راحتی، من تنظیمات قوی تایپ را پیشنهاد می کنم. یک کلاس جداگانه پیکربندی را می خواند. (شما می توانید در مورد جنبه های نظری چنین راه حلی در نظرات صحبت کنید). پیکربندی‌ها، گزارش‌ها، نظارت دلیل خوبی برای پیاده‌سازی الگوی Singleton هستند.

پوشه ای به همین نام در پروژه ایجاد کنید (باید سفارشی وجود داشته باشد). در داخل، ما 3 کلاس ایجاد می کنیم - Config، Logger، Zabbix. لاگر ما:

متمرکز ساز

کلاس استاتیک Logger (log static عمومی NLog.Logger (دریافت؛ مجموعه خصوصی؛) عمومی استاتیک NLog.Logger بایگانی (دریافت؛ مجموعه خصوصی؛) Static Logger () (Log = LogManager.GetLogger ("Global")؛ Archive = LogManager. GetLogger ("بایگانی"))


مانیتورینگ با Zabbix مستحق یک پست جداگانه است، بنابراین من فقط کلاسی را که عامل را پیاده‌سازی می‌کند در اینجا ترک می‌کنم:

زبیکس

فضای نام TopCrawler.Singleton (///

/// Singleton: کلاس فرستنده zabbix ///کلاس static Zabbix (فرستنده ZabbixSender static عمومی (دریافت؛ مجموعه خصوصی؛) Static Zabbix () (فرستنده = ZabbixSender جدید (Config.ZabbixServer, Config.ZabbixPort);)) ساختار ZabbixItem (مقدار رشته عمومی; کلید رشته عمومی؛ رشته عمومی ; ) کلاس ZabbixSender (ساختار داخلی SendItem (// ReSharper disable InconsistentNaming - Zabbix میزبان رشته عمومی حساس به حروف کوچک و بزرگ است؛ کلید رشته عمومی؛ مقدار رشته عمومی؛ ساعت رشته عمومی؛ // ReSharper restore InconsistentNaming) #pragma warning disable 0649 interiorsponse ( پاسخ رشته عمومی؛ اطلاعات رشته عمومی؛) #pragma warning restore 0649 #region --- Constants --- public const string DefaultHeader = "ZBXD \ x01"؛ const string عمومی SendRequest = "Sender data"; const public int DefaultTimeout = 10000 ؛ #endregion #region --- فیلدها --- خصوصی فقط خواندنی DateTime _dtUnixMinTime = DateTime.SpecifyKind (جدید DateTime (1970, 1, 1), DateTimeKind.Utc؛ خصوصی فقط خواندنی int _timeout; رشته فقط خواندنی خصوصی _zabbixserver; private readonly int _zabbixport; #endregion #region --- سازنده ها --- عمومی ZabbixSender (string zabbixserver, int zabbixport): این (zabbixserver, zabbixport, DefaultTimeout) () ZabbixSender عمومی (string zabbixserver, int zabbixport, int timeout) (_zabbixserver zabbix _zabbixport; = مهلت زمانی (1) (itm))؛ ) رشته عمومی SendData (فهرست lstData) (تلاش کنید (var serializer = new JavaScriptSerializer ()؛ مقادیر var = New List (lstData.Count)؛ values.AddRange (lstData.Select (itm => new SendItem (host = itm.Host، key = itm.Key، value = itm.Value، clock = Math.Floor ((DateTime.Now.ToUniversalTime () - _dtUnixMinTime). TotalSeconds) .ToString (CultureInfo.InvariantCulture)))); var json = serializer.Serialize (جدید (درخواست = SendRequest, data = values.ToArray ())); var header = Encoding.ASCII.GetBytes (DefaultHeader); طول var = BitConverter.GetBytes ((طولانی) json.Length)؛ var data = Encoding.ASCII.GetBytes (json); بسته var = بایت جدید. Buffer.BlockCopy (هدر، 0، بسته، 0، سربرگ. طول)؛ Buffer.BlockCopy (طول، 0، بسته، هدر. طول، طول. طول)؛ Buffer.BlockCopy (داده، 0، بسته، هدر. طول + طول. طول، داده. طول)؛ با استفاده از (var socket = سوکت جدید (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) (socket.Connect (_zabbixserver, _zabbixport)؛ socket.Send (packet)؛ // Header var buffer = new byte (ReceivD) , buffer, 0, buffer.Length, _timeout؛ if (DefaultHeader! = Encoding.ASCII.GetString (buffer, 0, buffer.Length)) Exception جدید ("هدر نامعتبر") پرتاب کنید؛ // بافر طول پیام = بایت جدید ؛ ReceivData (سوکت، بافر، 0، بافر. طول، مدت زمان پایان)، var dataLength = BitConverter.ToInt32 (بافر، 0)؛ اگر (طول داده == 0) Exception جدید ("طول داده نامعتبر") ایجاد کند؛ // بافر پیام = بایت جدید؛ ReceivData (سوکت، بافر، 0، بافر. طول، مدت زمان پایان)؛ پاسخ var = سریال ساز. Deserialize (Encoding.ASCII.GetString (بافر، 0، بافر. طول)). بازگشت رشته. قالب ("پاسخ: (0)، اطلاعات: (1)"، پاسخ.پاسخ، پاسخ.اطلاعات); )) catch (Exception e) (return string. Format ("Exception: (0)"، e);)) Private Static Void ReceivData (Socket pObjSocket، بافر بایت، int offset، int size، int timeout) (var startTickCount = Environment.TickCount؛ var دریافت = 0؛ انجام دهید (اگر (Environment.TickCount> startTickCount + timeout) TimeoutException (دریافت شده + = pObjSocket.Receive) را امتحان کنید (بافر، افست + دریافت، اندازه - دریافت، SocketFlags. هیچکدام) .< size); } #endregion } }


تنظیمات ... وقت آن است که حداقل یک کار جالب انجام دهید. ابتدا جعبه هایی را که در حال نظرسنجی هستیم در تنظیمات ذخیره می کنیم. دوم، تنظیمات DataFlow. من این را پیشنهاد می کنم:

تنظیمات



بنابراین، میزبان و پورت که در آن متصل می شود، کاربر و رمز عبور - همه چیز در اینجا واضح است. بعدی نوع جعبه است. فرض کنید این سرویس توسط بازاریابی (و همچنین سایر بخش ها) استفاده می شود. آنها صندوق‌های پستی دارند که در آن پاسخ‌های خودکار به نامه‌ها و همچنین گزارش‌های هرزنامه FBL ریخته می‌شود. صندوق پستی خود قبلا نامه را دسته بندی می کند، بنابراین، برای چنین شرایطی، ما بلافاصله نوع صندوق پستی را تنظیم می کنیم. با تنظیمات DataFlow، بعداً وقتی شروع به ایجاد آبجکت کنیم، مشخص خواهد شد. در اینجا ما بخش های خود را در پیکربندی خواهیم داشت. راهنماهای زیادی در مورد نحوه انجام این کار وجود دارد، بنابراین من فقط نتیجه را نشان می دهم:

تعریف انواع

#region --- انواع --- کلاس ایستا MailboxType (رشته const عمومی Bo = "bo"؛ رشته const عمومی Crm = "crm"؛ رشته const عمومی Fbl = "fbl"؛ رشته const عمومی Bounce = "bounce"؛) class MailboxInfo (نوع رشته عمومی (get; set;) رشته عمومی نام میزبان (get; set;) رشته عمومی کاربر (get; set;) رشته عمومی رمز عبور (get; set;) public int Port (get; set;)) کلاس DataBlockOptions (public int Maxdop (get; set;) public int BoundedCapacity (get; set;) public DataBlockOptions () (Maxdop = 1; BoundedCapacity = 1;)) #endregion


ایجاد بخش ها

///

/// بخش پیکربندی سفارشی ///کلاس عمومی CustomSettingsConfigSection: ConfigurationSection (CredentialsCollection عمومی CredentialItems (دریافت (بازگرداندن پایه ["CredentialsList"] به عنوان CredentialsCollection;)) عمومی DataBlockOptionsCollection DataFlowOptionsItems (دریافت (بازگشت پایه ["DataBlock"Flow"]


///

/// مجموعه سفارشی - لیست اعتبارنامه ///کلاس عمومی CredentialsCollection: ConfigurationElementCollection، IEnumerable (برگرداندن محافظت شده ConfigurationElement CreateNewElement () (بازگرداندن CredentialsElement جدید ();) شیء نادیده گرفته شده محافظت شده GetElementKey (عنصر ConfigurationElement) (بازگشت ((CredentialsElement) عنصر). ) IEnumerator جدید عمومی < Count; i++) { yield return BaseGet(i) as CredentialsElement; } } } /// /// مورد اعتبار سفارشی ///کلاس عمومی CredentialsElement: ConfigurationElement (رشته عمومی نام میزبان (دریافت (پایه بازگشت ["نام میزبان"] به عنوان رشته؛)) رشته عمومی نام کاربری (دریافت (بازگشت پایه ["نام کاربری"] به عنوان رشته؛)) رشته عمومی رمز عبور (دریافت (پایه بازگشتی) ["رمز عبور"] به عنوان رشته؛)) رشته عمومی نوع (دریافت (پایه بازگشت ["نوع"] به عنوان رشته؛)) رشته عمومی پورت (دریافت (پایه بازگشت ["پورت"] به عنوان رشته؛))) /// /// مجموعه سفارشی - لیست گزینه های DataBlock ///کلاس عمومی DataBlockOptionsCollection: ConfigurationElementCollection، IEnumerable (کنترل حفاظت شده ConfigurationElement CreateNewElement () (برگردان DataBlockOptionsElement جدید ()؛) شیء نادیده گرفته شده محافظت شده GetElementKey (عنصر ConfigurationElement) (بازگشت ((DataBlockOptionsElement) عنصر) .Name;) public CredentialsElement this (get (returnElements)Base; ) IEnumerator جدید عمومی GetEnumerator () (برای (var i = 0; i< Count; i++) { yield return BaseGet(i) as DataBlockOptionsElement; } } } /// /// مورد گزینه های سفارشی DataBlock ///کلاس عمومی DataBlockOptionsElement: ConfigurationElement (نام رشته عمومی (دریافت (پایه بازگشت ["نام"] به عنوان رشته؛)) رشته عمومی Maxdop (دریافت (بازگشت پایه ["maxdop"] به عنوان رشته؛)) رشته عمومی BoundedCapacity (دریافت (پایه بازگشتی ["نام"] ["boundedcapacity"] به عنوان رشته؛)))


من اجرای کامل پیکربندی را نخواهم نوشت، فرض بر این است که در طول فرآیند توسعه، پارامترهای مورد نیاز ما در آنجا اضافه می شوند.

بیایید تنظیمات سفارشی خود را مانند این بخوانیم:

خواندن

لیست عمومی CredentialsList (دریافت؛ مجموعه خصوصی؛) فرهنگ لغت عمومی DataFlowOptionsList (دریافت؛ مجموعه خصوصی؛) ... Static Config () ((var customConfig = (CustomSettingsConfigSection) ConfigurationManager.GetSection ("CustomSettings")؛ // دریافت صندوق پستی foreach (مورد var در customConfig.CreddentialItemsL) جدید MailboxInfo (Hostname = item.Hostname، Port = Convert.ToInt32 (item.Port)، User = item.Username، Type = item.Type، Password = item.Password))؛ // دریافت تنظیمات DataFlow foreach (مورد var در customConfig.DataFlowOptionsItems) DataFlowOptionsList.Add (item.Name، DataBlockOptions جدید (Maxdop = Convert.ToInt32 (item.Maxdop)، BoundedCapacity = Convert.ToInt32 (item.BoundedCapacity (Logger)x) catch. خطا در خواندن پیکربندی: (0)"، ex.پیام؛ پرتاب؛))


به نوعی معلوم می شود که بسیار طولانی است و ما حتی به جالب ترین آنها نرسیده ایم.

در حال حاضر، بیایید اتصال TopShelf، شمارنده های عملکرد، ارتباط با پایگاه داده را حذف کنیم و به کار بپردازیم! ما کلاس Crawler - هسته را ایجاد می کنیم. ابتدا نامه را می خوانیم:

Private volatile bool _stopPipeline; ... خالی عمومی شروع () (do (var getMailsTasks = _config.CredentialsList.Select (credentials => Task.Run (() => GetMails (Credentials))). ToList (); foreach (وظیفه var در getMailsTasks) کار .Wait ()؛ Thread.Sleep (2000)؛) while (! _StopPipeline)؛ // Stop Pipeline - منتظر تکمیل تمام نقاط پایانی باشید // اگر (_stopPipeline) Logger.Log.Warn ("Pipeline) خط لوله DataFlow متوقف شود. توسط کاربر متوقف شده است "))
در اینجا تنبلی عوارض خود را گرفت و من تصمیم گرفتم مزاحم نشوم - اگر حدود 20-30 جعبه وجود دارد، می توانید برای هر کدام یک کار اجرا کنید و نگران تعداد رشته ها نباشید. (اجازه دهید با گوجه فرنگی دوش بگیرم.)

بیایید به خواندن خود برویم:

Private void GetMails (اطلاعات MailboxInfo) (سعی کنید (با استفاده از (var Client = Pop3Client جدید ()) (
بیایید بلافاصله زمان دسترسی به صندوق پستی را محاسبه کنیم - برای تشخیص بار شبکه و سرور مفید است.

// دریافت Zabbix Metrics var Stopwatch = new Stopwatch (); کرونومتر.شروع (); // دریافت تعداد ایمیل client.Connect (info.Hostname, info.Port, false); client.Authenticate (info.User، info.Password); کرونومتر.Stop ();
ارسال اطلاعات به Zabbix ساده است - نام میزبان (همانطور که در Zabbix است)، کلید (دوباره، دقیقاً مانند Zabbix) و مقدار رشته را مشخص می کنیم.

// ارسال آن به Zabbix Zabbix.Sender.SendData (جدید ZabbixItem (Host = Config.HostKey، Key = info.Type + Config.TimingKey، Value = کرونومتر.ElapsedMilliseconds.ToString ())); Logger.Log.Debug ("ارسال [(0)] زمان بندی به Zabbix: متصل به" (1) "به عنوان" (2) "، زمان بندی (3) میلی ثانیه"، info.Type، info.Hostname، info.User، کرونومتر.Milliseconds سپری شده)؛ var count = client.GetMessageCount (); اگر (شمارش == 0) بازگشت; Logger.Log.Debug ("ما" پیام های جدید (0) در "(1)" "، count, info.User دریافت کردیم؛ // ارسال پیام به بلوک مرتب سازی برای (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);
خط لوله DataFlow زمانی ایجاد می شود که کلاس Crawler ایجاد شود. ما معتقدیم که اولین قدم ما مرتب کردن نامه است.

در حالی که (! _SortMailDataBlock.Post (mailInfo)) Thread.Sleep (500);
می بینید که چقدر ساده است - خود نوار نقاله یکی است. همه کارهایی که نامه را می‌خوانند، پیام‌ها را یکی یکی در آنجا ارسال می‌کنند. اگر بلوک مشغول باشد، Post به false برمی‌گردد و ما فقط منتظر می‌مانیم تا رایگان شود. عرق فعلی در این زمان به کار خود ادامه می دهد. این همان چیزی است که من آن را همزمانی بدون نگرانی می نامم.

پیام به نوار نقاله رفت، اکنون می توانید با خیال راحت آن را در یک بایگانی RAW ذخیره کنید (بله، همه چیزهایی که می خوانیم - ما آن را در یک بایگانی فایل ذخیره می کنیم. سرویس پشتیبانی بعداً از ما تشکر خواهد کرد).

بیایید، برای مثال، چرخش بایگانی را تنظیم کنیم:

NLog.config



سپس می توانید logStash را روی آن تنظیم کنید، اما این داستان دیگری است ...

// ذخیره هر نامه در بایگانی Logger.Log.Debug ("پیام بایگانی"); Logger.Archive.Info (Functions.MessageToString (mailInfo.Mail)); ) catch (Exception ex) (Logger.Log.Error ("Parse Error Email: (0)")، ex.Message); Functions.ErrorsCounters.Increment ()؛ // نامه به هر حال بایگانی شود Logger.Log.Debug ("پیام بایگانی" ")؛ Logger.Archive.Info (Encoding.Default.GetString (client.GetMessageAsBytes (i + 1)));) if (_config.DeleteMail) client.DeleteMessage (i + 1); اگر (_stopPipeline) شکسته شود. ) Logger.Log.Debug ("انجام شد با" (0) ""، info.User); )) catch (Exception ex) (Logger.Log.Error ("خطای عمومی - نوع: (0)، پیام: (1)"، ex, ex.Message)؛ Functions.ErrorsCounters.Increment ();))
در اینجا از شمارشگرهای خطای ساکن (از نظر انواع جعبه) استفاده کردیم که در آن ErrorsCounters عبارتند از:

فرهنگ لغت استاتیک عمومی ErrorsCounters = دیکشنری جدید ();
و خود شمارنده ها را می توان به این صورت انجام داد:

Counter.cs

شمارنده کلاس (شمارنده طولانی خصوصی؛ شمارنده عمومی () (_counter = 0;) عمومی void افزایش () (Interlocked. Increment (ref _counter);) public long Read () (return _counter;) public long Refresh () (return Interlocked .Exchange (ref _counter, 0)؛) public void Add (طولانی مقدار) (Interlocked.Add (ref _counter, value)؛) public void مجموعه (مقدار طولانی) (Interlocked.Exchange (ref _counter, value);))


بیایید به ایجاد خط لوله ادامه دهیم. فرض کنید جعبه‌هایی داریم که پاسخ‌های خودکار درون آن‌ها ریخته می‌شود. چنین نامه هایی باید تجزیه شوند (چه نوع پاسخ خودکار، از چه کسی، توسط کدام لیست پستی و غیره) و نتیجه را در ذخیره سازی (DB) قرار دهید. فرض کنید جعبه هایی وجود دارد که گزارش های FBL در آنها قرار می گیرد. چنین حروفی را به یکباره به پایگاه داده اضافه می کنیم. ما همه حروف دیگر را "مفید" می دانیم - آنها باید برای هرزنامه بررسی شوند و به یک سیستم خارجی، به عنوان مثال، CRM ارسال شوند.

همانطور که قبلاً فهمیدید، این مثال عمدتاً استفاده از جمع کننده را برای کارهای بازاریابی در نظر می گیرد - جمع آوری آمار در مورد تحویل نامه، اطلاعات مربوط به هرزنامه.

بنابراین، ما در مورد گردش کار تصمیم گرفته ایم. ما بلوک های لازم را در کلاس Crawler اعلام می کنیم:

Class MessageInfo (Bool عمومی IsSpam (دریافت؛ تنظیم؛) پیام عمومی ایمیل (دریافت؛ تنظیم؛) رشته عمومی زیرنوع (دریافت؛ تنظیم؛) رشته عمومی گیرنده (دریافت؛ تنظیم؛) نوع پیام عمومی نوع (دریافت؛ تنظیم؛) صندوق پستی عمومی صندوق پستی (دریافت؛ تنظیم؛)) کلاس خزنده (// خط لوله خصوصی TransformBlock _sortMailDataBlock; TransformBlock خصوصی _spamFilterDataBlock؛ TransformBlock خصوصی _checkBounceDataBlock؛ TransformBlock خصوصی _identifyDataBlock; ActionBlock خصوصی _addToCrmDataBlock؛ ActionBlock خصوصی _addToFblDataBlock؛ ActionBlock خصوصی _addToBounceDataBlock؛ ...
ما یک روش مقداردهی اولیه ایجاد می کنیم و بلوک های خط لوله ایجاد می کنیم (ما از بخش های فوق العاده خود از تنظیمات برای مقداردهی اولیه بلوک ها استفاده می کنیم):

Public void Init () (// *** ایجاد خط لوله *** // ایجاد TransformBlock برای دریافت نوع پیام var blockOptions = _config.GetDataBlockOptions ("_ sortMailDataBlock")؛ _sortMailDataBlock = TransformBlock جدید (mail => SortMail (mail)، ExecutionDataflowBlockOptions جدید (MaxDegreeOfParallelism = blockOptions.Maxdop، BoundedCapacity = blockOptions.BoundedCapacity)); // ایجاد TransformBlock برای فیلتر کردن هرزنامه blockOptions = _config.GetDataBlockOptions ("_ spamFilterDataBlock"); _spamFilterDataBlock = TransformBlock جدید (mail => FilterSpam (نامه)، ExecutionDataflowBlockOptions جدید (MaxDegreeOfParallelism = blockOptions.Maxdop، BoundedCapacity = blockOptions.BoundedCapacity)); // ایجاد TransformBlock برای مرتب کردن پرش ها blockOptions = _config.GetDataBlockOptions ("_ checkBounceDataBlock"); _checkBounceDataBlock = TransformBlock جدید (mail => BounceTypeCheck (نامه)، ExecutionDataflowBlockOptions جدید (MaxDegreeOfParallelism = blockOptions.Maxdop، BoundedCapacity = blockOptions.BoundedCapacity)); // ایجاد TransformBlock برای شناسایی صاحب پرش blockOptions = _config.GetDataBlockOptions ("_identDataBlock"); _identifyDataBlock = TransformBlock جدید (mail => GetRecipient (ایمیل)، ExecutionDataflowBlockOptions جدید (MaxDegreeOfParallelism = blockOptions.Maxdop، BoundedCapacity = blockOptions.BoundedCapacity)); // ایجاد ActionBlock برای ارسال نامه به CRM blockOptions = _config.GetDataBlockOptions ("_ addToCrmDataBlock"); _addToCrmDataBlock = ActionBlock جدید (mail => AddToCrm (mail)، ExecutionDataflowBlockOptions جدید (MaxDegreeOfParallelism = blockOptions.Maxdop، BoundedCapacity = blockOptions.BoundedCapacity)); // ایجاد ActionBlock برای ارسال FBL به MailWH blockOptions = _config.GetDataBlockOptions ("_ addToFblDataBlock"); _addToFblDataBlock = ActionBlock جدید (mail => AddToFbl (mail)، ExecutionDataflowBlockOptions جدید (MaxDegreeOfParallelism = blockOptions.Maxdop، BoundedCapacity = blockOptions.BoundedCapacity)); // ایجاد ActionBlock برای ارسال Bounce به MailWH blockOptions = _config.GetDataBlockOptions ("_ addToBounceDataBlock"); _addToBounceDataBlock = ActionBlock جدید (mail => AddToBounce (mail)، ExecutionDataflowBlockOptions جدید (MaxDegreeOfParallelism = blockOptions.Maxdop، BoundedCapacity = blockOptions.BoundedCapacity));
ما نوار نقاله را مطابق با طرح خود مونتاژ می کنیم:

// *** ساخت خط لوله *** _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); / * خرد * /
همانطور که می بینید، همه چیز بسیار ساده است - ما بلوک را با بلوک بعدی (با قابلیت تنظیم شرایط اتصال) وصل می کنیم. همه بلوک ها به صورت موازی اجرا می شوند. هر بلوک دارای یک درجه موازی و ظرفیت است (با استفاده از ظرفیت، می توانید صف قبل از بلوک را تنظیم کنید، یعنی بلوک یک پیام دریافت کرده است، اما هنوز در حال پردازش نیست). بنابراین، می‌توانید درجه بالایی از موازی‌سازی را برای عملیات «پیچیده» و زمان‌بر، مانند تجزیه محتوای ایمیل، تنظیم کنید.

من مواد DataFlow را توصیف نمی کنم، بهتر است همه چیز را در منبع اصلی TPL DataFlow بخوانید..

SortMailDataBlock.Completion.ContinueWith (t => (اگر (t.IsFaulted) ((IDataflowBlock) _spamFilterDataBlock) .Fault (t.Exception)؛ else _spamFilterDataBlock.Complete ();)); _sortMailDataBlock.Completion.ContinueWith (t => (اگر (t.IsFaulted) ((IDataflowBlock) _addToFblDataBlock) .Fault (t.Exception)؛ else _addToFblDataBlock.Complete ();)); _sortMailDataBlock.Completion.ContinueWith (t => (اگر (t.IsFaulted) ((IDataflowBlock) _checkBounceDataBlock) .Fault (t.Exception)؛ در غیر این صورت _checkBounceDataBlock.Complete ();)); _spamFilterDataBlock.Completion.ContinueWith (t => (اگر (t.IsFaulted) ((IDataflowBlock) _addToCrmDataBlock). _checkBounceDataBlock.Completion.ContinueWith (t => (اگر (t.IsFaulted) ((IDataflowBlock) _identifyDataBlock) .Fault (t.Exception)؛ else _identifyDataBlock.Complete ();)); _identifyDataBlock.Completion.ContinueWith (t => (اگر (t.IsFaulted) ((IDataflowBlock) _addToBounceDataBlock) .Fault (t.Exception)؛ else _addToBounceDataBlock.Complete ();)); )
همه چیز، در واقع، خط لوله در حال حاضر کار می کند، می توانید پیام هایی را به آن ارسال کنید. تنها باقی مانده است که با اضافه کردن روش شروع، آن را متوقف کنیم:

شروع کنید

عمومی void شروع () (انجام (var getMailsTasks = _config.CredentialsList.Select (credentials => Task.Run (() => GetMails (Credentials))). ToList (); foreach (var task در getMailsTasks) task.Wait ( Thread.Sleep (2000)؛) while (! _StopPipeline)؛ // توقف خط لوله - منتظر تکمیل تمام نقاط پایانی باشید _sortMailDataBlock.Complete ()؛ _addToCrmDataBlock.Completion.Wait ()؛ _addToFblDataBlock.Completion.To _undceait .Completion.Wait (); if (_stopPipeline) Logger.Log.Warn ("خط لوله توسط کاربر متوقف شده است")؛)


حرکت به سمت نمایندگان.
مرتب سازی ... خوب، بیایید بگوییم همه چیز در اینجا ساده است (ما همیشه برای پیچیده کردن آن وقت داریم):

Private MessageInfo SortMail (MessageInfo mail) (سوئیچ (mail.Mailbox.Type) (مورد MailboxType.Crm: mail.Type = MessageType.GENERAL؛ شکسته؛ MailboxType. Bounce: mail.Type = MessageType.Type.Type. Fbl: mail.Type = MessageType.FBL; break;) ایمیل را برگرداند؛)
فیلتر اسپم این برای تکالیف است - از SpamAssassin استفاده کنید.
در اینجا یک نماینده برای شما وجود دارد:

Private MessageInfo FilterSpam (ایمیل MessageInfo) (// TODO: ایمیل برگشتی منطقی SpamAssassin را اضافه کنید؛)
و کلاس هایی برای کار با SpamAssassin API (لینک به پروژه).
و به تجزیه حروف می پردازیم. ما پاسخ های خودکار را تجزیه می کنیم. اینجاست که MEF وارد می شود.
یک پروژه (dll) با رابط های افزونه های ما ایجاد کنید (بیایید رابط ها را فراخوانی کنیم).
اضافه کردن رابط:

رابط عمومی ICondition (رشته بررسی (پیام mimeMessage)؛) رابط عمومی IConditionMetadata (نوع نوع (دریافت؛))
و ... همین. TopCrawler ما به این پروژه بستگی دارد و پروژه افزونه نیز از آن استفاده خواهد کرد.
یک پروژه جدید (همچنین dll) ایجاد کنید، نام آن را Conditions بگذارید.
بیایید انواع پاسخ خودکار را اضافه کنیم:

#region --- انواع --- کلاس استاتیک BounceType (رشته const عمومی Full = "BounceTypeFull"؛ public const string Timeout = "BounceTypeTimeout"؛ public const string Refused = "BounceTypeRefused"؛ string عمومی NotFound = "BounceFound"; publict const string Inactive = "BounceTypeInactive"؛ const string عمومی OutOfOffice = "BounceTypeOutOfOfOffice"؛ const string عمومی HostNotFound = "BounceTypeHostNotFound"؛ رشته const عمومی NotAuthorized = "BounceTypeOutOfOfOfOffice";
و کلاس هایی که رابط ما را پیاده سازی می کنند:

کلاس عمومی ConditionNotFound1: ICondition (رشته عمومی را بررسی کنید (پیام mimeMessage) (اگر (! MimeMessage.MessagePart.IsMultiPart) null برگرداند؛ الگوی رشته const = "Diagnostic-Code:. + Smtp. + 550"؛ var regexxp , RegexOptions.IgnoreCase؛ mimeMessage.MessagePart.MessageParts.Any را برگردانید (part => part.ContentType.MediaType == "پیام / وضعیت تحویل" && regexp.IsMatch (part.GetBodyAsText: nullce;)ype? ) ... کلاس عمومی ConditionTimeout2: ICondition (بازگشت BounceType.Timeout؛) ...
همانطور که می بینید، همه چیز در مورد ویژگی ها است. با کمک آنها افزونه ها بارگذاری می شوند.
ما به پروژه خود برمی گردیم و افزونه ها را بارگذاری می کنیم:

کلاس خزنده (... // پلاگین های عمومی IEnumerable > BounceTypeConditions (دریافت؛ تنظیم؛) خلأ خصوصی LoadPlugins () (امتحان کنید (var container = New CompositionContainer (DirectoryCatalog جدید (_config.PluginDirectory)، true)؛ container.ComposeParts (this)؛) catch (Exception ex) (Logger.Log .خطا ("Unable to load plugins: (0)"، ex.Message);)) ...
LoadPlugins را در سازنده کلاس خود می کشیم. من در مورد مکانیسم بارگذاری جزئیات توضیح نمی دهم - گوگل بهتر عمل خواهد کرد.

در حال حرکت به سمت نماینده اعتبار سنجی نوع Bounce ما. شرایط به نوبه خود اعمال خواهند شد تا زمانی که اولین مورد، روش انحصاری، فعال شود:

Private MessageInfo BounceTypeCheck (MessageInfo mailInfo) (سعی کنید (foreach (شرط var در BounceTypeConditions) (var res = condition.Value.Check (mailInfo.Mail)؛ اگر (res == null) ادامه دهید؛ mailInfo.Subgger. = Log res; .اشکال‌زدایی ("شرط نوع جهش [(0)] برای پیام [(1)] راه‌اندازی شد، شرط. فراداده.نوع، mailInfo.Mail.Headers.MessageId؛ شکست؛)) catch (Exception ex) (Logger.Log .خطا ("نوع پرش برای پیام تعیین نشد" (0) ": (1)"، mailInfo.Mail.Headers.MessageId، ex.Message؛ Logger.ErrorsCounters.Increment ();) mailInfo را برمی گرداند؛)
بنابراین، اگر یک منطق جدید ظاهر شود، کافی است به سادگی یک کلاس جدید با پلاگین هایی که رابط ما را پیاده سازی می کند و - voila به پروژه اضافه کنیم! من نمونه ای از افزونه دوم را برای تعیین فرستنده نامه ضمیمه نمی کنم - این قبلاً یک پست طولانی است (پاسخ خودکار توسط خود سرور ایجاد شده است، بنابراین فرستنده نیز باید از سرفصل های نامه تجزیه شود. حرف).

هیچ چیز غیرعادی با ثبت نتایج در پایگاه داده وجود ندارد. به عنوان مثال، مانند این:

Private void AddToBounce (MessageInfo mail) (امتحان (MailWH.BounceAdd (mail)؛ Functions.ProcessedCounters.Increment ()؛ Functions.Log.Debug ("ارسال Bounce to MailWH")؛) catch (Exception ex) (Functions.Log. خطا ("خطا در ذخیره پیام Bounce" (0) "to MailWH: (1)"، mail.Mail.Headers.MessageId، ex.Message؛ Functions.ErrorsCounters.Increment ();))

BounceAdd

عمومی استاتیک طولانی BounceAdd (پیام MessageInfo) (با استفاده از (var conn = SqlConnection جدید (ConnectionString)) با استفاده از (var cmd = SqlDataAdapter جدید ("BounceAdd"، conn)) (var body = message.Mail.FindFirstPlainTextVersion = null?) message.Mail.FindFirstHtmlVersion (). GetBodyAsText (): message.Mail.FindFirstPlainTextVersion (). GetBodyAsText (); var outId = SqlParameter جدید ("@ ID"، SqlDbType.BigInt) (جهت =DirectionDirection)؛ .CommandType = CommandType.StoredProcedure؛ cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ RawMessage"، message.Mail.RawMessage)); ؛ cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ موضوع"، message.Mail.Headers.Subject ?? "")); cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ MessageID"، message.Mail .Headers.MessageId ?? "")); cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ AddressTo"، message.Mail.Headers.To.Address ?? ""))؛ cmd.SelectComm and.Parameters.Add (SqlParameter جدید ("@ AddressFrom"، message.Mail.Headers.From.Address ?? ""))؛ cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ DateRecieved، DateTime.Now)); cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ BounceTypeSysName"، (object) message.Subtype ?? DBNull.Value)); cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ SourceFrom"، (object) message.Recipient ?? DBNull.Value)); // TODO: Add ListId support cmd.SelectCommand.Parameters.Add (SqlParameter جدید ("@ ListId"، DBNull.Value)); cmd.SelectCommand.Parameters.Add (outId); conn.Open (); cmd.SelectCommand.ExecuteNonQuery (); بازگشت outId.Value تا زمانی؟ ?? 0; ))


من را ببخشید که وقت نداشتم تا TopShelf را نشان دهم - پست در حال حاضر خیلی پف کرده است.

نتیجه گیری

در این آموزش یاد گرفتیم که جمع آوری نامه می تواند دشوار باشد. هسته توسعه‌یافته به شما اجازه می‌دهد تا به سرعت مراحل فرآیند جدید - بلوک‌های DataFlow را بدون تأثیرگذاری بر منطق موجود اضافه کنید. زیرسیستم پلاگین به شما امکان می دهد تا به سرعت منطق تجزیه اسکریپت مانند ایجاد کنید، و DataFlow خود همه محاسبات را موازی می کند (و ما این توانایی را داریم که به صورت انعطاف پذیر چند رشته ای را برای یک ماشین خاص پیکربندی کنیم). TopShelf به ما این امکان را می دهد که یک سرویس را در حالت سرویس و حالت کنسول اجرا کنیم تا اشکال زدایی آسان تر شود.

فوه ... اگر جالب است، من به شما بیشتر می گویم که چگونه آن را در ریل های Continious Integration قرار دهید، ساخت خودکار را راه اندازی کنید و از طریق VS Release Management منتشر کنید.

برچسب‌ها: افزودن برچسب

من مجموعه ای از مقالات را در مورد عملکرد جمع آوری نامه به یک صندوق پست الکترونیکی اصلی از هر صندوق دیگری که در هر سرویس پستی قرار دارد ادامه می دهم. در آخرین مقاله، ما در مورد راه اندازی مجموعه نامه در سرویس Yandex صحبت کردیم، که به آسانی گلابی گلابی است. و در این مقاله در مورد نحوه انجام همین کار در سرویس دیگری که امروزه کمتر محبوب نیست - Mail.ru صحبت خواهم کرد، جایی که بسیاری هنوز صندوق پست الکترونیکی اصلی خود را نگه می دارند، علیرغم این واقعیت که، به عنوان مثال، سرویس GMail واضح است. مزایا (من تنظیم مجموعه نامه در Gmail را توضیح داده ام). اما همانطور که می گویند، به هر یک از خود و گاهی اوقات این فقط یک عادت است :)

تنظیم مجموعه نامه در سرویس Mail.ru به آسانی، به عنوان مثال، در Yandex است. فقط چند مرحله ساده و همه چیز آماده خواهد شد، نامه از صندوق پستی که به یکی از آنها وصل کرده اید، در Mail شروع به جریان می کند.

روند تنظیم مجموعه نامه در سرویس Mail.ru

اول از همه، وارد حساب کاربری خود در Mail شوید، جایی که نامه‌ها را از صندوق‌های ایمیل دیگر جمع‌آوری کرده و بخش "نامه‌ها" را باز کنید (ایمیل در آنجا قرار دارد).

اکنون باید به تنظیمات ایمیل بروید. برای انجام این کار، روی دکمه "بیشتر" در بالا کلیک کنید و "تنظیمات" را انتخاب کنید.

همچنین می توانید تنظیمات را با کلیک کردن در گوشه سمت راست بالای آدرس ایمیل خود و سپس انتخاب "تنظیمات ایمیل" باز کنید.

سپس به بخش «ایمیل از صندوق‌های پستی دیگر» بروید.

اولین پنجره اتصال صندوق ایمیل دوم باز می شود.

به شما یادآوری می کنم که دومین صندوق پست الکترونیکی که می خواهید نامه ها را از آن جمع آوری کنید می تواند در هر سرویسی قرار داشته باشد، نه فقط Mail!

در مثال این مقاله، ما اتصال صندوق پستی واقع در Yandex را در نظر خواهیم گرفت.

در این پنجره، باید نام کاربری و رمز عبور ایمیلی را که به آن متصل می کنید، مشخص کنید. اگر صندوق پستی که متصل می‌کنید در یکی از سرویس‌های فهرست شده در زیر قرار دارد، روی دکمه مناسب در بالا کلیک کنید، آدرس کامل ایمیل متصل را در زیر وارد کنید و روی «افزودن صندوق پستی» کلیک کنید:

اگر صندوق پستی که می خواهید به آن متصل شوید در سرویس دیگری (نه از لیست بالا) قرار دارد، روی دکمه "ایمیل دیگر" در بالا کلیک کنید، پس از آن باید آدرس کامل ایمیل متصل، رمز عبور را وارد کنید. از آن و روی "افزودن صندوق پستی" کلیک کنید.

اگر هنوز ایمیل دوم خود را در این مرورگر که در حال اتصال به آن هستید وارد نکرده اید، در پنجره بعدی باید نام کاربری و رمز عبور خود را از آن وارد کنید. مثال:

پس از آن، روی "Allow" کلیک کنید (به ایمیل در Mail.ru اجازه می دهید از برخی از داده های ایمیل دوم متصل استفاده کند).

اگر همه چیز به خوبی پیش رفت، پیامی دریافت خواهید کرد که کلکتور اضافه شده است. اکنون باید انتخاب کنید که کدام پوشه نامه را جمع آوری کند: در یک پوشه مخصوص ایجاد شده با نام نامه ای که متصل کرده اید یا در صندوق ورودی. این به شما بستگی دارد که تصمیم بگیرید، اما، به نظر من، زمانی که نامه های جمع آوری شده از صندوق پستی دیگر به یک پوشه جداگانه می رود راحت تر است. به هر حال، می توان با فیلتر کردن حروف پیکربندی کرد.

گزینه «اعمال فیلترها برای ایمیل‌های دریافتی» به این معنی است که تمام فیلترهایی که قبلاً در نامه اصلی Mail پیکربندی کرده‌اید، برای نامه‌های دریافتی از صندوق پستی متصل نیز اعمال می‌شود. غیرفعال کردن یا نشدن به شما بستگی دارد.

همین، نامه جمع کن راه اندازی شد! اکنون، در عرض چند دقیقه (گاهی اوقات در صورت وجود تعداد زیادی حروف در نامه‌های متصل، فرآیند به تأخیر می‌افتد)، نامه‌های صندوق پست دوم به صندوق پست اصلی شما وارد می‌شود.

به این ترتیب، می توانید هر تعداد ایمیل را که دوست دارید جمع آوری کنید، متصل کنید.

چگونه می توان تمام حروف را از نامه های متصل به طور جداگانه مشاهده کرد؟

اگر هنگام تنظیم مجموعه نامه در Mail، اشاره کرده اید که نامه ها باید در یک پوشه جداگانه با نام صندوق پستی متصل جمع آوری شوند، می توانید حروف را جداگانه نگاه کنید. در این صورت، این پوشه را باز کنید و تمام حروف مورد نیاز خود را مشاهده خواهید کرد. مثال:

اگر دریافت نامه ها را فوراً در یک پوشه جداگانه پیکربندی نکردید، می توانید در هر زمان با باز کردن جمع کننده ایجاد شده آن را پیکربندی کنید (در ادامه در این مورد بیشتر توضیح دهید).

پیکربندی جمع‌آورنده حروف ایجاد شده، خاموش و روشن کردن آن

گاهی اوقات ممکن است لازم باشد تنظیمات مربوط به جمع آوری نامه را که در Mail ایجاد کرده اید تغییر دهید و همچنین آن را غیرفعال یا دوباره فعال کنید.

این را می توان در همان بخش "تنظیمات" - "ایمیل از صندوق های پست دیگر" انجام داد، جایی که شما در ابتدا جمع کننده نامه خود را ایجاد کردید.

در اینجا کلکتور تولید شده را خواهید دید. اگر می خواهید دوباره آن را خاموش یا روشن کنید، روی سوئیچ مربوطه کلیک کنید. اگر نیاز به باز کردن تنظیمات کلکتور دارید، روی "تغییر" کلیک کنید.

و همان تنظیمات برای جمع آوری نامه باز می شود، مانند مرحله ایجاد آن (نگاه کنید به).

مقالات مرتبط برتر