JavaRush /Java Blog /Random-KO /Java 애플리케이션에서 이메일을 보내는 방법(예제 포함)
PodoBulge
레벨 31
Минск

Java 애플리케이션에서 이메일을 보내는 방법(예제 포함)

Random-KO 그룹에 게시되었습니다
Java 애플리케이션에서 이메일을 보내는 것은 일반적인 요구 사항입니다. 핵심 Java 애플리케이션, 웹 애플리케이션 또는 엔터프라이즈 Java 애플리케이션에서 작업하는지 여부는 중요하지 않습니다. 지원 담당자에게 오류를 알리기 위해 이메일을 보내거나 등록 시 사용자에게 이메일을 보내야 할 수도 있습니다. 비밀번호를 재설정하거나 등록 후 이메일 주소를 확인하도록 요청하세요. Java 애플리케이션에서 이메일을 보내는 기능이 필요한 경우에는 여러 가지 시나리오가 있습니다. Java 애플리케이션에서 이메일을 보내는 방법(예제 포함) - 1기성 애플리케이션에는 첨부 파일, 서명을 포함한 이미지, 이메일의 서식 있는 텍스트를 보내는 기능 등 이메일 전송을 위한 모든 기능과 함께 작동하는 모듈 또는 라이브러리가 이미 있습니다. 그러나 처음부터 무언가를 작성해야 하는 경우, 그렇다면 Java Mail API는 훌륭한 옵션입니다. 이 기사에서는 메일 API( javax.mail ) 를 사용하여 Java 애플리케이션에서 이메일을 보내는 방법을 알아봅니다 . 코드를 작성하기 전에 이메일 작동 방식에 대한 몇 가지 기본 사항을 알아야 합니다. 예를 들어 SMTP (Simple Mail Transfer Protocol) 서버가 필요합니다 . Linux에서 Java 애플리케이션을 실행하는 경우 SMTP 데몬이 포트 25를 사용한다는 점을 알아야 합니다 . GMail, Yahoo 또는 기타 서비스 제공업체와 같은 공용 메일 서버를 포함하여 모든 메일 서버를 사용하여 Java를 사용하여 메시지를 보낼 수 있습니다. 호스트 이름, 포트, 연결 매개변수 등과 같은 SMTP 서버 세부 정보가 필요합니다. SSL ( 보안 소켓 계층 ), TLS ( 전송 계층 보안 )를 사용하여 이메일을 안전하게 연결하고 보낼 수도 있지만 이 예제를 간단하게 만들고 Java 애플리케이션에서 편지를 보내는 최소한의 논리에 중점을 두었습니다. 향후 기사에서는 첨부 파일을 사용하여 이메일을 보내는 방법, HTML 형식의 이메일을 보내는 방법, 이메일에 이미지를 첨부하는 방법, SSL 인증을 사용하여 GMail 서버에 연결하고 이메일을 보내는 방법 등을 배울 것입니다. 이제 이 간단한 Java Mail API 예제를 이해(토론)해 보겠습니다 .

이메일 전송을 위한 Java 코드 예

Java 프로그램에서 편지를 보내려면 Java Mail APIJAF(Java Activation Framework)가 필요합니다 . 더 정확하게 말하면 mail-1.4.5.jar , smtp-1.4.4.jaractivate-1.1.jar 이 필요합니다 . 이 프로그램을 실행하려면 이러한 JAR 파일을 다운로드하고 클래스 경로 에 포함해야 합니다 . 또는 종속성 관리를 위해 Maven을 사용하고 거기에 모든 종속성을 포함할 수 있습니다. 이러한 JAR 파일이 모두 있으면 아래 단계에 따라 Java를 사용하여 이메일을 만들고 보내세요.
  1. Session를 호출하여 객체를 생성합니다 Session.getDefaultInstance(properties). 여기서 properties-에는 SMTP 서버의 호스트 이름과 같은 중요한 속성이 모두 포함되어 있습니다.

  2. 이전 단계에서 얻은 MimeMessage객체를 전달하여 객체를 만듭니다 . Session이 개체에는 이메일 수신자, 제목, 메시지 본문, 첨부 파일 등과 같은 다양한 속성 집합이 있습니다.

  3. 이메일 이 객체가 될 수 있는 javax.mail.Transport정적 메소드를 호출하여 이메일을 보내는 데 사용합니다 .send(email)MimeMessage

객체를 생성하기 위해 전달하는 속성 수는 SessionSMTP 서버 유형에 따라 다릅니다. 예를 들어 인증이 필요하지 않은 SMTP 서버를 사용하는 경우 Sessionsmtp와 같이 하나의 속성만 사용하여 객체를 생성할 수 있습니다. mail.host이며 기본적으로 포트 25가 있으므로 포트를 지정할 필요가 없습니다. 반면, GMail의 SMTP 호스트와 같이 TLS 또는 SSL 인증이 필요한 SMTP 서버에 연결하는 경우 TLS 및 메일의 경우 mail.smtp.port=547과 같이 좀 더 많은 속성을 제공해야 합니다. SSL의 경우 smtp.port= 457입니다. 이는 인증 없이 표준 SMTP 서버에 연결하고 Java Mail API를 사용하여 문자 메시지를 보내는 완전한 Java 프로그램입니다.
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
* Java Program to send text mail using default SMTP server and without authentication.
* You need mail.jar, smtp.jar and activation.jar to run this program.
*
* @author Javin Paul
*/

