본문 바로가기

Ubuntu 기반 Postfix 메일 서버 구축 및 Java 연동

by 애덤더미 2024. 11. 4.
반응형

안녕하세요, 오늘은 Ubuntu 서버에서 Postfix 메일 서버를 구축하고 Java 애플리케이션과 연동하는 방법에 대해 알아보겠습니다. 최근 많은 개발 환경에서 알림 및 트랜잭션 이메일 전송이 필수 기능이 되었는데요, 이를 위해 안정적이고 보안이 강화된 메일 서버를 운영하는 것이 중요합니다. 특히, TLS/SSL 암호화와 SMTP 인증을 통해 메일 전송의 보안을 강화할 수 있습니다.

 

이 글에서는 Ubuntu 20.04 LTS 또는 22.04 LTS를 기반으로 Postfix와 Dovecot을 설치하고, TLS 설정 및 사용자 인증까지 다룰 예정입니다. 또한, JavaMail API를 사용해 Java 애플리케이션에서 메일을 발송하는 방법도 단계별로 설명하니, 여러분의 개발 환경에 손쉽게 메일 서버를 구축할 수 있을 것입니다. 그럼, Ubuntu 환경에서 메일 서버 구축을 시작해 보겠습니다.

 

1. 시스템 업데이트

먼저 서버 패키지를 최신 상태로 업데이트합니다.

sudo apt update
sudo apt upgrade -y

2. Postfix 설치

Postfix는 Ubuntu의 기본 메일 서버 소프트웨어로, 메일 전송 및 수신을 담당합니다. TLS 및 SMTP 인증을 통해 보안성을 강화할 수 있습니다.

sudo apt install postfix

설치 중 구성 마법사가 나타나면 다음과 같이 설정합니다.

  • General type of mail configuration: Internet Site 선택
  • System mail name: 메일 서버의 도메인 이름 입력 (예: example.com)
  • 버전: Postfix 3.4 이상 권장 (Ubuntu 20.04에서는 기본적으로 3.4 버전 이상 제공)

3. Postfix 구성 파일 수정

Postfix의 메인 설정 파일을 편집하여 필요한 도메인 및 네트워크 구성을 설정합니다.

sudo nano /etc/postfix/main.cf

 

다음 설정을 추가하거나 수정합니다.

# 호스트 및 도메인 설정
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain

# 네트워크 설정
inet_interfaces = all
inet_protocols = ipv4

# 메일 수신 도메인
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 신뢰할 수 있는 네트워크
mynetworks = 127.0.0.0/8

# 홈 디렉토리 메일박스 사용
home_mailbox = Maildir/

# SMTP 인증 설정
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

# TLS 설정
smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem
smtpd_tls_key_file = /etc/ssl/private/postfix.key
smtpd_use_tls = yes
smtpd_tls_auth_only = yes

# 수신 제한 (인증된 사용자만 메일 발송 가능)
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination

4. SSL/TLS 인증서 생성

보안을 강화하기 위해 SSL/TLS 인증서를 생성합니다. 자체 서명된 인증서를 사용할 수도 있고, Let’s Encrypt와 같은 서비스를 통해 무료 인증서를 이용할 수도 있습니다.

sudo openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.key
sudo chmod 600 /etc/ssl/private/postfix.key
  • 버전: OpenSSL 1.1 이상 (Ubuntu 20.04 및 22.04에서는 1.1 버전 기본 제공)

5. Dovecot 설치 및 설정

Dovecot은 SMTP 인증을 처리하며 IMAP 및 POP3 프로토콜을 통한 메일 수신 기능을 제공합니다.

sudo apt install dovecot-core dovecot-imapd
  • 버전: Dovecot 2.3 이상 (Ubuntu 20.04 및 22.04에서 기본 제공)

Dovecot 설정 파일을 편집하여 Postfix와 연동합니다.

sudo nano /etc/dovecot/conf.d/10-master.conf

 

다음 섹션을 찾아 수정합니다.

service auth {
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
}

6. 메일 사용자 계정 생성

Postfix와 Dovecot에서 사용할 사용자 계정을 생성합니다.

sudo adduser mailuser

암호를 설정합니다.

7. 서비스 재시작

변경 사항을 적용하기 위해 Postfix와 Dovecot 서비스를 재시작합니다.

sudo systemctl restart postfix
sudo systemctl restart dovecot

8. 방화벽 설정

메일 서버 포트(25, 465, 587)를 열어줍니다.

sudo ufw allow Postfix

 

또는 포트를 지정하여 설정합니다.

sudo ufw allow 25/tcp    # SMTP
sudo ufw allow 587/tcp   # TLS 포트

9. DNS 설정

외부로 메일을 보내기 위해 DNS 설정이 필요합니다.

  • A 레코드: mail.example.com이 서버의 IP를 가리키도록 설정
  • MX 레코드: 도메인의 MX 레코드를 mail.example.com으로 설정
  • SPF 레코드: 발송 서버를 인증하기 위해 TXT 레코드 추가

예시 SPF 레코드:

"v=spf1 a mx ip4:서버_IP ~all"

10. JavaMail과 연동

JavaMail API를 통해 Java 애플리케이션에서 Postfix 서버로 메일을 보낼 수 있습니다.

JavaMail API 의존성 추가 (Maven)

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

 

Java 코드 예시

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class EmailService {

    public static void sendEmail(String recipient, String subject, String content, String filePath) {
        String host = "mail.example.com"; // Postfix 서버 도메인 또는 IP
        String port = "587"; // TLS 포트
        String username = "mailuser"; // 메일 사용자 계정
        String password = "your_password"; // 메일 사용자 암호

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true"); // TLS 사용
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);

        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            // 메일 메시지 구성
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username + "@example.com"));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
            message.setSubject(subject);

            // 메일 본문 및 첨부 파일 처리
            MimeBodyPart mimeBodyPart = new MimeBodyPart();
            mimeBodyPart.setContent(content, "text/html; charset=utf-8");

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(mimeBodyPart);

            if (filePath != null) {
                MimeBodyPart attachmentPart = new MimeBodyPart();
                attachmentPart.attachFile(filePath);
                multipart.addBodyPart(attachmentPart);
            }

            message.setContent(multipart);

            // 메일 전송
            Transport.send(message);
            System.out.println("메일이 성공적으로 전송되었습니다.");

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("메일 전송 중 오류 발생: " + e.getMessage());
        }
    }
}
  • JavaMail API 버전: 1.6.2 (위 의존성 추가를 통해 JavaMail 라이브러리 포함)

11. 로그 확인

Postfix와 Java 애플리케이션의 로그를 확인하여 오류가 없는지 점검합니다.

sudo tail -f /var/log/mail.log

 

반응형