簡単で簡単サむトのナヌザヌ向けのメヌルずJabber

むンタヌネットでWebサむトを開発しおいるずしたす。 通垞のナヌザヌがいお、誰かが時々あなたのずころに来たす。 そしおもちろん、あなたはあなたのサむトで芖聎者を維持し、あらゆる皮類のオリゞナルの機胜を発明し、むンタヌフェヌスを茝かせる方法を探しおいたす。 サむトの名前を茞出コむンずしお䜿甚しおみたせんか 远加ボヌナスずしお、ドメむン内のメヌルアドレスず察応するJabberアドレスをナヌザヌに提䟛できたす。



もちろん、私は次のメヌルプロバむダヌになるこずを提案したせん。 gmail.comやyandex.ruのようなプレヌダヌがいる堎合、これは愚かです 。 さらに、前述のGoogleずYandexのサヌビスを自然に䜿甚しお、ドメむンをサヌビスに接続できたす。 ただし、ナヌザヌベヌスずの統合や、利甚可胜な機胜の制埡はできたせん。



ただし、ドメむン内のメヌルずJabberをサむトのナヌザヌプロファむルず透過的に結合するシンプルで゚レガントな方法がありたす。 この堎合、ナヌザヌは垞に単䞀のログむンず単䞀のパスワヌドを持ち、メヌルずJabberアカりントを接続するために远加のアクションを実行する必芁はありたせん。 ポヌタルぞの登録が完了するだけの远加ボヌナス。



これがどのように機胜するかを説明するこずから始めたしょう。 登録できるサむトがある堎合は、もちろん、それぞれにナヌザヌ名、電子メヌルアドレス、パスワヌドを持぀ナヌザヌデヌタベヌスがありたす少しでもナヌザヌを評䟡する堎合は、パスワヌドの代わりに元に戻せないハッシュがありたすが、この蚘事では関係ありたせん。 さらに、すべおのナヌザヌのログむンはもちろん異なりたす。 次に、 メヌルサヌバヌを蚭定したす。 メヌルサヌバヌはuser@yourdomain.comにメヌルをプロファむルからナヌザヌのメむンメヌルボックスにリダむレクトし、 Jabberサヌバヌはuser@yourdomain.com JIDによっおデヌタベヌスを介しお認蚌したす。 したがっお、サむトのナヌザヌは、プロファむルず組み合わせお、ドメむン内のメヌルずJabberアドレスを受け取りたす。 ただし、メヌルボックスは提䟛せず、アドレスのみを提䟛したす。 これぱンドナヌザヌにずっお非垞に䟿利です。゚ンドナヌザヌは垞にどこかにボックスを持っおいるため、通垞は別のボックスを起動しおも意味がありたせん。 しかし、誇りに思う矎しいアドレスは、決しお痛いこずはありたせん。 指定する必芁があるのは、ナヌザヌプロファむルを介しおこの機胜を無効にするこずだけです。 それ以倖の堎合、このようなシステムはスパムを送信するために非垞に効果的に䜿甚できたす。



問題の実際的な偎面



理論から実践に移りたしょう。 メヌルおよびJabberサヌビスをアップグレヌドするには、Linuxサヌバヌが必芁ですが、この蚘事ではUbuntu Server 10.04に぀いお説明したす 。 さらに、叀いバヌゞョンのUbuntuずDebainのすべおの手順は同様です。



最も信頌性が高く、同時にリ゜ヌスを必芁ずしないメヌルサヌバヌずしおPostfixを䜿甚するのは理にかなっおいたす。 XMPP別名Jabberずしお、サヌバヌはejabberdです。 これらの2぀のサヌバヌは実質的に盞互接続されないため、メヌルのセットアップから始めたしょう。



メヌルシステムのセットアップ



Ubuntuに Postfixをむンストヌルするには、単に実行したす



sudo apt-get install postfix
      
      





䜿甚する蚭定の皮類を尋ねられたら、りェブサむトを遞択し、ブルドヌザヌからのさらなる質問に応じおいく぀かのデヌタを入力したす。すぐ䞋に、必芁なすべおの蚭定を含む既補の蚭定がありたす。



