본문 바로가기
Java

[Java] SMTP를 이용한 이메일 발송

by teamnova 2023. 12. 27.

안녕하세요 이번 게시글에서는 SMTP를 이용한 이메일 발송 기능에 대해서 설명드리겠습니다. 우선 시연영상부터 보여드리겠습니다.

 

다음은 전체 코드입니다. 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class EmailSender extends JFrame {
    
    // 사용자 인터페이스 구성요소 선언
    private JTextField txtTo;
    private JTextField txtSubject;
    private JTextArea txtMessage;
    private JButton btnSend;
    
    // 생성자
    public EmailSender() {
        createUI(); // 사용자 인터페이스 생성 메소드 호출
    }
    
    // 사용자 인터페이스를 생성하고 초기화하는 메소드
    private void createUI() {
        setTitle("Java Swing Email Sender"); // 창 제목 설정
        setSize(500, 300); // 창 크기 설정
        setLocationRelativeTo(null); // 창을 화면 중앙에 배치
        setDefaultCloseOperation(EXIT_ON_CLOSE); // 창 닫기 버튼 동작 정의
        
        // 콘텐츠 팬에 대한 레이아웃 설정
        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        
        // "To" 입력 필드 구성
        JPanel panelTo = new JPanel();
        panelTo.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelTo.add(new JLabel("To:"));
        txtTo = new JTextField(30);
        panelTo.add(txtTo);
        
        // "Subject" 입력 필드 구성
        JPanel panelSubject = new JPanel();
        panelSubject.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelSubject.add(new JLabel("Subject:"));
        txtSubject = new JTextField(30);
        panelSubject.add(txtSubject);
        
        // "Message" 입력 영역 구성
        JPanel panelMessage = new JPanel();
        panelMessage.setLayout(new BorderLayout());
        txtMessage = new JTextArea(10, 30);
        panelMessage.add(new JLabel("Message:"), BorderLayout.NORTH);
        panelMessage.add(new JScrollPane(txtMessage), BorderLayout.CENTER);
        
        // "Send" 버튼 구성
        btnSend = new JButton("Send");
        btnSend.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                sendEmail(); // 버튼 클릭 시 이메일 발송 메소드 호출
            }
        });
        
        // 각 패널을 프레임에 추가
        add(panelTo);
        add(panelSubject);
        add(panelMessage);
        add(btnSend);
        
        pack(); // 콘텐츠에 맞게 창 크기 조절
        setVisible(true); // 창을 보이게 설정
    }
    
    // 이메일을 발송하는 메소드
    private void sendEmail() {
        // SMTP 서버 설정
        String host = "smtp.gmail.com"; // SMTP 서버 주소
        // naver인 경우 smtp.naver.com
        final String username = "your_email@gmail.com"; // 사용자 이메일 주소
        final String password = "your_app_password"; // 앱 비밀번호 또는 이메일 비밀번호
        int port = 465; // SMTP 서버 포트
        // naver인 경우 587
        
        // 메일 서버 연결을 위한 프로퍼티 설정
        Properties props = new Properties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        
        // 사용자 인증을 위한 세션 생성
        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });
        
        try {
            // 이메일 메시지 설정
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username)); // 발신자 설정
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(txtTo.getText())); // 수신자 설정
            message.setSubject(txtSubject.getText()); // 제목 설정
            message.setText(txtMessage.getText()); // 내용 설정
            
            // 메일 발송
            Transport.send(message);
            JOptionPane.showMessageDialog(null, "Email sent successfully!");
        } catch (MessagingException me) {
            me.printStackTrace();
            JOptionPane.showMessageDialog(null, "Error sending email.");
        }
    }
    
    // 프로그램의 진입점(main 메소드)
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new EmailSender(); // 이메일 발송자 객체 생성 및 프로그램 시작
            }
        });
    }
}

 

* gmail 인경우 주의 사항

이메일을 보낼 계정에 2단계 인증 설정이 되어 있는 경우 해당 계정의 비밀번호가 아니라 발급받은 2단계 인증 비밀번호를 입력해야합니다.

google account 설정 > 보안 > 2단계 인증 으로 가면

이 부분에서 앱 비밀번호 생성후 해당 비밀번호를 입력해야 합니다.

그렇지 않다면 아래의 에러가 발생하게 됩니다. 

Message Sending Failedjavax.mail.AuthenticationFailedException: 534-5.7.9 Application-specific password required.