投稿者: chombo

  • WSLを使ってメーリングリストを作成(fetchmail編)

     前回までのpostfix+mailmanでUbuntu内、ローカルWindows、および同じネットワーク内の別PCからメーリングリストへの送受信が可能になった。

     ただし、インターネットからのメールは受け付けることはできない。メーリングリスト用のサーバーが外部に露出して無く、MercuryMailも特定のMTAに転送する設定がないせいらしい。

     そこで5日ほど悩んで、何とか実現できそうな方法にたどり着いた。

     外部とはWindowsにxamppを入れて、MercuryMailで通信している。そのMercuryMailにはドメインメールボックスという機能があり、特定のホスト宛てのメールを全て単一のメールボックスに入れることができる。

     そして、fetchmailにはマルチドロップモードという機能があり、1か所に届いたメールを本来の宛先などを読み取って配送する機能がある。

     この二つの機能を組み合わせることで、外部から届いたメールを適切なmailmanの仮想アドレスに届けることができる。

    ・インストール

      $ sudo apt install fetchmail

    ・設定
     rootユーザーでの動作は推奨されていないが、システム上のアプリなのでrootで実行させる。

      $ sudo vi /root/.fetchmailrc
    # ログファイルの指定
    set logfile "/var/log/fetchmail.log"
    # エラーの送信先
    set postmaster postmaster@mydomain.com
    set no bouncemail
    # メールのチェック間隔(秒)
    set daemon 300
    
    # デフォルト設定
    defaults
    # 既読のチェックを行う
      uidl
      # 未読メールの取り込み(ex.全て取り込む場合[fetchall])
      no fetchall
      # サーバ上にメールを残す(ex.削除する場合[no keep])
      keep
      # mimed ecode(8ビットデータに変換しない)
      no mimedecode
      # RFC-822 のアドレスヘッダ (To, From, Cc, Bcc, Reply-To) を書き換えない
      no rewrite
    
    # 外部メールサーバの設定(取り込み元) localdomainsではenvelopeが必要
    poll mail.mydomain.com with proto imap envelope "X-Envelope-To"
      localdomains ml.mydomain.com
      # アカウント名、パスワード、宛先ユーザー
      user "mailman" with pass "mailパスワード" to * here

    設定ファイルを所有者のみRead/Writeにする

      $ sudo chmod 600 /root/.fetchmailrc

    ログファイルはあらかじめ作成しておかないとエラーになるので作成しておく。

      $ sudo touch /var/log/fetchmail.log
      $ sudo chown root:root /var/log/fetchmail.log
      $ sudo chmod 600 /var/log/fetchmail.log

    ・fetchmailの起動
    起動と停止はfetchmail設定ファイルを作成したユーザー(つまりsudo )で起動する

    $ sudo /usr/bin/fetchmail --nosslcertck -f /root/.fetchmailrc

    起動時にはsslを使用しないオプション(–nosslcertck)を指定しないとSTARTTLSで以下のエラーとなる
    fetchmail: POP3< -ERR SSL/TLS services unavailable.
    このオプションはコマンドラインでしか指定できないようなので、起動時は毎回指定する。

    ・fetchmailの停止

      $ sudo fetchmail --quit
    or sudo fetchmail -q

    ・fetchmailの強制フェッチ
    set daemonの設定にかかわらず即座にメールボックスのチェックを行う。

      $ sudo fetchmail

    ・テスト実行

      $ sudo fetchmail --nosslcertck -f /root/.fetchmailrc -v -c

    ・ログの確認

      $ sudo less +F /var/log/fetchmail.log

    ・logrotateの設定

      $ sudo vi /etc/logrotate.d/fetchmail
    /var/log/fetchmail.log {
        su root root
        weekly
        rotate 10
        notifempty
        create 600 root root
        prerotate
            /usr/bin/fetchmail --quit > /dev/null 2>&1
        endscript
        postrotate
            /usr/bin/fetchmail --nosslcertck -f /root/.fetchmailrc > /dev/null 2>&1
        endscript
    
    }

    apache2のlogrotate設定
     postrotate部分でinvoke-rc.dを使うようになっていたが、WSLでは動作しないらしいため置き換える。

      $ sudo vi /etc/logrotate.d/apache2
    -----
    	postrotate
                    if  ps -ef | grep -vw "^`whoami`" | grep -w apache2 > /dev/null 2>&1; then \
                        apache2ctl graceful > /dev/null 2>&1; \
                    fi;
    	endscript
    -----

    cronのログを有効にする

      $ sudo vi /etc/rsyslog.d/50-default.conf
    #cron. /var/log/cron.log
    ↓
    cron.* /var/log/cron.log

    rsyslogを再起動する

      $ sudo /etc/init.d/rsyslog restart

    logrotateは以下のファイル内の日付を見て処理しているので、無理矢理実行させるなら日付を書き換える

    /var/lib/logrotate/status

    おまけ

     新しいメッセージがない時のfatchmailのログにはタイムスタンプがないので、ログを見ただけでは動いているかどうかわかりにくい。

     定期的にタイムスタンプを挿入するスクリプトを動かす。

      $ sudo vi /root/fetchmail_time.sh
    -----
    #!/bin/bash
    sleep 60
    while true
    do
      if [ -w /var/log/fetchmail.log ]; then
        echo '          ' `date '+%Y/%m/%d %H:%M:%S'`>> /var/log/fetchmail.log
      fi
      sleep 3600
    done
    -----
      $ sudo chown root.root /root/fetchmail_time.sh
    
      $ sudo chmod 700 /root/fetchmail_time.sh
    
      $ sudo vi /etc/sudoers.d/auto-start
    %sudo ALL=NOPASSWD: /root/fetchmail_time.sh
    
      $ vi ~/.bash_aliases
        ps -ef | grep -vw "^`whoami`" | grep -w fetchmail_time  || sudo /root/fetchmail_time.sh &
  • WSLを使ってメーリングリストを作成(mailman編)

    ・インストール

      $ sudo apt install mailman
    ja(Japanese) をスペースで選択、OKを押す

    ・ファイル属性をチェックする

      $ sudo /usr/lib/mailman/bin/check_perms
    問題が報告されなくなるまで -f オプションをつけて繰り返し実行する
      $ sudo /usr/lib/mailman/bin/check_perms -f
    シンボリックリンクの先ではなくて、シンボリックリンクのの所有者、グループをチェックしているらしい。chown -h root:list などでシンボリックリンク自体を修正するとエラーは出なくなる。
      $ sudo chmod g+s /var/lib/mailman/logs
      $ sudo chown -h root:list /var/lib/mailman/bin
      $ sudo chown -h root:list /var/lib/mailman/cgi-bin
      $ sudo chown -h root:list /var/lib/mailman/cron
      $ sudo chown -h root:list /var/lib/mailman/icons
      $ sudo chown -h root:list /var/lib/mailman/locks
      $ sudo chown -h root:list /var/lib/mailman/logs
      $ sudo chown -h root:list /var/lib/mailman/mail
      $ sudo chown -h root:list /var/lib/mailman/Mailman
      $ sudo chown -h root:list /var/lib/mailman/scripts
      $ sudo chown -h root:list /var/lib/mailman/templates

    ・管理用メーリングリスト「mailman」を作る
    これがないと、Webインターフェースが利用できない

      $ sudo /usr/lib/mailman/bin/newlist --language=ja mailman
    Enter the email of the person running the list: postmaster@mydomain.com
    Initial mailman password:xxxxx
    To finish creating your mailing list, you must edit your /etc/aliases (or
    equivalent) file by adding the following lines, and possibly running the
    `newaliases' program:
    aliasデータベースを更新する
      $ sudo newaliases

    ・設定

    /usr/lib/mailman/Mailman/Defaults.py を参考に、mm_cfg.pyを修正する

      $ sudo vi /etc/mailman/mm_cfg.py
    
    DEFAULT_URL_PATTERN = 'https://%s/mailman/'
    DEFAULT_EMAIL_HOST = 'ml.mydomain.com'
    DEFAULT_URL_HOST   = 'ml.mydomain.com'
    
    
    #####
    # Archive defaults
    #####
    # Are archives on or off by default?
    DEFAULT_ARCHIVE = Off
    
    # Are archives public or private by default?
    # 0=public, 1=private
    DEFAULT_ARCHIVE_PRIVATE = 1
    
    #####
    # Delivery defaults
    #####
    MTA='Postfix'
    POSTFIX_STYLE_VIRTUAL_DOMAINS = [DEFAULT_EMAIL_HOST ]
    add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
    
    #####
    # General defaults
    #####
    DEFAULT_SERVER_LANGUAGE = 'ja'
    OWNERS_CAN_DELETE_THEIR_OWN_LISTS = Yes
    DEFAULT_NEW_MEMBER_OPTIONS = 256  # Default see Bitfield for user options
    
    #####
    # List defaults.  NOTE: Changing these values does NOT change the
    # configuration of an existing list.  It only defines the default for new
    # lists you subsequently create.
    #####
    DEFAULT_LIST_ADVERTISED = No
    DEFAULT_SUBJECT_PREFIX = '[%(real_name)s:%%05d] '
    # What should happen to non-member posts which are do not match explicit
    # non-member actions?
    # 0 = Accept
    # 1 = Hold
    # 2 = Reject
    # 3 = Discard
    DEFAULT_GENERIC_NONMEMBER_ACTION = 2
    DEFAULT_SEND_REMINDERS = 0
    DEFAULT_SEND_WELCOME_MSG = No
    DEFAULT_SEND_GOODBYE_MSG = No
    
    # Mailman can be configured to "munge" Reply-To: headers for any passing
    # messages.  One the one hand, there are a lot of good reasons not to munge
    # Reply-To: but on the other, people really seem to want this feature.  See
    # the help for reply_goes_to_list in the web UI for links discussing the
    # issue.
    # 0 - Reply-To: not munged
    # 1 - Reply-To: set back to the list
    # 2 - Reply-To: set to an explicit value (reply_to_address)
    DEFAULT_REPLY_GOES_TO_LIST = 1
    
    # SUBSCRIBE POLICY
    # 0 - open list (only when ALLOW_OPEN_SUBSCRIBE is set to 1) **
    # 1 - confirmation required for subscribes
    # 2 - admin approval required for subscribes
    # 3 - both confirmation and admin approval required
    #
    # ** please do not choose option 0 if you are not allowing open
    # subscribes (next variable)
    DEFAULT_SUBSCRIBE_POLICY = 2
    
    #####
    # Digestification defaults.  Same caveat applies here as with list defaults.
    #####
    DEFAULT_DIGESTABLE = No

    ・ Postfixに読み込ませるaliasesファイルを生成する
    /var/lib/mailman/data に作成される。

      $ sudo /usr/lib/mailman/bin/genaliases

    ・サイトパスワードの設定
    サイトパスワードはメーリングリスト作成時などにリスト作成者の認証パスワード項目として入力する

      $ sudo /usr/lib/mailman/bin/mmsitepass

    ・実行するのに必要なリンクを張る

      $ sudo ln -s /usr/lib/mailman/bin/mailmanctl /usr/sbin/

    ・mailmanを実行する

      $ sudo mailmanctl start
    以下のエラーが出たらディレクトリを作成する
    IOError: [Errno 2] No such file or directory: '/var/lib/mailman/locks/master-qrunner.domain.com.1909.1'
      $ sudo mkdir /var/lock/mailman
      $ sudo chown www-data:list /var/lock/mailman
      $ sudo chmod g+w /var/lock/mailman
      $ sudo ls -laH /var/lib/mailman/locks
    drwxrwxr-x 1 www-data list 512 Feb 8 10:33 .
      $ sudo mailmanctl start
    まだ出るときは同じくディレクトリを作成する
    IOError: [Errno 2] No such file or directory: '/var/run/mailman/mailman.pid'
    IOError: [Errno 13] Permission denied: '/var/run/mailman/mailman.pid'
      $ sudo mkdir /var/run/mailman
      $ sudo chown list /var/run/mailman
      $ sudo chmod g+w /var/run/mailman
      $ sudo ls -laH /var/run/mailman
    drwxrwxr-x 1 list root 512 Feb 8 10:33 .
    これはWSLの起動ごとに必要らしい

    ・postfixの設定

    postfixは/etc/aliasや/etc/mailman/virtual-mailmanにある名前にメールが届いた場合、aliasなどに書かれたmailmanのスクリプトを実行する

      $ sudo vi /etc/postfix/main.cf
    # Postfix は -owner と -request 宛のアドレスのメールは拒否するので許可する。
    recipient_delimiter = +
    owner_request_special = no
    # mailmanのaliasを追加
    alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
    alias_database = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
    virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman

    postfixを再起動する

    $ sudo service postfix restart

    ・apacheの設定

    apache2では*-aveilableに実際のファイルをコピーし、以下のコマンドで*-enabledにシンボリックリンクを作成/削除して、有効/無効にするようだ。

    シンボリックリンクを作成する場所無効にするコマンド有効にするコマンド
    mods-enableda2dismod a2enmodモジュールの設定ファイル
    sites-enableda2dissitea2ensite仮想ホストの設定ファイル
    sites-enableda2disconfa2enconf その他設定ファイル

    confファイルの修正

      $ sudo vi /etc/apache2/sites-available.000-default.conf
    ServerName ml.mydomain.com
    ServerAdmin postmaster@mydomain.com

    cgiモジュールを有効にする

      $ sudo a2enmod cgi

    mailmanのapache.confを追加して有効化する

      $ sudo ln -s /etc/mailman/apache.conf /etc/apache2/conf-available/mailman.conf
      $ sudo a2enconf mailman

    設定ファイルの確認

      $ sudo apache2ctl configtest
      $ sudo apache2ctl stop
      $ sudo apache2ctl configtest # confファイル検査
      $ sudo apache2ctl -S # VirtualHost確認 -t -D DUMP_VHOSTS -D DUMP_RUN_CFG と同じ
      $ sudo apache2ctl -t -D DUMP_INCLUDES
      $ sudo apache2ctl -t -D DUMP_MODULES

    ・apacheを起動する
     $ sudo apache2ctl start

    Windows Defenderファイアウォールの警告が出たら許可する

      以下のエラーが出た時
        Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT
        https://note.kiriukun.com/entry/20200404-failed-to-enable-APR_TCP_DEFER_ACCEPT-on-wsl-ubuntu-apache2
       以下をapache.confの末尾に追加する
          AcceptFilter http none
          AcceptFilter https none

    ・メーリングボックスの管理

    ・Web UIでの編集

    http://localhost/mailman/admin/
    http://localhost/mailman/admin/mailman

    作成されたメーリングリストのメンバーは0人なので、自分を追加する

    ・Web UIで表示するHTTPアドレスの変更

    以下のコマンドで確認する
      $ sudo /usr/lib/mailman/bin/dumpdb /var/lib/mailman/lists/mailman/config.pck | grep web_page
    変更用のファイルを作る
      $ sudo vi /etc/mailman/change_url.py
    def change_url(mlist):
    mlist.Lock()
    mlist.web_page_url = 'http://ml.mydomain.com/mailman/'
    mlist.Save()
    所定の場所にシンボリックリンクを作り、winlistを実行する
      $ sudo ln -s /etc/mailman/change_url.py /usr/lib/mailman/bin/change_url.py
      $ sudo /usr/lib/mailman/bin/withlist -r change_url mailman    # メーリングリストmailmanのみの場合
      $ sudo /usr/lib/mailman/bin/withlist -r change_url -a         # すべて書き換える場合
    
    以下のコマンドで変更されていることを確認する
      $ sudo /usr/lib/mailman/bin/dumpdb /var/lib/mailman/lists/mailman/config.pck | grep web_page

    ・起動・終了コマンド一覧

    sudo mailmanctl start
    sudo mailmanctl -s start
    sudo apache2ctl start
    sudo /etc/init.d/rsyslog --privileged start
    sudo service postfix start
    
    sudo mailmanctl stop
    sudo apache2ctl stop
    sudo service postfix stop
    
    sudo mailmanctl restart
    sudo mailmanctl -s restart
    sudo apache2ctl restart
    sudo /etc/init.d/rsyslog restart
    sudo service postfix restart

    ログの確認

    postfix
    sudo less +F /var/log/mail.log
    sudo less /var/log/mail.err
    mailman
    sudo less /var/log/mailman/error
    sudo less +F /var/log/mailman/post
    sudo less /var/log/mailman/qrunner
    sudo less /var/log/mailman/smtp
    sudo less /var/log/smtp-failure
    sudo less /var/log/subscribe
    sudo less /var/log/ette

    fetchmail
    sudo less +F /var/log/fetchmail.log

    apache2
    sudo ls -lF /var/log/apache2/
    sudo less +F /var/log/apache2/access.log
    sudo less /var/log/apache2/error.log

    メール
    sudo less -f /var/spool/mail/root
    sudo less -f /var/spool/mail/user

    ・メーリングリストの設定
    送信元メールアドレスはそのまま表示するが、返信はメーリングリストに届くようにする。

    from_is_list いいえ
    anonumouse_list いいえ
    first_strip_reply_to いいえ
    reply_goes_to_address このリスト

  • WSLを使ってメーリングリストを作成(postfix編)

     当初はsendmail+majordomoを利用してメーリングリストを実現しようとしたが、利用しているUbuntuにmajordomoが用意されていないらしいので、途中から切り替えた。なぜmajordomoかというと、件名に連番をつけたいから。

    ・インストール

    $ sudo apt install postfix
      Internet with smarthostを選択
      mydomain.com

    ・設定

     変更部分のみ

      $ sudo vi /etc/postfix/main.cf
    myhostname = ml.mydomain.com
    mydomain = mydomain.com
    myorigin = $myhostname
    inet_interfaces = all
    mydestination = $myhostname, localhost.$mydomain, localhost
    smtpd_banner = $myhostname ESMTP unknown
    sendmail_path = /usr/sbin/sendmail
    newaliases_path = /usr/bin/newaliases
    mailq_path = /usr/bin/mailq
    setgid_group = postdrop
    html_directory = no
    manpage_directory = /usr/share/man
    sample_directory = /etc/postfix
    readme_directory = /usr/share/doc/postfix
    # ここから設定ファイルの下部に追加する
    smtpd_recipient_restrictions=permit_mynetworks, reject
    
    # 転送先の上位メールサーバ
    relayhost = [smtp.gmail.com]:587
    #relayhost = [email-smtp.ap-northeast-1.amazonaws.com]:587
    # SMTP-AUTH を有効
    smtp_sasl_auth_enable = yes
    # 転送先のサーバのアドレスと認証するユーザ名とパスワードを記述したファイル
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    # 匿名ログインを許可しない
    smtp_sasl_security_options = noanonymous
    # 転送先のサーバの SASL メカニズムに対するフィルタ
    smtp_sasl_mechanism_filter = cram-md5, plain, login
    # 可能ならば TLS 暗号化
    smtp_tls_security_level = may
    # CA証明書(ca-certificates)
    smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt
    
    # ログ設定(デフォルト値)
    # /var/log/mail.logに出力される
    syslog_facility = mail
    
    # mailman用設定
    recipient_delimiter = +
    owner_request_special = no

    ・SMTP-AUTH
    転送先のサーバのアドレスと認証するユーザ名とパスワードを行ごとに記述する。
    複数行に羅列でき、main.cfで指定されたものが使われるらしい

      $ sudo vi /etc/postfix/sasl_passwd
    [smtp.gmail.com]:587 xxxx@gmail.com:yyyy
    [email-smtp.xxxx.amazonaws.com]:587 xxxx:yyyy

    ファイルのパーミッションを変更する

      $ sudo chmod 600 /etc/postfix/sasl_passwd

    Postfix が参照するデータベースファイルに反映させる

      $ sudo postmap hash:/etc/postfix/sasl_passwd

    ・設定ファイルのエラー確認

      $ sudo postfix -v check
    postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out
    上のワーニングが出るが無視してよいらしい。いやならシンボリックリンクからハードリンクに変える
      $ sudo rm /etc/postfix/makedefs.out; sudo ln /usr/share/postfix/makedefs.out /etc/postfix/makedefs.out

    ・Postfix を再起動する

      $ sudo service postfix restart
    Windows Defenderファイアウォールからの警告が出たら許可する

    ・ログを確認する

      $ tail -f /var/log/mail.log
      $ tail -f /var/log/mail.err

    ログが出力されない場合、rsyslog のプロセスや設定や状態を確認する

    プロセスの確認
      $ ps aux|grep rsyslog|grep -v grep
    状態の確認
      $ sudo /etc/init.d/rsyslog status
    プロセスの開始
      $ sudo /etc/init.d/rsyslog start

    rsyslogd からimklogのエラーが出るときは、/etc/rsyslogd.conf から
    module(load=”imklog” permitnonkernelfacility=”on”)
    をコメントアウトする

    以下のエラーはWSLの問題らしく消せないらしい

    rsyslogd: set SO_TIMESTAMP failed on '/dev/log': Invalid argument
    rsyslogd: set SO_TIMESTAMP failed on '/var/spool/postfix/dev/log': Invalid argument

    ・デバッグ
     debug_peer_listに指定した範囲に対してのみ、デバッグ情報が出力される

      $ sudo vi /etc/postfix/main.cf
    debug_peer_level = 1 # デフォルトは2
    debug_peer_list = 0.0.0.0/0 # デフォルトは無し

    ・テスト送信

    telnet localhost 25
    MAIL From: user@ml.mydomain.com
    RCPT TO: postmaster@dmyomain.com
    DATA
    From: user@ml.mydomain.com
    Subject: This is the subject field of the email
    This is the message to be sent.
    .
    quit