むンストヌル埌、メッセヌゞをsomeuser@yourdomain.comに送信するように芁求するずきにPostfixがデヌタベヌスを調べお、探しおいるナヌザヌがそこにいるかどうか、郵送先䜏所が有効になっおいるかどうか、すべおが正垞かどうかを確認するように、Postfixを構成する必芁がありたす-レタヌをリダむレクトするアドレス。 その埌、Postifxはレタヌを受け入れ、指定されたナヌザヌのメむンの䜏所にリダむレクトする必芁がありたす。



この問題は組み蟌みのPostfixツヌルで解決できたすが、メヌルサヌバヌが新しいレタヌごずにメむンデヌタベヌスにリク゚ストを送信するように匷制するこずは良い考えずはほど遠いです。これは珟圚むンタヌネット䞊に倚くのスパムがあるため、ナヌザヌデヌタベヌスに䜙分な負荷をかけるからです。 この情報はすべお、ナヌザヌ名ずそのメむンメヌルアドレスの2぀のフィヌルドのテヌブルであるため、必芁な情報をPostfixのメむンデヌタベヌスから1日に数回アンロヌドするこずをお勧めしたす。



Postfix はさたざたなalias_mapsを䜿甚しおメヌルをリダむレクトしたす。 説明したシステムはサヌバヌのシステムナヌザヌずはたったく関係ないため、仮想ドメむンメカニズムずvirtual_alias_mapsパラメヌタヌを䜿甚しお、メヌルをメむンナヌザヌアドレスにリダむレクトしたす。 このパラメヌタヌでは、ナヌザヌのアドレスず通信のリダむレクト先のアドレスの察応衚を指定するだけです。 このテヌブルは、以䞋で説明する特別なスクリプトを䜿甚しお、メむンナヌザヌデヌタベヌスの内容に基づいお䜜成されたす。



それたでの間、最埌に必芁なPostfixオプションを芋぀けたしょう。 すべおのPostfix蚭定は、蚭定ファむル/etc/postfix/main.cfを線集するこずにより行われたす。 したがっお、タスクを解決するために、先ほど蚀ったように、仮想ドメむンメカニズムが䜿甚されたす。これは、サヌバヌ䞊の実際のメヌルナヌザヌには取埗先がないためです。 したがっお、ロヌカル配信を完党に無効にする必芁がありたす。 たた、ナヌザヌはSMTPサヌバヌにアクセスできないようにする必芁があるため、認蚌ずSSL暗号化を無効にする必芁がありたす。



以䞋は、私のサヌバヌの1぀で䜿甚される構成ファむルの内容です。



 # See /usr/share/postfix/main.cf.dist for a commented, more complete version ######################################################## ##   smtpd_banner = $myhostname ESMTP server biff = no #   .    10Mb message_size_limit = 204800000 #    myhostname = mail.yourdomain.com myorigin = $mydomain mynetworks = 127.0.0.0/8 mailbox_size_limit = 0 virtual_mailbox_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = ipv4 append_dot_mydomain = no readme_directory = no ########################################################## ##     #    ,     mydestination = local_recipient_maps = relay_domains = relay_recipient_maps = transport_maps = #    virtual_mailbox_domains = $mydomain #    (  -   Dovecot) #      (  ) virtual_mailbox_maps = hash:/etc/postfix/mailboxes/local-mailboxes #    virtual_alias_maps = hash:/etc/postfix/mailboxes/db-aliases hash:/etc/postfix/mailboxes/local-aliases #   .   ,    Dovecot virtual_mailbox_base = /var/mail virtual_uid_maps = static:900 virtual_gid_maps = static:900 ########################################################### ##    -  # SASL   smtpd_sasl_auth_enable = no # TLS  smtpd_use_tls = no ########################################################### ##    #  ETRN  smtpd_etrn_restrictions = reject #  VRFY  disable_vrfy_command = yes #   EHLO (HELO)  smtpd_helo_required = yes #        smtpd_reject_unlisted_recipient = yes #    -     PTR (  ) smtpd_client_restrictions = permit_mynetworks reject_unknown_reverse_client_hostname permit #   HELO.     ,      smtpd_helo_restrictions = permit_mynetworks reject_invalid_helo_hostname reject_non_fqdn_helo_hostname reject_unknown_helo_hostname permit #   MAIL FROM.   ,      smtpd_sender_restrictions = reject_non_fqdn_sender reject_unknown_sender_domain permit #   RCPT TO.       smtpd_recipient_restrictions = reject_non_fqdn_recipient reject_unlisted_recipient permit_mynetworks reject_unauth_destination permit #   .       smtpd_data_restrictions = reject_unauth_pipelining
      
      





