لائحة الطعام
مجاني
تحقق في
الرئيسية  /  الوسائط المتعددة / ضبط مجموعة بريد ياندكس. جمع كل الحروف من صناديق مختلفة في واحد

إعداد مجموعة بريد ياندكس. جمع كل الحروف من صناديق مختلفة في واحد

ربما الوحدات فقط لم تصادف المشكلة التي هم العنوان الإلكتروني أوقفهم مثل أو لا تحتاج فقط. ولكن في حالة توصيل عدد كبير من جهات الاتصال بالمربع، فقد أخسره الذي لا أريده.

الحل الأول الذي يمكن أن يتبادر إلى الذهن هو إنشاء عنوان جميل جديد وفي نفس الوقت للتحقق من الثانية باستمرار. انه لامر معقد. في هذه الحالة، نبدأ في إنشاء صناديق أكثر وأربك مع عدد كبير من العناوين.

هناك العديد من المضايقات: هناك خطر تنويه كلمة المرور، لا يزال يزعج العنوان [البريد الإلكتروني المحمي]عندما تكون مدير شركة جادة، وهناك الكثير!

الحل هو وبسيط للغاية. ومريحة.

عند إنشاء مربع مع عنوان مثالي، قم بتوصيل مجموعة الحروف من البريد القديم. يمكن العثور على جميع الحروف من المربعات المتصلة داخل البريد الرئيسي في مجلدات نفس الاسم. كل شيء بدقة ومفهومة وأمر.

يحفظ المجمع الوقت للتبديل من المربع إلى المربع ويسمح لك بالذهاب بالكامل إلى عنوان جديد دون خوف من أن يبقى شخص ما دون إجابة.

كيفيه التنصيب؟

مرة أخرى. كل شيء بسيط جدا. نحن نروي:

  1. انتقل إلى إعدادات صندوق البريد الخاص بك؛
  2. حدد القسم "البريد من مربعات أخرى"؛
  3. أدخل عنوان البريد الإلكتروني وكلمة المرور من المربع الذي تريد جمع الحروف منه.

بعد توصيل عنوان جديد، سترى ذلك إجمالي القائمة في نفس الصفحة.

في هذا القسم، يمكنك بسهولة إدارة المجمع: وقفة العمل أو حذف أو إضافة مربعات إضافية. سيتم تخزين الحروف التي تم جمعها في مجلد منفصل مع مجلدات فرعية داخلية تم إنشاؤها بواسطتك في المربع القديم.

بالمناسبة، إذا قررت بحزم استخدام عنوان جميل جديد، لكنك كسول للغاية لإعلام كل من لا يزال يكتب إلى البريد القديم، فقم بتكوين قواعد التصفية مع استجابة تلقائية من عنوان جديد.

للقيام بذلك، قم بتكوين عامل التصفية وفي العمود "إذا كانت الحروف إلى شخص ما" حدد عنوانك القديم. حدد الإجراء "رسالة النتائج". إذا كنت في الرسالة، فستحدد عنوان المربع الجديد، فستتلقى كل من يكتب إلى البريد القديم الإجابة ولن يفقد جهات الاتصال الخاصة بك.

قم بالتبديل من علامة تبويب واحدة مع Gmail إلى آخر مع "Yandex. جيد" مملة إلى حد ما. وإذا كان لديك عشرات حسابات في مقدمي بريد مختلفين، تحقق من الصباح من المراسلات الجديدة ويتحول إلى تعذيب على الإطلاق. من خلال الجمع بين الحروف في مكان واحد، تخلصك من هذا الإزعاج.

واجهة ويب

توفر معظم مزودي البريد الإلكتروني ميزة "جمع البريد الإلكتروني مدمجة" من صناديق بريد متعددة. على سبيل المثال، دعونا نحاول جمع الحروف من جميع صناديقك في حساب Gmail واحد.

بادئ ذي بدء، تأكد من أنه في الخدمة البريدية، من حيث تريد التقاط الحروف، هناك حق الوصول عبر بروتوكول POP. ثم انتقل إلى إعدادات Gmail وانقر فوق "الإعدادات" في الزاوية اليمنى العليا. انقر فوق علامة تبويب الحسابات والعثور على قسم "الحصول على البريد من الحسابات الأخرى".

إضافة حساب، أدخل عنوان البريد الإلكتروني وانقر فوق "التالي"، ثم استمتع بكلمة المرور. من أجل تبادل البريد بين مقدمي الخدمات أكثر أمانا، تأكد من أن الخيار "يستخدم دائما اتصال محمي (SSL) عند استلام البريد. ثم انقر فوق "إضافة حساب".

الآن سيتم جمع الرسائل القادمة إلى العنوان المضافة تلقائيا في علبة الوارد الخاصة ب Gmail الخاص بك. يمكنك إضافة العديد من عناوين البريد كما تحتاج.

عملاء سطح المكتب

البريد الإلكتروني تحتاج البرمجيات. نعم، يمكنك أن تفعل الكثير في عميل البريد (في بعض الأحيان أكثر بكثير مما يسمح لك Google الآن بالقيام به في Gmail). لكن واجهة الويب غير مقارنة بالتطبيق الأصلي. حتى موقع الويب الأكثر حداثة هو عنق الزجاجة في العمل مع البريد.

منتديات نيدلمان، cne.com

سطح المكتب عملاء البريد جيد في أنهم يمكنهم إجمال الحروف من مجموعة متنوعة من الحسابات. في الوقت نفسه، يمكنك العمل مع العشرات من العناوين ولا تفكر في ما هو مزود خدمة الخدمة.

معظم عملاء البريد الإلكتروني المصنوعة يدويا لديهم علبة الوارد الإجمالية المدمجة. حتى إذا كان عميلك المفضل يدعم العمل فقط مع مجلدات منفصلة للرسائل الواردة، فلا يزال بإمكانك تجميعها بسهولة مع المرشحات الذكية.

على الرغم من حقيقة أن Outlook مصمم لإدارة صناديق بريد متعددة متعددة، فإنه لا يزال يعرض صندوق الوارد منفصل لكل حساب. ولكن يمكن تصحيحها بسهولة باستخدام المرشحات.

Outlook Outlook، انتقل إلى علامة التبويب "مجلد" وانقر فوق "إنشاء مجلد البحث" على شريط الأدوات. ثم حدد "إنشاء مجلد بحث مخصص". انقر فوق "تحديد"، ولكن لا تحدد معايير البحث بحيث تذهب جميع الرسائل الجديدة إلى المجلد. قم بتسمية المجلد كما تريد، على سبيل المثال "All Mail".

انقر فوق "نظرة عامة"، حدد جميع المجلدات والصناديق التي تريد جمعها من خلال خيار "البحث في المجلدات In Inned".

الآن سوف تظهر الحروف من جميع حسابات البريد التي أضفتها إلى Outlook في المجلد الذكي الذي قمت بإنشائه. يمكنك تمكين خيار "عرض المفضلة" بحيث يكون بريدك الجديد في الأفق دائما.

يوفر عميل البريد الإلكتروني Mac مجلد واحد للأحرف الواردة من جميع الحسابات المتصلة. ما عليك سوى إضافة حساباتك، وسيتم جمع جميع الحروف الجديدة في مكان واحد.

في Thunderbird لجمع كل رسالتك في مجلد واحد "وارد" بسيط للغاية. انتقل إلى القائمة عرض (إذا لم يتم عرض شريط القائمة، اضغط ALT). ثم حدد "مجلدات" → "مجتمعة". الآن سيكون لديك مجلد "علبة الوارد" واحد لأحرف جديدة، مجلد واحد "Cherniviki"، مجلد واحد "تم إرسال" وأرشيف واحد ". لن تضطر إلى البحث عن وقت طويل. في هذه الحالة، ستكون الرسائل، كما كان من قبل، مخزنة على خوادم مقدمي الخدمات البريدية الخاصة بك.

عملاء المحمول

