방금 전 포스트에 이어 이번 포스트에서는 CentOS 7 및 CentOS 8에서 Postfix와 Dovecot을 설치하고, TLS 보안을 적용해 메일 전송의 안전성을 확보하는 방법을 다루겠습니다. 나머지 Java 코드는 같습니다.
1. 시스템 업데이트
먼저 서버 패키지를 최신 상태로 업데이트합니다.
sudo yum update -y
2. Postfix 설치
CentOS에서 기본 메일 전송 에이전트로 제공되는 Postfix를 설치합니다. TLS 및 SMTP 인증을 통해 보안성을 강화할 수 있습니다.
sudo yum install -y postfix
- 버전: Postfix 2.10 이상 (CentOS 7 기본 제공은 2.10 버전, CentOS 8에서는 3.x 버전 제공)
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.0 이상 (CentOS 7에서는 1.0 버전 이상, CentOS 8에서는 1.1 버전 이상)
5. Dovecot 설치 및 설정
Dovecot은 Postfix와 연동하여 SMTP 인증을 처리하고, IMAP 및 POP3를 통한 메일 수신을 제공합니다.
sudo yum install -y dovecot
- 버전: Dovecot 2.2 이상 (CentOS 7과 CentOS 8에서 기본적으로 2.2 버전 이상 제공)
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. 메일 사용자 계정 생성
메일 전송에 사용할 로컬 시스템 사용자를 생성합니다.
sudo adduser mailuser
암호를 설정합니다.
7. 서비스 활성화 및 시작
Postfix와 Dovecot을 활성화하고 시작합니다.
sudo systemctl enable postfix
sudo systemctl start postfix
sudo systemctl enable dovecot
sudo systemctl start dovecot
8. 방화벽 설정
방화벽에서 SMTP 포트를 열어줍니다.
sudo firewall-cmd --permanent --add-service=smtp
sudo firewall-cmd --permanent --add-port=587/tcp # TLS 포트 추가
sudo firewall-cmd --reload
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/maillog
'※ 소소한 IT' 카테고리의 다른 글
AI 코드 편집기 Cursor로 본 요즘 개발 트렌드 (0) | 2024.11.14 |
---|---|
개발자라면 알아야 요즘 대세! SNS 연동부터 Passwordless까지, 최신 암호화 로그인 방법 알아보기 (0) | 2024.11.12 |
클라우드 조직의 트렌드로 SaaS와 IaaS 팀 구성의 최적화 방법 (0) | 2024.11.06 |
SaaS와 IaaS의 차이점 완벽 이해하기! 클라우드 서비스 선택 가이드 (1) | 2024.11.05 |
Ubuntu 기반 Postfix 메일 서버 구축 및 Java 연동 (1) | 2024.11.04 |