메일 서버 · 10 min read · Nov 06, 2025

Postal을 사용하여 완전한 기능을 갖춘 메일 서버 만들기

Postal은 이메일을 보내고 받기 위한 무료 오픈 소스 완전 메일 서버입니다. Ruby와 JavaScript로 작성되었습니다. Postal을 자신의 서버에 쉽게 설치할 수 있습니다. 또한 스팸 이메일을 줄이는 데 필요한 올바른 DNS 정보를 제공하는 데 도움을 줍니다. Postal은 많은 조직에서 매일 이메일을 보내고 받는 데 사용됩니다.

이 튜토리얼에서는 Ubuntu 17.04에 Postal 메일 서버를 설치합니다.

전제 조건

  • 최소 Ubuntu 17.04 서버. 8GB RAM 권장.
  • 루트 권한. 이 가이드는 루트 사용자로 작성되었으며, sudo 사용자로 로그인한 경우 sudo -i를 실행하십시오.
  • 서버를 가리키는 도메인 이름.

기본 시스템 업데이트

패키지를 설치하기 전에 다음 명령을 사용하여 패키지와 저장소를 업데이트하는 것이 좋습니다.

apt update && apt -y upgrade
shutdown -r now

시스템이 업데이트되면 Ruby를 설치합니다.

Ruby 설치

Postal은 Ruby로 작성되었으므로 시스템에 Ruby 2.3 이상을 설치해야 합니다. 이 튜토리얼에서는 RVM을 사용하여 최신 버전의 Ruby를 설치합니다. 다음 명령을 실행하여 서버에 RVM의 GPG 키를 추가합니다.

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

이제 다음 명령을 사용하여 RVM을 설치합니다.

curl -sSL https://get.rvm.io | bash -s stable

RVM을 즉시 사용하려면 다음 명령을 실행해야 합니다.

source /etc/profile.d/rvm.sh

이제 다음 명령을 사용하여 Ruby 목록을 가져옵니다.

rvm list known

다음과 같은 출력을 볼 수 있습니다:

# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.6]
[ruby-]2.3[.3]
[ruby-]2.4[.0]
ruby-head

이제 다음 명령을 사용하여 목록에서 최신 버전의 Ruby를 설치합니다.

rvm install 2.4

다음 명령을 사용하여 Ruby 버전을 사용합니다.

rvm use 2.4

다음 명령을 사용하여 Ruby 버전을 확인할 수 있습니다.

ruby -v

Ruby가 성공적으로 설치되었다면 다음과 같은 출력을 볼 수 있습니다.

root@ubuntu:~# ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

Ruby Gems 설치

서버에서 Postal을 실행하려면 bundler와 procodile을 설치해야 합니다. bundler는 Ruby gem 애플리케이션을 위한 의존성 관리자입니다. procodile은 Ruby 애플리케이션을 위한 프로세스 관리 도구입니다. 다음 명령을 사용하여 두 애플리케이션을 설치합니다.

gem install bundler
gem install procodile

MariaDB 데이터베이스 서버 설치

MariaDB는 MySQL 데이터베이스 서버의 포크입니다. MySQL은 데이터를 표 형식으로 저장하는 데 사용되는 관계형 데이터베이스 관리 시스템 소프트웨어입니다. 서버에 MariaDB를 설치하려면 다음을 실행하십시오:

apt -y install mariadb-client mariadb-server libmysqlclient-dev

다음 명령을 실행하여 MariaDB를 시작하고 부팅 시 시작하도록 설정합니다.

systemctl start mariadb
systemctl enable mariadb

이제 다음 명령을 실행하여 MariaDB 설치를 보안합니다.

mysql_secure_installation

위 명령은 새로운 MariaDB 설치를 보안하기 위한 스크립트를 실행합니다. 스크립트는 기존 루트 사용자 비밀번호를 요청합니다. MariaDB를 방금 설치했으므로 루트 비밀번호가 설정되지 않았습니다. 계속 진행하려면 Enter를 누르십시오.

스크립트는 MariaDB 설치를 위한 루트 비밀번호를 설정할 것인지 묻습니다. y를 선택하고 설치를 위한 강력한 비밀번호를 설정하십시오. 대부분의 질문은 자명하며 모든 질문에 대해 예 또는 y로 대답해야 합니다.

Postal을 위한 데이터베이스 설정

Postal을 위한 데이터베이스를 만들기 위해 먼저 MySQL 명령줄에 로그인해야 합니다. 다음 명령을 실행하십시오.

mysql -u root -p

위 명령은 루트 사용자의 MySQL 셸에 로그인합니다. 루트 사용자 비밀번호를 입력하라는 메시지가 표시됩니다. 비밀번호를 제공하여 로그인하십시오. 이제 다음 쿼리를 실행하여 Postal 설치를 위한 새 데이터베이스를 만듭니다.

CREATE DATABASE postal CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;

위 쿼리는 postal이라는 새 데이터베이스를 생성합니다. 쿼리는 항상 세미콜론으로 끝나야 하므로 각 쿼리 끝에 세미콜론을 사용하는 것을 잊지 마십시오.

이제 생성한 데이터베이스에 대해 데이터베이스 사용자에게 모든 권한을 부여하십시오. 다음 명령을 실행하십시오.

GRANT ALL ON `postal`.* TO `postal`@`127.0.0.1` IDENTIFIED BY "StrongPassword";

StrongPassword를 매우 강력하고 안전한 비밀번호로 교체하십시오.

Postal이 데이터베이스를 자동으로 작성하지만, 이를 위해 Postal 사용자에게 적절한 권한을 제공해야 합니다. 다음 명령을 실행하여 postal-로 시작하는 모든 사용자에게 권한을 부여하십시오.

GRANT ALL PRIVILEGES ON `postal-%` . * to `postal`@`127.0.0.1`  IDENTIFIED BY "StrongPassword";

이제 다음 명령을 실행하여 데이터베이스 권한에 대한 변경 사항을 즉시 적용하십시오.

FLUSH PRIVILEGES;

다음 명령을 사용하여 MySQL 프롬프트에서 종료하십시오.

EXIT;

RabbitMQ 설치

RabbitMQ는 Erlang 언어로 작성되었습니다. 이 튜토리얼에서는 서버에 최신 버전의 Erlang을 설치합니다. 다음 명령을 사용하여 Erlang을 설치하십시오.

apt -y install erlang

다음 명령을 실행하여 GPG 키를 가져옵니다:

curl -sL https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

이제 다음 명령을 실행하여 RabbitMQ 저장소를 추가합니다:

add-apt-repository 'deb http://www.rabbitmq.com/debian/ testing main'

다음 명령을 실행하여 저장소 인덱스를 업데이트합니다.

apt update

이제 다음 명령을 실행하여 RabbitMQ를 설치할 수 있습니다.

apt -y install rabbitmq-server

RabbitMQ가 이제 시스템에 설치되었습니다.

RabbitMQ 설정

다음 명령을 실행하여 RabbitMQ 서버 프로세스를 시작할 수 있습니다.

systemctl start rabbitmq-server

부팅 시 RabbitMQ를 자동으로 시작하려면 다음 명령을 실행하십시오.

systemctl enable rabbitmq-server

이제 다음 명령을 실행하여 RabbitMQ 서버에서 Postal을 위한 가상 호스트를 생성하십시오.

rabbitmqctl add_vhost /postal

이제 다음 명령을 실행하여 Postal을 위한 RabbitMQ 사용자를 추가하십시오.

rabbitmqctl add_user postal StrongPassword

StrongPassword를 매우 강력한 비밀번호로 교체하십시오.

이제 RabbitMQ 가상 호스트에 대해 RabbitMQ 사용자에게 적절한 권한을 설정하십시오.

rabbitmqctl set_permissions -p /postal postal ".*" ".*" ".*"

Git 및 Node.js 설치

Git은 설치 패키지와 몇 가지 의존성을 검색하는 데 사용됩니다. 다음 명령을 사용하여 시스템에 Git을 설치하십시오.

apt -y install git

다음 명령을 사용하여 Git이 성공적으로 설치되었는지 확인할 수 있습니다.

git --version

다음과 같은 출력을 얻어야 합니다.

root@ubuntu:~# git --version
git version 2.11.0

Node.js는 JavaScript 라이브러리를 컴파일하는 데 사용됩니다. 다음 명령을 사용하여 소프트웨어를 설치하십시오.

apt -y install nodejs

다음 명령을 사용하여 Node.js가 성공적으로 설치되었는지 확인할 수 있습니다.

nodejs -v

다음과 같은 출력을 얻어야 합니다.

root@ubuntu:~# nodejs -v
v4.7.2

이제 모든 의존성이 준비되었으므로 Postal을 설치할 수 있습니다.

Postal 설치

Postal은 고유한 격리된 사용자로 실행되어야 합니다. 다음 명령을 사용하여 새 사용자를 생성하십시오.

useradd -r -m -d /opt/postal -s /bin/bash postal

위 명령은 사용자 이름이 postal인 새 사용자를 생성하고 홈 디렉토리는 /opt/postal로 설정됩니다.

다음 명령을 실행하여 Ruby가 특권 포트를 수신할 수 있도록 허용합니다.

setcap 'cap_net_bind_service=+ep' /usr/local/rvm/rubies/ruby-2.4.0/bin/ruby

이제 모든 것이 준비되었으므로, 다음 명령을 사용하여 Postal 사용자로 최신 Postal 아카이브를 다운로드하고 압축을 풉니다.

wget https://postal.atech.media/packages/stable/latest.tgz -O - | sudo -u postal tar zxpv -C /opt/postal

이제 다음 명령을 실행하여 Postal 바이너리 파일에 대한 심볼릭 링크를 생성하십시오.

ln -s /opt/postal/bin/postal /usr/bin/postal

이제 모든 디렉토리에서 Postal 서버와 상호작용할 수 있습니다. 다음 명령을 실행하려면 postal 사용자로 셸에 로그인해야 합니다.

su - postal

이제 애플리케이션을 실행하는 데 필요한 모든 Ruby 의존성을 설치해야 합니다.

postal bundle /opt/postal/vendor/bundle

의존성이 설치되면 기본 구성 파일을 생성해야 합니다.

postal initialize-config

위 명령은 다양한 키와 인증서를 포함하여 Postal 설치에 필요한 구성을 생성합니다. 또한 기본 postal.yml 구성 파일도 생성합니다. 다음과 같은 출력을 얻어야 합니다.

postal@ubuntu:~$ postal initialize-config
Created example config file at /opt/postal/config/postal.yml
Created new private key for Let's Encrypt
Created new signing key for DKIM & HTTP requests
Created new private key for default fast server TLS connections
Created new self signed certificate for default fast server TLS connections

이제 postal.yml 구성에서 몇 가지 옵션을 구성해야 합니다.

nano /opt/postal/config/postal.yml

다음 줄을 찾으십시오:

web:
  # 관리 인터페이스가 사용 가능한 호스트
  host: postal.example.com

호스트 이름을 실제 도메인 이름으로 변경하십시오. 다음 줄을 찾으십시오.

main_db:
  # MySQL 데이터베이스의 연결 세부정보를 지정하십시오.
  host: 127.0.0.1
  username: postal
  password: p0stalpassw0rd
  database: postal

message_db:
  # 메일 서버의 메시지 데이터베이스를 보관할 MySQL 서버의 연결 세부정보를 지정하십시오.
  host: 127.0.0.1
  username: postal
  password: p0stalpassw0rd
  prefix: postal

생성한 데이터베이스에 따라 사용자 이름, 비밀번호 및 데이터베이스 이름을 변경하십시오. 다음 줄을 찾으십시오:

rabbitmq:
  # RabbitMQ 서버의 연결 세부정보를 지정하십시오.
  host: 127.0.0.1
  username: postal
  password: StrongPassword
  vhost: /postal

RabbitMQ에 대해 생성한 vhost 및 사용자에 따라 위 구성을 변경하십시오. 다음으로 DNS 구성을 찾으십시오.

dns:
  # 구성한 DNS 레코드를 지정합니다. 자세한 내용은
  # https://github.com/atech/postal/wiki/Domains-&-DNS-Configuration를 참조하십시오.
  mx_records:
    - mx.postal.example.com
  smtp_server_hostname: postal.example.com
  spf_include: spf.postal.example.com
  return_path: rp.postal.example.com
  route_domain: routes.postal.example.com
  track_domain: track.postal.example.com

메일 서버와 함께 사용하려는 실제 도메인으로 위의 도메인을 변경하십시오.

파일을 저장하고 편집기를 종료하십시오. 이제 다음을 실행하여 데이터베이스 및 기타 자산을 초기화하십시오:

postal initialize

다음 명령을 실행하여 Postal 관리자 사용자를 생성하십시오.

postal make-user

위 명령은 이메일 주소, 사용자 이름 및 비밀번호를 요청합니다. 위 명령은 다음 출력을 생성합니다.

postal@ubuntu:~$ postal make-user
Postal User Creator
Enter the information required to create a new Postal user.
This tool is usually only used to create your initial admin user.

E-Mail Address      : [email protected]
First Name          : Liptan
Last Name           : Biswas
Initial Password:   : **************

User has been created with e-mail address [email protected]

Postal의 명령줄 설정이 이제 완료되었습니다. 다음 명령을 사용하여 서버를 시작할 수 있습니다.

postal start

서비스가 올바르게 시작되었는지 확인하려면 다음 명령을 실행하십시오.

postal status

다음과 같은 출력을 얻어야 합니다.

postal@ubuntu:~$ postal status
Procodile Version   1.0.17
Application Root    /opt/postal
Supervisor PID      5319
Started             2017-07-21 07:26:19 +0000

|| web
|| Quantity            1
|| Command             bundle exec puma -C config/puma.rb
|| Respawning          5 every 3600 seconds
|| Restart mode        usr1
|| Log path            none specified
|| Address/Port        none
|| => web.1            Running      07:26        pid:5325     respawns:0      port:-        tag:-

|| worker
|| Quantity            1
|| Command             bundle exec ruby script/worker.rb
|| Respawning          5 every 3600 seconds
|| Restart mode        start-term
|| Log path            none specified
|| Address/Port        none
|| => worker.1         Running      07:26        pid:5327     respawns:0      port:-        tag:-

|| cron
|| Quantity            1
|| Command             bundle exec rake postal:cron
|| Respawning          5 every 3600 seconds
|| Restart mode        term-start
|| Log path            none specified
|| Address/Port        none
|| => cron.1           Running      07:26        pid:5329     respawns:0      port:-        tag:-

|| smtp
|| Quantity            1
|| Command             bundle exec rake postal:smtp_server
|| Respawning          5 every 3600 seconds
|| Restart mode        usr1
|| Log path            none specified
|| Address/Port        none
|| => smtp.1           Running      07:26        pid:5332     respawns:0      port:-        tag:-

|| requeuer
|| Quantity            1
|| Command             bundle exec rake postal:requeuer
|| Respawning          5 every 3600 seconds
|| Restart mode        term-start
|| Log path            none specified
|| Address/Port        none
|| => requeuer.1       Running      07:26        pid:5334     respawns:0      port:-        tag:-

Postal을 중지하려면 항상 다음 명령을 실행할 수 있습니다.

postal stop

Nginx를 리버스 프록시로 구성하기

보안상의 이유로 Postal 웹 인터페이스와 API는 Apache 또는 Nginx와 같은 프로덕션 웹 서버 뒤에 있어야 합니다. 이 튜토리얼에서는 Nginx를 리버스 프록시로 설치하고 구성합니다.

다음 명령을 실행하여 Nginx 웹 서버를 설치하십시오.

apt -y install nginx

Nginx에 SSL을 사용하는 것이 좋습니다. 자체 서명된 인증서, Let’s Encrypt 무료 SSL 인증서 또는 상업용 인증서를 사용할 수 있습니다. 이 튜토리얼에서는 Let’s Encrypt 무료 SSL을 사용합니다.

다음 명령을 실행하여 Let’s Encrypt 클라이언트(인증서 발급 도구)를 설치하십시오.

apt -y install certbot

설치가 완료되면 다음 명령을 실행하여 Let’s Encrypt 인증 기관에서 인증서를 받으십시오. 도메인 이름이 서버를 가리키고 있는지 확인하십시오. certbot은 인증서를 제공하기 전에 도메인 권한을 확인합니다. mail.example.com을 실제 도메인 이름으로 교체하십시오.

certbot certonly --standalone -d mail.example.com

인증서가 생성되면 /etc/letsencrypt/live/mail.example.com에 저장됩니다.

Let’s Encrypt SSL은 90일 후에 만료되므로 인증서의 자동 갱신을 설정하는 것이 좋습니다. 다음 명령을 실행하여 crontab 파일을 엽니다.

crontab -e

crontab 파일에 다음 줄을 입력하십시오.

30 1 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

위의 크론 작업은 매주 월요일 오전 1시 30분에 자동으로 실행되며, 인증서가 만료될 경우 자동으로 갱신합니다.

이제 다음 명령을 실행하여 웹사이트에 대한 새 서버 블록을 생성하십시오.

nano /etc/nginx/conf.d/mail.example.com.conf

파일에 다음 내용을 입력하십시오.

server {
    listen [::]:80;
    listen 0.0.0.0:80;
    server_name mail.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen [::]:443 ssl;
    listen 0.0.0.0:443 ssl;
    root /opt/postal/public;
    server_name mail.example.com;
    ssl_certificate      /etc/letsencrypt/live/mail.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/mail.example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_prefer_server_ciphers on;
    ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM:DH+AES256:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;

    location / {
       client_max_body_size 50M;
       try_files $uri $uri/index.html $uri.html @puma;
    }

    location /assets {
       add_header Cache-Control max-age=3600;
    }

    location @puma {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_pass http://127.0.0.1:5000;
    }
}

파일을 저장하고 편집기를 종료하십시오. 이제 다음 명령을 실행하여 Nginx 웹 서버를 재시작하십시오.

systemctl restart nginx

Nginx가 부팅 시 자동으로 시작되도록 하려면 다음 명령을 실행하십시오.

systemctl enable nginx

이제 좋아하는 웹 브라우저를 통해 다음 웹사이트를 탐색하여 Postal에 접근할 수 있습니다.

https://mail.example.com

Postal 구성

위 사이트를 탐색하면 다음 인터페이스가 표시됩니다.

Postal 로그인

이전에 생성한 사용자 이메일 주소와 비밀번호를 입력하십시오. 로그인하면 새 조직을 생성하라는 메시지가 표시됩니다.

Postal에 조직 추가

조직의 이름을 제공하십시오. 자동 생성된 짧은 이름을 사용할 수도 있고, 직접 지정할 수도 있습니다. 짧은 이름은 SMTP 서버에 인증할 때 사용자 이름으로 사용됩니다. 문자, 숫자 및 하이픈만 포함해야 합니다.

조직 이름 입력

조직이 생성되면 새 메일 서버를 생성하라는 메시지가 표시됩니다.

메일 서버 추가

메일 서버의 이름, 짧은 이름 및 모드를 제공하십시오. 라이브 모드에서는 모든 이메일이 정상적으로 라우팅되고 배달되지만 개발 모드에서는 웹 인터페이스에서만 볼 수 있습니다.

새 메일 서버 구축

메일 서버를 추가한 후 메일 서버에 새 도메인을 추가해야 합니다. 도메인 탭을 클릭하고 새 도메인 이름을 생성하십시오.

도메인 추가

도메인 이름을 추가한 후 도메인에 대한 DNS를 구성해야 합니다. SPF 및 DKIM에 대한 두 개의 TXT 레코드를 추가해야 합니다. 반환 경로 및 메일 배달을 위해 CNAME 레코드와 MX 레코드도 추가해야 합니다. DNS를 구성한 후 내 레코드가 올바른지 확인 버튼을 클릭하여 DNS 구성을 확인하십시오.

MX 레코드 구성

이제 이메일을 보내고 받기 위한 SMTP 자격 증명을 생성해야 합니다.

SMTP 세부정보

유형을 SMTP 또는 API로 선택하십시오. SMTP 자격 증명에 대한 이름을 제공하고 이메일 주소를 처리하는 방법을 선택하십시오.

작업이 완료되면 개요 탭으로 돌아가면 이메일 주소를 보내거나 받을 때 필요한 정보를 볼 수 있습니다.

Postal로 이메일 보내기

결론

이 튜토리얼에서는 Ubuntu 17.04에서 Postal을 사용하여 완전한 기능을 갖춘 메일 서버를 성공적으로 설정했습니다. 이 메일 서버를 사용하여 조직의 이메일을 보내고 받을 수 있습니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.