البريد الوارد المشترك في العديد من عملاء البريد عبر الهاتف المحمول، بما في ذلك Gmail. يجمع تطبيق Gmail حسابات البريد الإلكتروني الواردة، بما في ذلك Yahoo أو Outlook أو خدمات أخرى.

إذا كنت لا تحب التطبيق من Google، يمكنك تجربة عملاء بريد لجهة خارجية مثل Outlook أو MyMail.

ربما لديك أفكارك كيفية تجميع البريد في مكان واحد؟ حصة في التعليقات.

ستناقش هذه المقالة ما "البريد من مربعات أخرى" و "جمع الحروف من حسابات أخرى". وجهات نظر الخدمات البريدية والمقارنات.

عند تحديث وظيفة خدمة البريد، سننشر الأخبار في نهاية هذه المقالة.

خدمة بريد خدمة البريد، محركات البحث تقدم Yandex وجوجل وظائف مفيدة للغاية وغير ضرورية لعدة سنوات، والتي تتيح لك الجمع بين جميع حسابات البريد الإلكتروني الأخرى في بريد واحد. بمعنى آخر، يكلف إضافة وقت واحد وتكوين جميع "رسائل البريد"، وسوف يكون من الممكن إدارتها في نافذة واحدة دون تسجيل دخول وكلمة مرور دائمة.

تقدم لنا خدمات البريد مكانا كبيرا لتخزين جميع الحروف الواردة واجهة مريحة ووظائف الإدارة الجيدة وأكثر من ذلك بكثير. لاختبار قدرات الخدمات البريدية المدرجة، حدد ثلاثة معلمات لتقييم عملها: 1) تحتاج إلى إدارة حسابات البريد الإلكتروني المختلفة، بما في ذلك خدمات مختلفة والمواقع، من خلال عميل بريد واحد؛ 2) لديك توقيع شخصي واسم لكل بريد؛ 3) حذف الحروف من خوادم من حسابات البريد هذه التي تمت إضافتها إلى البريد أو ياندكس أو Google Mail.

مهمتنا تبدو وكأنها هذه:

لذلك، المضي قدما. نختبر أولا الخدمة من mail.ru، والتي تخبرنا: "يمكنك جمع البريد من جميع صناديق البريد الخاصة بك في مربع واحد على mail.ru.

قم بإعداد مجموعة الحروف من أي خادم يعمل على بروتوكول IMAP أو pop3. " لإضافة بريد خارجي آخر غير mail، itox،list، BK، يجب أن يكون لديك بريد واحد على الأقل متوفر بالفعل على الخوادم المدرجة من البريد. بمعنى آخر، تقوم أولا بتسجيل بريد البريد، ثم قم بإضافة حسابات بريد أخرى. عملية التسجيل على البريد بسيطة، فإنه لا معنى له لوصفه، ولكن إضافة بريد إلكتروني آخر إلى حساب المنشور الذي نصفه.

بعد ذلك، ستتم مطالبتك بإدخال اسم مستخدم وكلمة مرور من أي مربع تستخدمه، وفي غضون 3-5 دقائق "سيتم إنشاء" Mail Collector من البريد "مجلد باسم البريد المضافة بجوار مجلدات" علبة الوارد "، "أرسلت"، "البريد المزعج" وغيرها.

في الواقع، سيكسب جامع الرسالة في غضون 10-15 دقيقة وفي المجلد الذي تم إنشاؤه حديثا من المربع الذي حددته سيضيف جميع الحروف. سيأتي جميع الرسائل الواردة للبريد الإلكتروني الجديد إلى هذا المجلد، وسوف تكون ممكنة أيضا إرسال رسائل من المربع المرفق. عند إنشاء حرف جديد، سيظهر "من" الحقل "، حيث يمكنك الاختيار من بينها سيتم إرسال صندوق البريد إلى الرسالة.

يمكن أن تشمل مزايا Mail Service Mail.ru بساطة إضافة وسهولة إعداد مربعات أخرى، لا حاجة لتحديد البروتوكولات المختلفة (POP3 و SMTP). من المهم للغاية لأنه ليس كل مستخدم يعرف ما هو عليه.

تعاني من نقص mail.ru لتعيين اسم وتوقيع لكل بريد جديد تمت إضافته (أي بريد إلكتروني جديد، بالإضافة إلى الرئيسية)، أي اسم وتوقيع البريد الرئيسي سيتم توزيعه على كل عنوان. عيب كبير آخر هو أنه عند تنزيل الحروف في البريد، لا يوجد إمكانية للإزالة التلقائية للأحرف الأصلية من المربع المرفق. لماذا من المهم جدا حذف الحروف من خادم مربع المضافة؟ هذا سوف يتجنب ملء البريد المرفق، لأن حسابات البريد الإلكتروني الخارجية، كقاعدة عامة، لها حجم صغير جدا لتخزين الحروف. على سبيل المثال، عندما يفيض مساحة بريدية في حساب خارجي، لن يقوم Mail.ru بعرض أي أحرف جديدة حتى تدخل في واجهة بريد خارجية ومباشرة من هناك لن تحذف الحروف لتحرير المكان. بالإضافة إلى ذلك، سنحضر البريد إلى البريد على أمل الحصول على مساحة كبيرة لتخزين بريدنا، مما قد يقتصر على استضافة الموارد. وبالتالي، على الرغم من حقيقة أن mail.ru تقدم وحدة تخزين صندوق بريد غير محدود تقريبا، عند إضافة بريد من منطقة مجال أخرى (على سبيل المثال، [البريد الإلكتروني المحمي]) لن تزيد موارد البريد الإلكتروني الإضافية الخاصة بك في mail.ru، وسوف تظل تقتصر على استضافة الموارد (في قضيتنا، موارد primer.ru).

إمكانية إضافة بريد آخر لخدمة البريد لم يروض مهمتنا على نقطتين من ثلاثة، وفي إجمالي درجات واحدة.

True، Mail.Ru لديه طريقة أخرى لإضافة بريد خارجي، وأكثر دقة، الاتصال أو الإدخال إلى البريد الخارجي. تبدو هكذا:

هذه الطريقة ليست مناسبة لمهمتنا، لأن هذا ليس مجمع بريد، ولكن وضع المستخدم الذي يتصل بالبريد وفي كل مرة يقوم بتحميل جميع المجلدات والأحرف في واجهة البريد. ولكن من الممكن إضافة التوقيع الشخصي والاسم لكل بريد هنا، من الممكن إرسال رسائل من البريد الذي تم تكوينه. إزالة الحروف من المربعات المحملة لا يعمل، ل هذا ليس جامع بريد.

مهم! يعتقد بعض المستخدمين عن طريق الخطأ أنه إذا ظهرت الحروف في البريد، يمكن تنظيف البريد الذي حدث به التنزيل. سوف نولي اهتماما مرة أخرى أن mail.ru يعمل كمصباح بريد، وإذا قمت بتنظيف البريد، فسيتم إزالته في المربع الرئيسي، وفي البريد.

الاختبار الثاني ياندكس مع جامع رسالته. يتم تسليم المهام المشابهة ل: اجمع البريد، وتعيين توقيعك واسمك لكل بريد واسم، بالإضافة إلى حذف كافة البريد من المربع المضافة.

تم تكوين جامع الحروف الموجودة في ياندكس بمخطط مماثل، ولكن إذا حدث اتصال البريد من بعض الموقع، على سبيل المثال، Site.ru، ستحتاج إلى تسجيل إعدادات إضافية، راجع لقطة الشاشة.

خدمة البريد فعلت هذا العمل بالنسبة لنا، Yandex عروض الوضع اليدوي إيقاف جميع الإعدادات من بريد الطرف الثالث. لا يوجد شيء معقد هنا: في حقل تسجيل الدخول، ندخل الاسم الكامل للبريد ( [البريد الإلكتروني المحمي])، في حقل الخادم، أدخل المجال فقط (site.ru)، كل الإعدادات الأخرى من الأفضل أن تترك الافتراضي، أو تغيير إذا كنت تعرف ما تفعله. بعد الإضافة الناجحة للبريد، سيظهر النقش:

على عكس البريد، يقترح التجميع، Yandex اختيار ما إذا كان سيتم حفظ الحروف الأصلية في درج إضافي أم لا. في كله، تعمل خطاب الحروف من Yandex على مخطط مماثل مع mail.ru، من الممكن تحديد صندوق بريد لإرسال رسالة منه. ولكن مع توقيع الحروف من Yandex، نفس المشكلة: لا توجد طريقة لتعيين اسم فردي لكل صندوق بريد إضافي لكل صندوق بريد إضافي.

اذا حكمنا من خلال الملاحة، وإمكانية إضافة توقيع فردي لكل صندوق بريد، ولكن في الواقع لا يعمل. حدد البريد، ونصمع الاسم والتوقيع، انقر فوق حفظ. كل شيء، يتم حفظ التوقيع وتشغيله، ولكن يتم حفظه أيضا على جميع صناديق البريد الأخرى، أي تعيين اسم وتوقيعه إلى مربع واحد، يمكنك تغيير هذه المعلمات تلقائيا في جميع رسائل البريد الموحدة في Yandex. حتى في حالة اختيار أي مربع آخر، ستكون التوقيع الآن في كل مكان مماثل.

إجمالي Yandex تم التعب بنجاح مع رسوم الرسوم والفرز، تعرف كيفية إزالة النسخ الأصلية للحروف من المربع المضافة، ولكن لا يعرف كيفية العمل مع التواقيع! مع مهمتنا، لم تكن خطاب الحروف من ياندكس مواجهة واتصال نقطتين من ثلاثة.

أود أن أشير إلى أن "تشغيل" في جميع المجموعات الثلاث في جمعية الحروف، يبدو أن البريد "ينام" وظائفه على يد الإسعاف. على الرغم من أنها ستلبية معظم المستخدمين، إلا أن البريد بصراحة، قام البريد بجامع البريد بالاحتفال في سباق تنافسي. إنه يعمل بشكل جيد ودون إخفاقات، ولكن مع مهمتنا، لم يتعامل المجمع من البريد. في واجهة البريد هناك العديد من كتل الإعلان، لكنها لا تتداخل مع العمل مع الحروف.

أما بالنسبة ل Yandex، الذي قام بإنشاء مجمع حرف منذ وقت طويل، يبدو أن دعم هذه الصناعة الخاصة غير مشغول، لأنه ليس من الممكن تصحيح هذه الوظائف البسيطة (القدرة على إضافة توقيعات متعددة للأدراج) لا يكون من الصعب على هذا محرك البحث القوي. ومع ذلك، فإن Yandex لديه وظيفة أخرى فريدة أخرى، والتي تتيح لك ربط المجالات على خادم DNS الخاص بهم، وعمل بالفعل في إنشاء وتكوين البريد. ولكن بالنسبة لهذه العمليات والإعدادات تتطلب المعرفة والوقت. وعلى الرغم من عدم وجود شيء معقد هناك، إلا أنه ليس من أجل معظم مستخدمي Runet. ميزة كبيرة - لا توجد إعلانات في واجهة بريد ياندكس! ناقص - تقييد في جامع الحروف على 10 صناديق بريد.

النهائي والفائز - جامع الحروف من Google، الذي تم تعامل مع مهمتنا، على الرغم من تقييد في 5 صناديق

ربما، أصبح الكثير منكم في ممارساتنا مهمة جمع البريد من عدد من المربعات. لماذا يمكن أن تكون هناك حاجة؟ ربما لأنها آلية عالمية لتبادل البيانات بين النظم. العديد من المكتبات لأية لغة تقوم بتنفيذ SMTP، POP3، IMAP، حلول جاهزة، مناسبة لتنفيذ كومة الرسائل (كما أجد صعوبة في الاتصال بصندوق البريد ...)، إلخ.

ليس من المستغرب أن يتم تنفيذ العديد من مهام التكامل من خلال البريد. هناك خدمة معينة تعرف كيف يلتقط هذا البريد بسرعة، وتصنيف وإجراء الإجراءات اللازمة.

لمن لا يكفي الكود أدناه - قد لا تقرأ كذلك:

foreach (صندوق بريد فار في صناديق البريد) باستخدام (var client \u003d pop3client جديد () جديد () client.connnect (اسم المضيف، المنفذ، fale)؛ client.authenticate (المستخدم، كلمة المرور)؛ var content \u003d client.getmessagecount ()؛ ل (v أنا \u003d 0؛ أنا< count; i++) { Mail = client.GetMessage(i + 1); var cat = SortMail(Mail); DoSomething(Mail, cat); } }

ماذا نفعل

تقديم فورا عددا من الافتراضات:
1) تحتاج إلى جمع البريد لعدة أنظمة. ربما في المستقبل، أكثر لعدة. ومع ذلك ... بشكل عام، يجب أن يكون الحل عالميا؛
2) قد يكون البريد كثيرا - يتبع من البند 1 (وإلا فلن أكتب هذا المنشور)؛
3) البريد سوف تضطر إلى pars
4) جميع صناديق الخدمة - المستخدمين لا يصعدون هناك.

ما سوف نستخدمه

يجب أن يعمل النظام على مدار الساعة طوال أيام الأسبوع، لذلك نقوم بتنفيذه في شكل خدمة Windows. لهذه الأغراض، أقترح استخدامها على الفور

بالطبع، يجب أن يكون كل شيء مواز. هنا، تأتي مكتبة TPL المفضل الخاصة بي إلى المشهد.

سوف نأخذ البريد بواسطة POP3. جميع "الأشياء المألوفة" IMAP في هذه المهمة غير ضرورية - من الضروري في أسرع وقت ممكن وأسهل في التقاط حرف المصدر وحذفه إلى الخادم. POP3 يكفي للعيون. استخدام openpop.net.

كمراقبة اختيارية، ربط في Zabbix. (اجتمعنا للعمل 24/7 وإصدار سرعة مدح - تحتاج إلى اتباع هذا).

اذهب

إنشاء تطبيق وحدة التحكم العادية. افتح وحدة تحكم Nuget ووضع كل الحزم اللازمة:

تثبيت الحزمة NLOG تثبيت حزمة OpenPop.NET تثبيت حزمة Topshelf تثبيت حزمة Microsoft.TPL.Dataflow
انتقل إلى مجلد المشروع، وإنشاء App.Debug.config و App.release.config. قم بتحميل مشروع من الاستوديو، افتح الكود الخاص به (هنا ثم TopCrawler.csProj). إضافة إلى القسم مع التكوين.

إعدادات

app.config. app.config.


والهدف السفلي ل MSBUILD:

تحويل الهدف.

$ (targetfilename) التكوين


شخصيا، استخدمت بالضبط بهذه الطريقة - بالطريقة القديمة - إضافة تحويل التكوينات إلى وسائط منفصلة.
للراحة، أقترح التكوينات بقوة من النوع. سيتم قراءة فئة منفصلة التكوين. (على الجوانب النظرية لمثل هذا الحل يمكن توصيلها في التعليقات). التكوينات، السجلات، المراقبة - سبب عظيم لتنفيذ نمط Singleton.

قم بإنشاء مجلد في المشروع بنفس الاسم (يجب أن يكون هناك طلب). داخل إنشاء 3 فئة - التكوين، مسجل، Zabbix. لدينا مسجل:

مسجل.

مسجل الدرجة الثابتة (الحصول على؛ مجموعة خاصة؛) Public Static NLOG.LOGGER أرشيف (Get؛ مجموعة خاصة؛) مسجل ثابت () (سجل \u003d Logmanager.getlogger ("Global")؛ الأرشيف \u003d Logmanager. GetLogger ("Archivator")؛ ))


يراقب المراقبة مع Zabbix منشورا منفصلا، لذلك سأغادر ببساطة هنا فئة تنفذ الوكيل:

zabbix.

مساحة الاسم Topcrawler.singleton (///

/// Singleton: Zabbix Sender Class /// ثابت ثابت zabbixsender المرسل (الحصول على؛ مجموعة خاصة؛) zabbix ثابت () (المرسل \u003d zabbixsender جديد () جديد (config.zabbixserver، config.zabbixport)؛) بنية zabbixitem (مضيف السلسلة العامة؛ مفتاح السلسلة العامة؛ قيمة السلسلة العامة؛) Class zabbixsender (senditem zabbixsender (senditem الداخلية (// resharper تعطيل inconsistentnaming - zabbix هو مضيف السلسلة العامة الحساسة. مفتاح السلسلة العامة؛ قيمة السلسلة العامة؛ ساعة سلسلة عامة؛ استجابة السلسلة العامة؛ معلومات السلسلة العامة؛) #Pragma تحذير استعادة 0649 # الإقليمية --- الثوابت --- public const string defaultheader \u003d "zbxd \\ x01"؛ public const string sendrequest \u003d "بيانات المرسل"؛ const int defaulttimeout \u003d 10000 ؛ #endredregion # الإقليمية --- الحقول --- Private Readonly DateTime _DTUNIXMITTIME \u003d DateTime.Specifyind (تاريخ جديد (1970، 1، 1)، DateTimekind.utc)؛ خاص Readonly Inttimeout؛ سلسلة Readonly الخاصة _zabbixserver؛ Readonly Readonly Int _zabbixport؛ #endredregion # الإقليمية --- المصانع --- الجمهور Zabbixsender (سلسلة zabbixserver، int zabbixport): هذا (zabbixserver، zabbixport، defaulttimeout) () الجمهور zabbixserender (string zabbixserver، int zabbixport، int timeout) (_zabbixserver \u003d zabbixserver؛ _zabbixport \u003d zabbixport؛ _timeout \u003d مهلة؛) #endregion # الإقليمية --- طرق --- سلسلة SendDATA العامة (RENDER SENDDATA (قائمة جديدة (1) (ITM))؛ ) السلسلة العامة SendDATA (قائمة lstdata) (جرب (var serializer \u003d javascript()؛ var القيم \u003d قائمة جديدة (lstdata.count)؛ القيم.Addrange (المضيف \u003d ITM.host، مفتاح \u003d ITM.KEY، القيمة \u003d ITM.Value، Clock \u003d Math.Floor. )) var json \u003d serializer.Serialize (جديد (طلب \u003d sendrequest، البيانات \u003d القيم.toArray ()))؛ var header \u003d encoding.ascii.getbytes (defaultheader)؛ var الطول \u003d bitconverter.getbytes ((طويل) json.length)؛ var data \u003d encoding.ascii.getbytes (JSON)؛ var packet \u003d البايت الجديد؛ buffer.blockcopy (رأس، 0، حزمة، 0، header.length)؛ buffer.blockcopy (الطول، 0، الحزمة، الرأس. طول الطول)؛ buffer.blockcopy (البيانات، 0، الحزمة، الرأس. طول الطول + طول، data.length)؛ باستخدام (Var Socket \u003d مقبس جديد، Sockettype.stream، protocoltype.tcp)) (_zabbixserver، _zabbixport)؛ المقبس .send (حزمة)؛ // رأس var العازلة \u003d البايت الجديد؛ receivdata (المقبس، المخزن المؤقت، 0، buffer.length ، _timeout)؛ إذا (defaultheader! \u003d encoding.ascii.getstring (المخزن المؤقت، 0، buffer.length) رمي استثناء جديد ("رأس غير صالح")؛ // رسالة مخزنة طول الرسالة \u003d البايت الجديد؛ receivdata (المقبس، العازلة، 0 Var.Length، _Timeout ength \u003d bitconver.toint32 (المخزن المؤقت، 0)؛ إذا (DataLength \u003d\u003d 0) رمي استثناء جديد ("طول البيانات غير صالح")؛ // رسالة المخزن المؤقت \u003d البايت الجديد؛ receivdata (المقبس، المخزن المؤقت، 0، buffer.length، _timeout)؛ var استجابة \u003d serializer.Deserialize (encoding.ascii.getstring (المخزن المؤقت، 0، buffer.length)؛ Return String.Format ("الاستجابة: (0)، معلومات: (1)"، استجابة. Response، Response.info)؛ )) الصيد (استثناء E) (return string.format ("استثناء: (0)"، e)؛) خاص الفراغ ثابت receivdata (المقبس pobjsocket، العازلة البايت، int إزاحة، حجم البط، مهلة int) (var startickcount \u003d Environment.TickCount؛ تلقى var. ؛. ) بينما (تلقى< size); } #endregion } }


التكوينات ... لقد حان الوقت للقيام بشيء مثيرة للاهتمام على الأقل. أولا، في التكوينات سنخزن الصناديق التي نقيمها. في إعدادات البيانات الثانية. أقترح:

التكوين



لذلك، المضيف والمنفذ حيث يتم توصيله، المستخدم وكلمة المرور - كل شيء واضح هنا. نوع إضافي من المربع. لنفترض أن الخدمة يستخدمها التسويق (وكذلك الإدارات الأخرى). لديهم أدراج حيث ستسقط المؤتمرات على البريد الإلكتروني، وكذلك تقارير FBL SPAM. تم تصنيف المربع نفسه بالفعل حرفا، لذلك لتحديد هذه الحالات على الفور نوع المربع. مع إعدادات ملفات البيانات، سيكون من الواضح متى أبدأ في إنشاء كائنات. هنا سنحصل على أقسامنا الخاصة في التكوين. كتيبات كومة كيفية القيام بذلك، لذلك أنا فقط أظهر النتيجة:

نحن نحدد أنواع

# الإقليمية --- أنواع --- STATIC Class Mailboxtypextype (Public Const String Bo \u003d "Bo"؛ Public Const String CRM \u003d "CRM"؛ STOM CONST سلسلة FBL \u003d "FBL"؛ Public Const String Bounce \u003d "Bounce"؛) Class MailboxBoxinfo (نوع السلسلة العامة (GET؛) STRESTS HOSTNNAME (GE؛ Set؛ Set؛) مستخدم السلسلة العامة (احصل على؛ تعيين؛ تعيين؛ كلمة مرور السلسلة العامة (Get؛ Set؛) Public Int Port (Get؛ Set؛) احصل على؛ تعيين؛) Balany INT BentdedDedcapity (Get؛ Set؛ تعيين؛ Datablockoptions العام () (MAXDOP \u003d 1؛ BoundedCapity \u003d 1؛) #ENDRECE


إنشاء أقسام

///

/// قسم التكوين المخصص /// Customets ClassettingsConfectionFigSection: التكوينات (بيانات اعتماد بيانات الاعتماد العامة (احصل على (إرجاع قاعدة ["إرجاع قاعدة [" reformentslist "] كأوراق بيانات الاعتماد؛)tionsfollectionOpetersItemsItems (احصل (Base Base [" DataFlowOpetslist "]


///

/// جمع مخصص - قائمة بيانات الاعتماد /// طب وجود بيانات اعتماد الطبقة العامة: ضبط الاعناقاتالمنتجات، ienumerable (تحريك عملية التصويت المحمي CreateDeNewELement () (إرجاع بيانات اعادة التحقق الجديدة ()؛ ) العام الجديد ienumerator < Count; i++) { yield return BaseGet(i) as CredentialsElement; } } } /// /// عنصر اعتماد مخصص البند /// البحث عن الطبقة العامة: ضبط التصويت (قاعدة الإرجاع ["اسم المضيف] كسلسلة؛ اسم مستخدم السلسلة العامة (قاعدة الإرجاع [" اسم المستخدم "] كسلسلة؛) كلمة مرور السلسلة العامة (قاعدة الجبر [" كلمة المرور "] كسلسلة؛) نوع السلسلة (احصل (إرجاع قاعدة ["نوع"] كسلسلة؛) منفذ السلسلة العامة (قاعدة العودة ["المنفذ"] كسلسلة؛) /// /// مجموعة مخصصة - قائمة خيارات Datablock /// DatablockoptionscollectionCollection: ضبط الاعداداتإدخال، ienumerable (تحديد مواعيد التكوين المحمي CreateDenewelement () (إرجاع DatablockoptionSeLement ()؛) GetelementKey ObjectKey Object Object (إرجاع ((DatablockOpionSeLement) (إرجاع ((DatablockOpionSeLement) .NAME؛) بيانات الإقامة العامة هذا (احصل عليه (إرجاع النجمة (الفهرس) ) العام الجديد ienumerator getenumerator () (ل (var i \u003d 0؛ أنا< Count; i++) { yield return BaseGet(i) as DataBlockOptionsElement; } } } /// /// خيارات datablock مخصص البند /// DatablockoptionSeLement: ضبط التصويت على نوعية (اسم السلسلة العامة] كسلسلة؛)) سلسلة عامة MAXDOP (قاعدة الإرجاع [MaxDOP] كسلسلة؛) Boundedcapity String String (قاعدة Geturn ["Boundedcapity"] كسلسلة؛))


لن أكتب التنفيذ الكامل للتكوين، وهو ضمني أنه في عملية تطوير المعلمات التي نحتاج إلى إضافتها هناك.

سيتم قراءة إعداداتنا المخصصة مثل هذا:

مستعد

القائمة العامة. بيانات الاعتماد (الحصول على؛ مجموعة خاصة؛) قاموس عام DataFlowOptionslist (احصل على؛ مجموعة خاصة؛) ... Config Config () (TRY (VAR CustomConfig \u003d (GuardsettingSconfecection) ConfigurationManager.getSection ("Custhyettings")؛ // الحصول على صناديق البريد foreach (var item في custom comcedconfig.credentialitems) بيانات الاعتماد .add ( New MailBoxBoxinfo (hostname \u003d item.hostname، port \u003d convert.toint32 (item.port.port)، user \u003d item.username، اكتب \u003d item.type، كلمة المرور \u003d item.password))؛ // احصل على إعدادات البيانات foreach (var item في customconfig.dataflowoptionsiTems) dataflowoptionslist.add (item.name، datablockoptions جديد (maxdop \u003d convert.toint32 (item.maxdop)، boundedcapity \u003d convert.toint32 (item.boundedcapacity)))؛) الصيد (استثناء السابق) (logger.log. قاتلة ("خطأ في قراءة التكوين: (0)"، Ex.Message)؛ رمي؛))


بطريقة ما لفترة طويلة للغاية، ونحن لم نصل حتى أكثر إثارة للاهتمام.

خفض الربط من Topshelf وعدادات الأداء والتواصل مع قاعدة البيانات والتحول إلى النقطة! إنشاء فئة الزاحف - الأساسية. لتبدأ، قراءة البريد:

Bool Portile Pollatile _Stoppipeline؛ ... Public Void Start () (افعل (var getmailsks \u003d _config.credentialslist.select ((بيانات الاعتماد \u003d\u003e task.run (() \u003d\u003e getmails (بيانات الاعتماد))). tolist ()؛ foreach (مهمة var في getmailstasks) المهمة. Wait ()؛ Thread.Sleep (2000)؛) أثناء (! _Stoppipeline)؛ // إيقاف خط أنابيب - انتظر إكمال جميع نقاط النهاية // سيكون هناك إيقاف dataflow من الناقل (_stoppipeline) logger.log. تحذير ("لقد تم إيقاف تشغيل خط الأنابيب من قبل المستخدم")؛)
هنا، استغرق لينا بلده وقررت ألا أزعج - إذا كانت صناديق حوالي 20-30 يمكن استخدامها لكل مهمة وليس البخار عن عدد التدفقات. (أنا اسمح لك بإلقاء الطماطم.)

الذهاب إلى القراءة:

getmails الفراغ الخاص (معلومات mailboxinfo) (حاول (باستخدام (var client \u003d pop3client () جديد ()) (
فورا، فكر في توقيت الوصول إلى المربع - من المفيد لتشخيص الشبكة وحمل عبء العمل.

// احصل على Zabbix Metrics Var StopWatch \u003d ساعة توقيت جديدة ()؛ stopwatch.start ()؛ // الحصول على عد البريد العميل .Connect (info.hostname، info.port، خطأ)؛ client.authenticate (info.user، info.password)؛ stopwatch.stop ()؛
نرسل البيانات إلى zabbix. كل شيء بسيط - حدد اسم المضيف (كما هو موجه في Zabbix)، المفتاح (مرة أخرى بدقة كما هو الحال في Zabbix) وقيمة سلسلة.

// أرسلها إلى Zabbix zabbix.sender.senddata (جديد zabbixitem (host \u003d config.hostkey، key \u003d info.type + config.timingkey، value \u003d stopwatch.lapsedmilliseconds.tostring ()))؛ logger.log.debug ("إرسال [(0)] توقيت zabbix: متصل ب" (1) "ك" (2) "، توقيت (3) MS"، info.type، info.hostname، info.user، StopWatch.LAPSEDMILISECONDS)؛ var count \u003d client.getmessagecount ()؛ إذا (العد \u003d\u003d 0) العودة؛ logger.log.debug ("نحن" حصلنا على رسائل جديدة (0) في "(1)"، عد، معلومات، UNFO.USER)؛ // إرسال رسائل إلى فرز كتلة ل (var i \u003d 0؛ أنا< 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 عند إنشاء فئة زحافة. نعتقد أن المرحلة الأولى هي فرز الرسالة.

بينما (! _sortmaildatablock.post (mailinfo)) thread.sleep (500)؛
انظر كيف هو بسيط هو الناقل وحده. جميع الآخرين، قراءة البريد، ورمي الرسائل هناك واحدا تلو الآخر. إذا كانت الكتلة مشغولة، فسوف تعيد النشر كاذبا وسننتظر ببساطة حتى يكون حرا. في وقت لاحق في ذلك الوقت يستمر في العمل. أنني أسمي التوازي دون قلق.

ذهبت الرسالة إلى الناقل، الآن من الممكن حفظها بروح هادئة في الأرشيف الخام (نعم! كل ما نقرأه - احفظه على أرشيف الملفات. ستقل خدمة الدعم ثم القول شكرا لك لاحقا).

دعنا نكون تكوين، على سبيل المثال، دوران الأرشيف:

nlog.config.



ثم يمكنك رفع logstash، ولكن هذه قصة أخرى ...

// حفظ كل بريد إلى أرشيف logger.log.debug ("رسالة الأرشيف")؛ logger.archive.info (الوظائف.messagetostring (mailinfo.mail))؛ ) الصيد (استثناء السابقين) (logger.log.Error ("تحليل خطأ البريد الإلكتروني: (0)"، ex.message)؛ وظائف. الدينورات .incrent ()؛ // أرشيف البريد على أي طريق logger.log.debug ("أرشيف رسالة ")؛ logger.archive.info (encoding.default.getstring (client.getmessageeasbytes (i + 1)))؛) إذا (_config.deletemail) client.deletemessage (i + 1)؛ إذا (_stoppipeline) استراحة؛ ) logger.log.debug ("تم مع" (0) "، info.user)؛ )) الصيد (استثناء السابقين) (logger.log.Error ("خطأ عام - النوع: (0)، الرسالة: (1)"، السابقين، ex.message)؛ وظائف. reserrorscounters.incrent ()؛)
هنا استخدمنا عدادات الخطأ الثابتة (في سياق أنواع الصناديق)، حيث realorscounters هي:

القاموس الثابتة العامة أخطاء errorscounters \u003d قاموس جديد ();
ويمكن القيام بالمتر أنفسهم مثل هذا:

مواجهة.

عداد الطبقة (طويل _Counter طويل؛ العداد العام () (_counter \u003d 0؛ زيادة الفراغ العام () (المتشابكة. التنشيط (المرجع _counter)؛) العام قراءة طويلة () (عودة _counter؛) العام تحديث طويل () (العودة المتشابكة . exchange (المرجع _counter، 0)؛) إضافة باطلة عامة (المرجع _counter، القيمة)؛) Set.exchange العامة (المرجع _Counter، القيمة)؛)


دعونا ننتقل إلى إنشاء الناقل. لنفترض أن لدينا أدراج حيث تتوحذ تواتير السيارات. يجب أن يتم رسم هذه الرسائل (ما هو الرد التلقائي، من من، وفقا له القائمة البريدية، وما إلى ذلك) وقم بتطوي النتيجة في المستودع (قاعدة البيانات). لنفترض أن هناك صناديق حيث تسقط تقارير FBL. هذه الرسائل تضيف على الفور إلى قاعدة البيانات. جميع الحروف الأخرى تنظر في "مفيدة" - يجب فحصها على البريد العشوائي وإرسالها إلى النظام الخارجي، على سبيل المثال، CRM.

كما تفهم بالفعل، يعتبر هذا المثال بشكل رئيسي تطبيق جامع المهام التسويقية - مجموعة الإحصاءات عن التسليم البريدي، معلومات البريد العشوائي.

لذلك، قررنا على سير العمل. نعلن الكتل الضرورية في فئة الزاحف:

Class MessageInfo (Get؛ Bool Bool Isspam (Get؛ Set؛ Set؛) السلسلة العامة الفرعية (الحصول على؛ تعيين؛) مستلم السلسلة العامة (الحصول على؛ تعيين؛ نوع؛ messageType النوع (الحصول على؛ تعيين؛ البريد العامين البريد العام (الحصول على؛ تعيين؛ تعيين؛) ) الطبقة الزاحف (// خط أنابيب النقل الخاص _sortmaildatablock؛ تحويل خاص. _spamfilterdatablock؛ تحويل خاص. _checkbouncedatablock؛ تحويل خاص. _identifydatablock؛ العمل الخاص. _addtocrmdatablock؛ العمل الخاص. _addtofbldatablock؛ العمل الخاص. _addtobouncedatablock؛ ...
قم بإنشاء طريقة تهيئة وإنشاء كتل الناقل (لتهيئة الكتل، نستخدم أقسامنا الرائعة من التكوينات):

الفراغ العلني INIT () (// *** إنشاء خط أنابيب *** // قم بإنشاء تحويل محول للحصول على حظرات نوع الرسائل var \u003d _config.getDatablokooptions ("_ sortmaildatablock")؛ _sortmaildatablock \u003d تحويل جديد (Mail \u003d\u003e Snotmail (Mail)، executiondataflockoptions (maxdegreeofparallelilism \u003d blockoptions.maxdop، boundedcapity \u003d blockoptions.boundedcapacity))؛ / / قم بإنشاء تحويل محول لتصفية حظرات البريد المزعج \u003d _config.getDatablokooptions ("_ spamfilterdatablock")؛ _spamfilterdatablock \u003d تحويل جديد (البريد \u003d\u003e filterspam (mail)، executionDataflockoptions جديد (maxdegreeofparallism \u003d blockoptions.maxdop، boundedcdop \u003d blockoptions.boundedcapity))؛ / / قم بإنشاء تحويل محول لفرز حظرات BOUNES \u003d _Config.getDatablocOptions ("_ Checkbouncedatatablock")؛ _checkbouncedatablock \u003d تحويل جديد (البريد \u003d\u003e bouncetypecheck (mail)، executiondataflowflockoptions (maxDegreeofparallism \u003d blockoptions.maxdop، boundedcapity \u003d blockoptions.boundedcapacity))؛ / / قم بإنشاء تحويل محول لتحديد حظرات مالك ترتد \u003d _config.getDatablockOptions ("_ تحديد القابلية")؛ _identifydatablock \u003d تحويل جديد (البريد \u003d\u003e getrecipient (mail)، executiondataflockoptions جديد (maxdegreeofparallelism \u003d blockoptions.maxdop، boundedcapacity \u003d blockoptions.boundedcapity))؛ / / قم بإنشاء ActionBlock لإرسال البريد إلى حظر CRM \u003d _Config.getDatablocitions ("_ addtocrmdatablock")؛ _addtocrmdatablock \u003d عمل جديد (البريد \u003d\u003e addtocrm (mail)، executiondataflockoptionsptions (maxdegreeofparallism \u003d blockoptions.maxdop، boundedcapacity \u003d blockoptions.boundedcapity))؛ // قم بإنشاء ActionBlock لإرسال FBL إلى MailWh MailWomptions \u003d _Config.getDatablocOptions ("_ addtofbldatablock")؛ _addtofbldatablock \u003d عمل جديد (البريد \u003d\u003e addtofbl (mail)، executiondataflockoptionsptions (maxdegreeofparallymelism \u003d blockoptions.maxdop، boundedcapacity \u003d blockoptions.boundedcapacity))؛ / / قم بإنشاء ActionBlock لإرسال ترتد إلى حظرات البريد WAWH \u003d _Config.getDatablocOptions ("_ addtobouncedatablock")؛ _addtobouncedatablock \u003d عمل جديد (Mail \u003d\u003e AddTobounce (Mail)، التنفيذ الجديد DataDataFlockOptions (MaxDegreeOpParAlimism \u003d حظر القوارض. Maxdop، BoundedCapity \u003d حظرات. BoundedCapacity))؛
جمع الناقل وفقا لمخططنا:

// *** بناء خط أنابيب *** _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. ()، معلومات \u003d\u003e info.type \u003d\u003d messageType.unknown)؛ / * كعب * / _checkboundatablock.linkto (_identifydatablock)؛ _IdentifyDatablock.linkto (_addtobouncedatablock)؛ _spamfilterdatablock.linkto (_addtocrmdatablock، معلومات \u003d\u003e! info.isspam)؛ _spamfilterdatablock.linkto (dataflowblock.nulltarget. ()، معلومات \u003d\u003e info.isspam)؛ / * كعب * /
كما ترون، كل شيء بسيط للغاية - نحن نربط الكتلة مع ما يلي (مع إمكانية تحديد حالة الاتصال). يتم تنفيذ جميع الكتل بالتوازي. تتمتع كل وحدة بدرجة من التوازي والحاوية (باستخدام الخزان، يمكنك ضبط قائمة الانتظار قبل الحظر، أي رسالة وحدة مقبولة، ولكن لا تطلب بعد). وبالتالي، من الممكن تحديد درجة عالية من التوازي عن "المعقدة" والعمليات الطويلة، مثل تحليل محتويات الرسالة.

لن أصف Dataflow Matchaw، من الأفضل قراءة كل شيء في مصدر TPL DataFlow.

sortmaildatablock.completion.continuewith (t \u003d\u003e (ifataflowblock) ((idataflowblock) .fault (t.exception)؛ _spamfilterterdatablock.complete ()؛)؛ _sortmaildatablock.completion.continuewith (t \u003d\u003e (ifataflowblock) _addtofbldatablock) .fault (t.exception)؛ _addtofbldatablock.complete ()؛)؛ _sortmaildatablock.completion.continueWith (T \u003d\u003e (ifataflowblock) .fault (t.exception)؛ _checkbouncedatablock.complete ()؛)؛ _spamfilterdatablock.complettion.continuewith (t \u003d\u003e (إذا (t.isfolfed) ((idataflowblock) .fault (t.exception)؛ _addtocrmdatablock.complete ()؛)؛ _Checkbouncedatatablock.complettion.continueWith (T \u003d\u003e (ifataflowblock) ((idataflowblock) .fault (t.exception)؛ _identifydatablock.complete ()؛)؛ _IdentifyDatablock.completion.continueWith (T \u003d\u003e (ifataflowblock) _addtobouncedatablock) .fault (t.exception)؛ _addtobouncedatablock.complete ()؛)؛ في
كل شيء، في الواقع، يكون الناقل يعمل بالفعل، يمكنك نشر رسائل إليه. يبقى فقط لإيقافه إضافة طريقة البداية لدينا:

بداية.

باطلة عامة البداية () (افعل (var getmailsks \u003d _config.credentialsslist.select (() \u003d\u003e getmails (() \u003d\u003e getmails (())). tolist ()؛ foreach (مهمة var في getmailsks) المهمة. انتظر () ؛ thread.Sleep (2000)؛) أثناء (! _stoppipeline)؛ // توقف خط أنابيب - انتظر الانتهاء من جميع نقاط النهاية _sortmaildatablock.complete ()؛ _addtocrmdatablock.completion.wait ()؛ _addtofbldatablock.wait ()؛ _addtobouncedatablock. الانتهاء. انتظر ()؛ إذا (_stoppipeline) logger.log.warn ("تم إيقاف خط الأنابيب من قبل المستخدم")؛


الذهاب للمندوبين.
الفرز ... حسنا، دعنا نقول أننا جميعا لدينا جميعا (تعقيد، ثم لدينا دائما وقت لتعقد):

messagleinfo sortmail (mailboxtype.crm: mail.type \u003d messageType.general؛ استراحة؛ حالة mailboxtype.bounce: mail.type \u003d messageType.pion؛ استراحة؛ حالة mailboxtype. fbl: mail.type \u003d messageType.fbl؛ استراحة؛) العودة؛) العودة بريد؛)
فلتر البريد المزعج. هذا على الواجبات المنزلية - استخدام spamassassin.
هنا هو مندوب:

Message MessageInfo Filterspam (MessageInfo Mail) (// toDo: أضف البريد الإلكتروني SPAMASSASSIN LOGIC العودة؛)
وفئات للعمل مع Api Spamassassin (رابط للمشروع).
ونذهب إلى فراق الحروف. Parsim نحن المتمرد التلقائي. إنه يأتي إلى أعمال MEF.
قم بإنشاء مشروع (DLL) مع واجهات الإضافات لدينا (دعونا ندعو واجهات).
أضف واجهة:

الواجهة العامة ICONDITITITION (سلسلة تحقق (رسالة mimemessage)؛) الواجهة العامة iconditionmetatata (نوع النوع (الحصول عليها؛))
وكل شيء. تعتمد TopCrawler لدينا على هذا المشروع والمشروع مع الإضافات سوف تستخدمه أيضا.
إنشاء مشروع جديد (DLL أيضا)، دعونا ندعو الظروف.
إضافة أنواع الإجابات:

# الإقليمية --- أنواع --- Bouncetype الفئة الثابتة (String String Full Full \u003d "Bouncetypefull"؛ تتبع String String Construment \u003d "Bouncetypetimeout"؛ رفضت سلسلة Conster العامة \u003d "Bouncetyperefused"؛ Public Const String notfound \u003d "bouncetypenotfound"؛ الجمهور const string غير نشط \u003d "bouncetypeinactive"؛ العام const string outofoffice \u003d "bouncetypeoutofoffice"؛ public const string hostnotfound \u003d "bouncetypehostnotfound \u003d" constypehostnotfound "؛ public const string غير مملوءة \u003d" bouncetypenota الفاحص "؛
وفئات تنفذ واجهةنا:

Conditions ClassnoTyNotfound1: icon mimemessage (إذا (! mimemessage.messagepart.ismultipart.ismultipart) عودة فارغة؛ const string نمط \u003d "رمز التشخيص :. + SMTP. + 550"؛ var regexp \u003d جديد regex (نمط، regexoptions.ignorecase)؛ العودة mimemessage.messagepart.messagepart.messagepart.any (part \u003d\u003e part.contenttype.mediatype \u003d\u003d "رسالة / حالة التسليم" && regexp.ismatch (part.getbodyastext ()))؟ bouncetype.notfound: null؛) ...) ... ConditionTimeout2: Icondition (عودة Bouncetype.timeout؛) ...
كما تركر القضية بأكملها في السمات. مع الإضافات الخاصة بهم وسيتم تحميلها.
العودة إلى المشروع الخاص بنا ومكونات الإضافات:

من الدرجة المجنزرة (... // الإضافات العامة Ienumerable \u003e BounCetypeConditions (Get؛ Set؛) Void LoadPlugins الخاص (TRY (TRY (VAR Container \u003d تكوين تكوين جديد (جديد Directoryalog.Catalog (_Config.Plugindirectory)، TRUE)؛ حاوية ComposPosarts (هذا)؛) الصيد (استثناء السابق) (logger.log .ROR ("غير قادر على تحميل الإضافات: (0)"، Ex.Message)؛))) ...
loadplugins سحب في مصمم صفنا. لشرح بالتفصيل حول آلية التنزيل لن - ستعامل Google بشكل أفضل.

الذهاب إلى مندوبي فحص نوع ترتد. سيتم تطبيق الشروط بدورها حتى تعمل أولا - الطريقة الحصرية:

MessageInfo Bouncetypecheck (TRY (Var Res \u003d condition.value.check (mailInfo.mail)؛ إذا (mailInfo.mail)؛ إذا (res \u003d\u003d null). mailInfo.subtype \u003d res؛ logger.log .debug ("حالة ترتد نوع [(0)] الناتجة عن رسالة [(1)] "، mether.metata.type، mailinfo.mail.headers.messageid)؛ استراحة؛) الصيد (استثناء السابقين) (logger.log .error (" فشل في تحديد نوع الارتداد للرسالة " (0) ": (1)"، mailInfo.mail.maiders.messageid، ex.message)؛ logger.errorscounters.incrent ()؛) إرجاع mailinfo؛)
وبالتالي، إذا ظهر المنطق الجديد كافيا فقط لإضافة فئة جديدة إلى المشروع مع الإضافات التي تنفذ واجهةنا و - فويلا! مثال على البرنامج المساعد الثاني لتحديد مرسل الرسالة لن ينطبق - لذلك بالفعل منشور طويل (تم إنشاء الرد التلقائي الخادم نفسه، لذلك يجب أيضا رسم المرسل من رؤوس الرسالة).

مع تسجيل النتائج في قاعدة البيانات، لا شيء غير عادي. على سبيل المثال، لذلك:

Private Void AddTobounce (mailwh.bounceadd (البريد)؛ وظائف .ProcessedCounters.incrent ()؛ وظائف. log.debug ("إرسال ترتد إلى البريد الإلكتروني")؛) الصيد (استثناء السابقين) (الوظائف.log. خطأ ("خطأ في حفظ ترتد رسالة "(0)" إلى MailWh: (1) "، mail.mail.headers.messageid، ex .message)؛ وظائف. الدينورات. الدين ()؛)

bounceadd.

public Static Long Bounceadd (Var Conn \u003d New SQLConnection (ConnectionString) باستخدام (Var CMD \u003d SQLDataAdapter جديد ("Bounceadd"، Conn)) (Var Body \u003d message.mail.findfirstplaintextersion () \u003d\u003d null؟ . GetDody.mailtext (): message.mail.findfirstplaintextersversion (). Get Genterastext ()؛ var outid \u003d sqlparameter جديد (@ id "، sqldbtype.bigint) (الاتجاه \u003d المعلمة direction.output)؛ cmd.selectcommand .commandtype \u003d commandtype.storedprocedure؛ cmd.selectcommand.parameters.adameters.add (sqlparameter جديد (@ orolessage، message.mail.ramessage))؛ cmd.selectcommand.parameters.add (sqlparameter جديد (@ رسالة "، الجسم))؛ cmd.selectcommand.parameters.add (جديد sqlparameter ("@ porulers"، message.mail.maiders.subject ؟؟ "")؛ cmd.selectcommand.parameters.add (sqlparameter جديد (@ messageid "، message.mail.mail.messageid؟" ")؛" ")؛" ")؛ cmd.selectcommand.parameters.add (SQLParameter جديد ("@ Addresso"، message.mail.headers.to.address ؟؟ "")؛ cmd.selectcomm and.parameters.add (جديد sqlparameter ("@ alderfrom"، message.mail.headers.from.address؟ "") cmd.selectcommand.parameters.add (Sqlparameter جديد ("@ DatereCize"، DateTime.Now))؛ CMD.SelectCommand.Parameters.Add (SQLParameter جديد ("@ Bouncetypesyname"، (كائن) message.subtype ؟؟ dbnull.value))؛ cmd.selectcommand.parameters.addmet.add (المصدر الجديدامن، (@ sourcefrom "، (كائن) message.recipient؟ dbnull.value))؛ // toDo: إضافة الدعم الأساسي cmd.selectcommand.parameters.add (SQLParameter جديد ("@ ListID"، DBNull.Value))؛ cmd.selectcommand.parameters.add (outid)؛ conn.open ()؛ cmd.selectcommand.executenonquery ()؛ العودة atid.value طالما؟ ؟؟ 0؛ ))


آسف لم يكن لدي وقت لإظهار Topshelf - المنشور ومنتفخ بالفعل.

الاستنتاجات

في هذا الدرس، علمنا أن مهمة جمع البريد قد لا تكون بسيطة. يسمح لك Kernel المتقدمة بإضافة خطوات عملية جديدة بسرعة - كتل Dataflow دون التأثير على المنطق الموجود. يتيح لك النظام الفرعي المكون من البرنامج الفرعي بسرعة زيادة منطق تشبه البرامج النصية للجدل، و Materflow نفسها موازية جميع الحسابات (ولدينا القدرة على تكوين متعدد المرافق لآلة معينة). يمنحنا Topshelf القدرة على تشغيل الخدمة في وضع الخدمة وفي وضع وحدة التحكم لتسهيل تصحيح الأخطاء.

في رأيي، لدى Gmail أحد أكثر واجهات الويب الأكثر ملاءمة للعمل مع البريد الإلكتروني. بالإضافة إلى مجرد واجهة ممتعة ومريحة، لم ينس المبدعون عن الجزء الوظيفي. سلاسل الطاقة، وخلق مجلدات مختلفة، فلاتر، إلخ. كل هذا جعلت Gmail واحدة من الخدمات البريدية الأكثر شعبية في العالم. كثير لا يعرفون مثل هذه الفرصة الرائعة كمعجم بريد. على سبيل المثال، لديك صندوق بريد واحد أو أكثر على اسم المجال الخاص بك، ولكن واجهة قياسية بريد الويب والعملاء البريدي غير راضين عنك ( Mozilla Thunderbird، Microsoft Outlook، الخفافيش). في هذه الحالة، يمكنك استخدام مجمع البريد ومعالجة جميع البريد من خلال Gmail، وكيفية القيام بذلك الآن سننظر إليه.

  1. هناك حاجة إلى حساب في Gmail، عملية التسجيل بسيطة للغاية والتفكير والتعامل مع هذا لن يكون من الصعب.
  2. بعد التسجيل، في جوجل تحتاج إلى الذهاب إلى الإعدادات
  3. في الإعداد، حدد عنصر "الحسابات واستيراد"

  4. في هذا القسم، نحن مهتمون بعناصرين: "إرسال الحروف ك:" و "التحقق من البريد من حسابات أخرى (باستخدام POP3):". لديهم روابط "إضافة عنوان بريد إلكتروني آخر" و "إضافة حساب البريد الإلكتروني POP3 الخاص بك".

  5. من أجل جمع البريد من صندوق بريد آخر، انقر فوق "إضافة حساب البريد الإلكتروني POP3 الخاص بك". تظهر نافذة جديدة، حيث تحتاج إلى إدخال عنوان صندوق البريد وانقر فوق "التالي". بعد أن تظهر العديد من الحقول أنك تحتاج إلى ملء:
    اسم المستخدم
    كلمه السر
    خادم البوب \u200b\u200bوالمنفذ - عنوان خادم POP منفذ الاتصال بالخادم الذي سيتم جمع البريد منه. يمكنك معرفة هذه المعلومات بدعم خدمة البريد الخاصة بك، وعادة ما يتم نشرها في قسم "السؤال والأجوبة".
    الحفاظ على نسخ من الحروف المستلمة على الخادم - إذا لم يتم تثبيت مربع الاختيار، بعد تنزيل الحروف، ستتم إزالة هذه الحروف من صندوق البريد. وبعد
    استخدم دائما اتصال آمن (SSL) عند استلام الحروف - يجب عليك تثبيت إذا كانت خدمة البريد الخاصة بك تستخدم اتصال SSL آمن.
    تعيين تسمية الرسائل الواردة - التسمية، هذه علامة مرئية بالقرب من الرسالة. من المريح استخدامه للتفاهم، الذي تم إرسال صندوق البريد إليه خطابا.
    الأرشفة الرسائل الواردة (تخطي الواردة) - سيتم أرشفة الرسائل التي تم جمعها من صندوق البريد هذا، في واردها لن يكون كذلك.

  6. انقر فوق "إضافة حساب"، وبعد ذلك يرسل Gmail حرفا تحقق إلى صندوق البريد الذي حددته. ستحديد الرسالة خيارين للتحقق والارتباط والرمز. الرابط الذي تحتاجه فقط للذهاب، وإدراج التعليمات البرمجية في حقل التأكيد. من الأسهل الذهاب عبر الرابط، على ما يبدو الرمز يخرج فقط في حالة الحال، فجأة سيتم عرض الرابط في الرسالة بشكل غير صحيح.
  7. حسنا، في الواقع، كل ذلك، الآن حسابنا على Gmail يجمع تلقائيا رسائل من صندوق بريد آخر. إذا كانت هناك حاجة إلى الاستجابة من هذا أو عنوانا آخر باستخدام نفس Gmail، انقر فوق ارتباط "إضافة عنوان بريد إلكتروني آخر" في الإعدادات، وملء الحقول:
    "اسم:" - يمكنك إدخال أي بيانات، مثل اسمك.
    "عنوان البريد الإلكتروني:" - تشير إلى العنوان البريدي، نيابة عنها سوف نجيب.
    علامة الاختيار "استخدام كسماحب.- سيتم استخدام هذا العنوان اسم مستعار عنوانك الرئيسي وعند إرسال رسالة إليه، سيتم عرضه في الوارد الخاص بك، الموصوف بمزيد من التفصيل في مساعدة Google على الرابط "المزيد ...".
    حدد عنوانا آخر في حقل "الرد" (اختياري) - بشكل افتراضي، تأتي الإجابة إلى نفس العنوان الذي تم استخدامه ليتم إرساله. بالنقر فوق الارتباط، يمكنك تحديد صندوق بريد آخر سيتم تسليم الرسائل المرسلة إلى هذا العنوان.
    انقر فوق "مزيد"

  8. بعد ذلك، نرى عدد قليل من الحقول التي تحتاج إلى ملء.
    خادم SMTP والمنفذ - يجب العثور على هذه المعلومات في الخدمة البريدية.
    اسم المستخدم - عادة ما يكون هذا عنوان بريد إلكتروني، فهذا هو تسجيل دخول للوصول إلى صندوق البريد.
    كلمه السر - الوصول إلى كلمة المرور إلى صندوق البريد.
    اتصال محمي باستخدام TLS (مستحسن) واتصال آمن باستخدام SSL - لا يمكن اختيار الخيار الثاني (SSL) فقط إذا كانت خدمة البريد الخاصة بك تستخدم هذا النوع من الاتصال الآمن. أساسا يمكنك اختيار العنصر الأول.

    بعد النقر فوق "إضافة حساب"، سيتم إرسال حرف التحقق، عن طريق القياس مع إضافة صندوق البريد للبريد. أؤكد وكل شيء جاهز.

حسنا، في الواقع، كل ذلك، حتى تتمكن من تكوين تجميع الحروف والإجابة من مربعات أخرى عبر Gmail. NUANCES SMALL، تشكل جدول جمع البريد من صناديق بريد Gmail الأخرى بشكل مستقل، بشكل منفصل لكل صندوق بريد مثل هذا. وهذا هو، رسالة مرسلة إلى صندوق البريد الذي تقوم بجمع البريد منه، في واجهة Gmail، لا يتم عرضه على الفور، ولكن فقط بعد التحقق. تعتمد دورية الشيك على رقم وتكرار إدخال الرسائل إلى صندوق البريد هذا، صندوق البريد، كلما زادت الأحرف تأتي، كلما حدثت التحقق في كثير من الأحيان. لا يمكنك تغيير هذه المعلمة، ولكن يمكنك إجبار الاختيار في الإعدادات.