public class EmailSender{
     public static void main(String args[]){

           String to = "receive@abc.om";         // sender email
           String from = "sender@abc.com";       // receiver email
           String host = "127.0.0.1";            // mail server host

           Properties properties = System.getProperties();
           properties.setProperty("mail.smtp.host", host);

           Session session = Session.getDefaultInstance(properties); // default session

           try {
                MimeMessage message = new MimeMessage(session); // email message

                message.setFrom(new InternetAddress(from)); // setting header fields

                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

                message.setSubject("Test Mail from Java Program"); // subject line

                // actual mail body
                message.setText("You can send mail from Java program by using mail API, but you need" +
                                "couple of more JAR files e.g. smtp.jar and activation.jar");

                // Send message
                Transport.send(message); System.out.println("Email Sent successfully....");
               } catch (MessagingException mex){ mex.printStackTrace(); }

     }

}
출력: 이 프로그램을 컴파일하고 실행하여 Java 프로그램에서 간단한 이메일을 보낼 수 있습니다.
$ javac EmailSender.java
$ java EmailSender
이메일을 성공적으로 보냈습니다.... 보시다시피 Java 프로그램에서 이메일을 보내는 것은 매우 쉽습니다. 개체를 생성한 후에는 , , MimeMessage에서 지정할 수 있는 수신자를 추가해야 합니다 . 수신자에 대한 작업을 마쳤으면 편지의 제목을 지정하고 마지막으로 메서드를 호출하여 편지 자체의 내용을 지정해야 합니다 . 여러 메일링을 수행하려는 경우 다음 방법을 사용하여 수신자를 지정할 수 있습니다. TOCCBCCmessage.setText()
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
TO, 을 사용하여 Message.RecipientType.TO필드에 및 -를 CC사용하여 사람을 추가할 수 있습니다 . Message.RecipientType.CCBCCMessage.RecipientType.BCC

오류 및 예외

많은 Java 프로그래머가 이메일을 보내는 프로그램을 처음 작성하기 시작할 때 대부분의 사람들은 mail.jar 및 activate.jar만으로 Java 애플리케이션에서 이메일을 보내는 데 충분할 것이라고 생각하기 때문에 오류에 직면합니다. 특히 Linux에서 로컬 SMTP 서버를 통해 이메일을 보내는 경우. CLASSPATH에 mail.jar 및 activate.jar만 사용하여 이 프로그램을 실행하면 이 오류가 발생할 가능성이 높습니다.

예외 1:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
        nested exception is:
            java.net.ConnectException: Connection refused: connect
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1984)
            at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)
            at javax.mail.Service.connect(Service.java:345)
            at javax.mail.Service.connect(Service.java:226)
            at javax.mail.Service.connect(Service.java:175)
            at javax.mail.Transport.send0(Transport.java:253)
            at javax.mail.Transport.send(Transport.java:124)
            at Testing.main(Testing.java:62)
        Caused by: java.net.ConnectException: Connection refused: connect
            at java.net.DualStackPlainSocketImpl.connect0(Native Method)
            at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
            at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
            at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
            at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528)
            at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:301)
            at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
       ... 7 more
이 오류에 대한 해결책은 매우 간단하지만 혼란스러울 수 있습니다. java.net.ConnectException: Connection refused: connect일반적으로 서버가 작동하지 않거나 연결하려는 포트가 잘못 지정되면 충돌이 발생합니다. 해결 방법: mail-1.4.5.jar 외에도 smtp-1.4.4.jar 및 activate-1.1.jar도 필요합니다.

예외 2:

NoClassDefFoundError이는 일반적으로 클래스 경로에 누락된 JAR 파일을 나타내는 또 다른 오류입니다.
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
           at java.lang.Class.getDeclaredMethods0(Native Method)
           at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
           at java.lang.Class.getMethod0(Class.java:2764)
           at java.lang.Class.getMethod(Class.java:1653)
           at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
           at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
           at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
           at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
해결책: 문제를 해결했는데, 그 이유는 잘못된 클래스 경로 때문이었습니다. 동일한 디렉토리에 프로그램에 대한 Java 클래스 파일인 세 가지 필수 JAR이 모두 있고 거기에서 프로그램을 실행했지만 Java는 이를 알아낼 수 없었습니다. 다음 명령을 입력하려고 시도했는데 프로그램이 제대로 작동했습니다.
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
이메일을 성공적으로 보냈습니다.... 현재 디렉터리는 Classpath 인수 끝에 점으로 표시되어 있습니다. 저는 Linux에서 프로그램을 실행했기 때문에 Windows에서와 마찬가지로 세미콜론(;) 대신 콜론(:)을 사용했습니다. 메일 API를 사용하여 Java 애플리케이션에서 이메일을 보내는 방법에 대한 모든 것입니다. 3개 이상의 JAR 파일이 필요하지 않기 때문에 이것이 매우 간단하다는 것을 알 수 있습니다. Gradle이나 Maven을 사용하여 종속성을 관리하면 훨씬 쉽습니다. 다음 튜토리얼에서는 첨부 파일, 그림이 포함된 이메일, 보고서와 테이블을 보내기 위한 아름다운 형식의 이메일을 보내기 위한 Java Mail API의 더 복잡한 예를 살펴보겠습니다. 기사 번역: 예제를 통해 Java 프로그램에서 이메일을 보내는 방법
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION