मेल सर्वर पर इमैप-फ़ोल्डरों द्वारा छलनी और उनके जैसे अन्य का उपयोग किए बिना अक्षरों को क्रमबद्ध करें

अपने कार्यालय में मेल का विस्तार हुआ और 1 से अधिक कर्मचारियों के लिए 1 से अधिक कार्यस्थल को नियमित फ़ाइलों पर mysql का उपयोग किए बिना exim + teapop पर आधारित एक बहु-डोमेन मेल सर्वर के सरलतम कार्यान्वयन की आवश्यकता होती है। परिवर्तनों का मुख्य कारण स्पैम से निरंतर सफाई और प्रत्येक कार्यस्थल पर बस अनावश्यक ईमेल कई बार बाहर निकलना शुरू हो गए, और लोमड़ी के प्रसिद्ध लेख "लिंक एक्जिम और कोरियर -मैप " के अनुसार उसी मेल को लागू करने का निर्णय लिया गया। सबसे महत्वपूर्ण बात यह है कि यह आवश्यक था कि फ़ोल्डर द्वारा एक संदेश सॉर्टर था। किसी ऐसे व्यक्ति के लिए जिसे मेलिंग सूचियों की सदस्यता दी जाती है, आवश्यक निर्देशिकाओं में पत्र बिछाने के लिए बहुत उपयोगी है, ताकि: क) प्रत्येक ग्राहक में सॉर्टर्स न लिखें; ख) वेब के माध्यम से मेल तक पहुँचने पर एक ही फ़ोल्डर संरचना होती है, जैसे मेल क्लाइंट में।

इंटरनेट के एक सरसरी (और फिर बल्कि कष्टप्रद) अध्ययन से पता चला कि सॉर्टिंग पत्र केवल विभिन्न छलनी लिपियों का उपयोग करके पेश किया जाता है। लेकिन, मेरी राय में, यह उपयोगकर्ताओं के लिए एक रास्ता नहीं है (ईमेल क्लाइंट के रूप में), लेकिन उन प्रशासकों के लिए जो वास्तव में सॉर्टर के लिए नियम नहीं लिखेंगे, लेकिन उपयुक्त स्क्रिप्टिंग भाषा का उपयोग करके प्रोग्राम फ़िल्टर करते हैं:

 require ["fileinto", "reject", "regex", "subaddress", "envelope"]; #spam if header :contains "Subject" "[SPAM]" { reject "thank you"; stop; } if header :regex "Received" "from ([[:alnum:]\\-]{1,}\\.){3,}[[:alnum:]]{1,}.*" { reject "thank you"; stop; } 

मैं यह पता लगा सकता हूं, लेकिन नरक क्यों, क्या यह आवश्यक है? और "मात्र नश्वर" के साथ क्या करना है जिन्हें समान कार्यक्षमता की आवश्यकता है, लेकिन जिनके लिए ऊपर चीनी साक्षरता है। आजकल, जब एक गृहिणी की उंगली के नीचे सिस्टम को तेज किया जाता है, तो मेल को छांटने के समान बेवकूफ तरीकों की कमी, जो दशकों से उपयोग की जाती है, कम से कम आश्चर्य की बात है।

उपर्युक्त लेख का एक टुकड़ा छँटाई के मेरे अपने कार्यान्वयन में आया था, जिसमें एक्ज़िम अक्षर को ट्रांसपोर्ट अनुभाग में रखने का मार्ग डेटाबेस से एक क्वेरी बनाता है:

 mysql_delivery: driver = appendfile check_string = "" create_directory delivery_date_add directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`) \ FROM `mailbox` WHERE `username`='${local_part}@${domain}'}} directory_mode = 770 envelope_to_add group = mail maildir_format maildir_tag = ,S=$message_size message_prefix = "" message_suffix = "" mode = 0600 

कुछ भी आपको अनुरोध को जोड़ने और वहां मौजूद imap फोल्डर का नाम जोड़ने से रोकता है ताकि संदेश के प्रेषक / विषय में सबस्ट्रिंग की सामग्री की परिभाषा के आधार पर डंबल फिल्टर काम करें:

 mysql_delivery: driver = appendfile check_string = "" create_directory delivery_date_add directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`, \ (select dir from sorter where ( \ ( \ (locate(text,'${sender_address}')!=0 and target='sender') \ or \ (locate(text,'${sg{${extract{Subject}{${sg{${sg{$message_headers}{ }{_spAce_}}}{:_spAce_}{=}}}}}{_spAce_}{ }}')!=0 and target='subject') \ ) \ and email='${local_part}@${domain}') or priority=0 order by priority desc limit 1 \ )) \ FROM `mailbox` WHERE `username`='${local_part}@${domain}'}} directory_mode = 770 envelope_to_add group = mail maildir_format maildir_tag = ,S=$message_size message_prefix = "" message_suffix = "" mode = 0600 

उसके बाद, हम एक विशिष्ट उपयोगकर्ता के लिए छंटनी के नियम बनाने के लिए 7 किलो के आदिम PHP कोड ( डाउनलोड ) लिखते हैं और, हाँ, अक्षरों को छाँटने की आवश्यकता का घातक परिणाम 80% है। और मेरा व्यक्तिगत रूप से - 100%। यह सच है, यह अप्रत्याशित रूप से खोजा गया था (या शायद मुझे अभी यह नहीं मिला है?) इस स्तर पर एक्जिम में प्रत्येक शीर्षक के लिए अलग-अलग चर नहीं होते हैं, इसलिए एक्साइम लाइन विस्तार की मोटी दाढ़ी का उद्देश्य केवल एक बार में सभी संदेश हेडर वाले मल्टी-लाइन फ़ील्ड से विषय हेडर का चयन करना है।

हम एक अनिवार्य शून्य प्रविष्टि के साथ छँटाई के नियमों को संग्रहीत करने के लिए एक तालिका बनाते हैं, जो इनबॉक्स में पत्र का स्थान निर्धारित करेगा यदि कोई नियम नहीं है:

 CREATE TABLE `sorter` ( `id` int(11) NOT NULL AUTO_INCREMENT, `priority` int(11) NOT NULL DEFAULT '0', `target` varchar(255) NOT NULL DEFAULT '', `text` varchar(255) NOT NULL DEFAULT '', `dir` varchar(255) NOT NULL DEFAULT '', `email` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ); INSERT INTO `sorter` SET `priority`=0; 

व्यवस्थापक स्क्रीनशॉट:

छवि
लिपियाँ उपयोगकर्ता के सर्वर पर पहले से ही फ़ोल्डर्स की सूची लेती हैं।

प्रणाली अपूर्ण है, और कम से कम तीन सीमाएँ हैं:
1. रूसी एन्कोडिंग के साथ काम करता है केवल अगर पत्र का एन्कोडिंग नियमों की तालिका में प्रविष्टियों के एन्कोडिंग से मेल खाता है;
2. केवल एक नियम प्राथमिकता के क्रम में काम करता है (उच्चतर, उच्च प्राथमिकता), इसलिए तर्क के साथ नियम और नहीं किया जा सकता है, केवल OR;
3. प्रक्रिया करने के लिए फ़ील्ड की संख्या प्रेषक और विषय द्वारा सीमित है।

सिद्धांत रूप में, बाद में नमूनों के लिए अन्य हेडर का उपयोग करना समाप्त करना संभव होगा, और न केवल विषय के रूप में, यदि आवश्यक हो तो मैं यह कर सकता हूं। राउंडक्यूब के लिए एक प्लगइन लिखने का भी विचार था, लेकिन उन्हें कैसे लिखा जाता है, इसे देखते हुए, यह उस पर हथौड़ा करने का फैसला किया गया था, यद्यपि बहुत दया के साथ (शायद कोई ऐसा व्यक्ति जो कार्यान्वयन में रुचि रखता है, वह इसे करेगा: मुस्कान :)। मैं यह भी नोट करना चाहता हूं कि FreeBSD के लिए MySQL 5.5 पोर्ट के नवीनतम संस्करण पर sql क्वेरी का परीक्षण किया गया था, इसलिए यह ज्ञात नहीं है कि यह क्वेरी पुराने संस्करणों के लिए रोल करेगी या नहीं।

Source: https://habr.com/ru/post/In139728/


All Articles