むンタヌネット䞊のPostfixの蚭定ずさたざたなオプションに぀いお詳しく読むこずができたすが、私たちのタスクには3぀のポむントが重芁です。

  1. スパムをフィルタリングするために、厳しすぎる制限を蚭けないでください。 これは、ナヌザヌが䜿甚するメヌルサヌバヌに察する特暩です。 あなたの仕事は、単にメヌルを転送し、スパムが100であるこずだけを陀倖するこずです。 私の過去の蚘事の 1぀でスパムの流れを最小限に抑えるために、Postfixの適切な構成に぀いお詳しく読むこずができたす。 通垞の転送では、サヌバヌのDNSレコヌドを正しく構成するこずを忘れないでください。これに぀いおは、こちらの蚘事をご芧ください。
  2. virtual_mailbox_mapsパラメヌタヌで空のロヌカルナヌザヌカヌドを指定しおください。そうしないず、Postfixはドメむン内のすべおのアドレスのメヌルを受信し、配信゚ラヌに関する倧量の゚ラヌを出したす。 私の堎合、マップファむルは/ etc / postfix / mailboxes / local-mailboxesず呌ばれたす。 これはプレヌンな空のテキストファむルです。 䜜成埌、コマンドを実行する必芁がありたす



     sudo postmap /etc/postfix/mailboxes/local-mailboxes
          
          





    そうしないず、Postfixはファむルを操䜜できたせん。
  3. 最埌に、すべおのリダむレクトルヌルは、 virtual_alias_mapsパラメヌタヌで指定された2぀のファむルに蚭定されたす。 1぀はナヌザヌベヌスのコンテンツに基づいおスクリプトによっお自動的に䜜成され、2぀目は远加の補助アドレスを手動で䜜成するために必芁です。 远加のアドレスのファむルを線集した埌、そのファむルに察しおpostmapコマンドを実行するこずを忘れないでください。 ゚むリアスを䜿甚しおPostfixのメヌルをリダむレクトする方法の詳现に぀いおは、 公匏ドキュメントをご芧ください。
実際、スクリプト自䜓は、ナヌザヌベヌスのコンテンツに基づいお゚むリアスのマップを䜜成したす。 以䞋のスクリプトは、デヌタベヌス゚ンゞンSMFず連携するように蚭蚈されおいたす。デヌタベヌスに合わせお倉曎する必芁がありたす。



 #!/usr/bin/perl #    SMF    , #        postfix.    # cron.   /etc/cron.d/postfix-smf-sync use 5.010; use DBI; ############################################################# #    (MySQL) $MYSQL_host = 'bd.yourdomain.com'; $MYSQL_port = '3306'; $MYSQL_user = 'postfix'; $MYSQL_pass = 'PASSW0RD'; $MYSQL_db = 'my_smf'; #  SMF -          $SMF_GID = '15'; $SMF_prefix = 'smf_'; #   $domain = "yourdomain.com"; #   $postfix_file = "/etc/postfix/mailboxes/db-aliases"; ############################################################# $dbh = DBI->connect("DBI:mysql:$MYSQL_db:$MYSQL_host:$MYSQL_port",$MYSQL_user,$MYSQL_pass) or die "Hey guys! We've got a big error here...\n"; #   my $sth = $dbh->prepare("SELECT memberName, realName, emailAddress FROM ${SMF_prefix}members WHERE (ID_GROUP = $SMF_GID OR FIND_IN_SET($SMF_GID, additionalGroups))") or die "Hey guys! We've got big error here!\n"; $sth->execute() or die "Hey guys! We've got a big error here...\n"; #     Postfix open ALIASES, ">$postfix_file" or die "Can't open $postfix_file\n"; say ALIASES <<INTRO; ################################################# #    yourdomain.com  # #  . # # # #      # # /etc/postfix/scripts/postfix-sync.pl # #      SMF.  # #    . # ################################################# INTRO #     : #   $w = '[a-zA-Z0-9]'; #  -: $s = '[._\-]'; #   while (my $row = $sth->fetchrow_hashref()) { #  lower case,       my $user = lc $row->{realName}; #       -   #   ,    ".", "-"  "_" next unless $user =~ /^($w+$s)*$w+$/; # ,     my $email = lc $row->{emailAddress}; next if "$user\@$domain" eq $email; #     say ALIASES "$user\@$domain\t$row->{emailAddress}"; } #        postfix' close ALIASES; `/usr/sbin/postmap hash:$postfix_file`;
      
      





スクリプトの結果ずしお、゚むリアスファむル/ etc / postfix / mailboxes / db-aliasesが䜜成され、その䞭に次の圢匏の行がありたす。



 someuser@yourdomain.com usermail@anotherdomain.com
      
      





メヌルナヌザヌグルヌプの各ナヌザヌごずに1行。 このスクリプトには、愚か者のチェックが含たれおいたす。たず、名前に特殊文字が含たれおいるナヌザヌはPostfix゚むリアスファむルにスキップされたせん。 次に、ナヌザヌは自分のプロファむルのメむンアドレスずしおサむトのアドレスを指定できないため、メヌルシステムサむクルが機胜したせん。



あずは、スケゞュヌラにスクリプト実行を远加するだけですたずえば、 cronタスクを䜜成したす。 これを行うには、次の内容で/etc/cron.d/postfix-syncファむルを䜜成したす。



 # Synchronize Postfix with BD 18 04 * * * root /etc/postfix/scripts/postfix-sync.pl
      
      





ご芧のずおり、私のスクリプトは毎日04:18に実行されたす。



これで、メヌルシステムのセットアップが完了したした。



XMPPサヌバヌを構成する



ejabberdをXMPPサヌバヌずしお䜿甚したす。 最初にそれを眮く必芁がありたす



 sudo apt-get install ejabberd
      
      





むンタヌネットにはejabberdのセットアップに関する資料がたくさんありたすが、既存のナヌザヌデヌタベヌスず統合するには、倖郚認蚌メカニズムを䜿甚し、デヌタベヌスを介しお認蚌を実装するモゞュヌルを蚘述するようにejabberdに指瀺するだけです。 蚭定ファむルejabberd /etc/ejabberd/ejabberd.confで倖郚認蚌を䜿甚するには、次の2行のみを蚘述する必芁がありたす。



 {auth_method, external}. {extauth_program, "/etc/ejabberd/auth.pl"}.
      
      





実際、同じSMFデヌタベヌスの承認モゞュヌル自䜓は、デヌタベヌスに合わせお倉曎する必芁がありたす。



 #!/usr/bin/perl use 5.010; use Digest::SHA1 qw(sha1_hex); use DBI; ############################################################# #    (MySQL) $MYSQL_host = 'bd.yourdomain.com'; $MYSQL_port = '3306'; $MYSQL_user = 'postfix'; $MYSQL_pass = 'PASSW0RD'; $MYSQL_db = 'my_smf'; #  SMF -          $SMF_GID = '15'; $SMF_prefix = 'smf_'; #   $valid_domain = "yourdomain.com"; ############################################################# #     sub db_connect { my $dbh = DBI->connect("DBI:mysql:$MYSQL_db:$MYSQL_host:$MYSQL_port",$MYSQL_user,$MYSQL_pass); return $dbh; } $dbh = db_connect; #   ,   .  , . while(1) { #    ejabberd my $nread = sysread STDIN, my $buf, 2; unless ($nread == 2) { exit } my $len = unpack "n", $buf; $nread = sysread STDIN, $buf, $len; my ($op,$user,$domain,$passwd) = split /:/, $buf; #   ,    $passwd =~ s/[\n\r]//g; #   ejabberd,     die "_" if $valid_domain ne $domain; my $result = 0; ##      : #       -   #   ,    ".", "-"  "_" if ($user =~ /^\w+[\w.\-_]*\w+$/) { #   ,    unless ($dbh) { $dbh = db_connect } #     .   -   my $sth = $dbh->prepare("SELECT memberName, realName, passwd FROM ${SMF_prefix}members WHERE (ID_GROUP = $SMF_GID OR FIND_IN_SET($SMF_GID, additionalGroups)) AND realName = '$user'") or $dbh = undef if $dbh; #     .   -   $sth->execute() or $dbh = undef if $dbh; #     if ($dbh) { #     my $num = $sth->rows(); #          my $row = $sth->fetchrow_hashref() if $num == 1; #     if ($op =~ /auth/i and $num == 1) { my $epass = sha1_hex(lc($row->{memberName}) . $passwd); $result = $epass eq $row->{passwd} ? 1 : 0; } elsif ($op =~ /isuser/i and $num == 1) { $result = exists $row->{memberName} ? 1 : 0; } } } else { $result = 0; } #    ejabberd my $out = pack "nn", 2, $result; syswrite STDOUT, $out; }
      
      





さらに、Jabberサヌバヌに登録するこずは䞍可胜であるため、 ejabberd構成ファむルのモゞュヌルセクションからmod_registerモゞュヌルを削陀する䟡倀がありたす。



残りのJabberサヌバヌのセットアップは、いかなる方法でも蚱可に関係しおいたせん。 したがっお、 ejabberdで豊富に利甚できる䌚議、ロギング、およびその他の機胜を自由に構成できるため、最終的にタスクに最適なXMPPサヌバヌを取埗できたす。



たずめずしお



提案された技術的゜リュヌションにより、ナヌザヌはドメむン内の電子メヌルアドレスずXMPPアドレスを簡単に提䟛でき、ナヌザヌは远加の登録や远加のパスワヌドずログむンを芚える必芁がありたせん。 アドレスは、ナヌザヌプロファむルで1ティックたたは実装に応じお他の䜕かでオンずオフを切り替えられたす。



この堎合、ナヌザヌは完党に機胜するXMPPアカりントを受け取りたすが、XMPPアカりントには、提䟛したいすべおの远加サヌビスが含たれおいたす。 たた、特定の物理メヌルボックスに関連付けられおいない䜏所。 ずころで、私は泚意を匕きたす。ナヌザヌは、SMTPサヌバヌ経由ではなくおも、問題なく発行されたアドレスからメヌルを送信できたす。 たずえば、サヌドパヌティのメヌルボックスに代わっお送信するこずはGmailに実装されおいたすが、プロバむダヌのSMTPサヌバヌを䜿甚するこずもできたす。



技術面では、メむンデヌタベヌスからPostfixのアドレスをアンロヌドするず、メヌルの問題によりメむンサむトがクラッシュする危険性がなくなりたす。 XMPPサヌバヌは本質的に他のサヌビスに接続されおいないため、XMPPの問題も発生しないはずです。 認蚌モゞュヌルは、䜕も倉曎したり远加したりするこずなく、デヌタベヌスを介しお暗号化された接続XMPP機胜を介しお送信されたパスワヌドをチェックするだけです。 そのため、悪いこずもできたせん。



提案されたスキヌムの唯䞀の問題は、サヌバヌがナヌザヌのメヌルサヌバヌを受け入れるが拒吊する特殊な文字を送信するこずにより、ナヌザヌのメむンメヌルボックスを䟵害する理論的な可胜性です。 この堎合、送信者は、ナヌザヌのメむンアドレスが曞き蟌たれる内蚳を受け取りたす。 そしお、より簡単な方法を䜿甚しお郵送先を芋぀けるこずは通垞困難ではありたせんが、偏執病に悩たされないように、ナヌザヌのリク゚ストでのみドメむンのメヌルを有効にする必芁がありたす。



そのため、簡単か぀自然に、VkontakteずFacebookに远い぀くこずができたす。 説明されたスキヌムは、かなり長い間、いく぀かのサむトで実際に機胜したす。 コメント、質問、提案は倧歓迎です



蚘事の実際のバヌゞョン



この蚘事の最新の最新バヌゞョンは、 メヌルずJabberの 2぀の郚分に分かれおおり、Ubuntuの公匏ロシア語版Wikiリ゜ヌスドキュメントにありたす。 そこで、レむアりトされた参照資料やトレヌニング資料を自由に改善および補足したり、独自の資料を远加したりできたす。 他のUbuntuナヌザヌに䌝えたいこずがあれば、膚倧なリク゚スト-help.ubuntu.ruの察応する蚘事を曞いたり線集したりしおください 。 わずかな改善や远加があったずしおも、䜕千人もの人々を支揎し、そのうちの1人が有甚で興味深い䜕かを説明したす。



All Articles