2009-12-22 5 views
3

자바 메일로 간단한 html 메시지를 보내야합니다. 그리고 인터넷에서 설명과 함께 좋은 예제를 찾으려고 할 때마다 다음 예제는 더 화가 났고 화를 냈습니다.JavaMail을 사용하기위한 환경 구성 방법은 무엇입니까?

모든 바보 같은 예제에는 코멘트와 훌륭한 면책 조항 만 다른 복사 및 붙여 넣기 Java 코드가 포함되어 있습니다. 먼저 smtp 및 pop3 서버를 구성해야합니다.

나는 구체적인 제품에 대한 광고를 만들고 싶지 않지만 서버 구성은 가장 어려운 부분이라고 생각합니다. 그래서, 구체적인 서버 (Kerio, 예를 들어, 또는 다른 하나) 구성에 관한 유용한 정보 (Java 코드없이)를 누군가에게 줄 수 있습니까?

250 2.0.0 Reset state 
javax.mail.SendFailedException: Invalid Addresses; 
    nested exception is: 
    com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Relaying to <[email protected]> denied (authentication required) 

UPD : 내가 지금 무엇을 가지고

다음 예외입니다. 모든 이전 텍스트의 간단한 재구성은 다음과 같습니다. Windows, jdk 등이 없다고 상상해보십시오. 그리고 당신은 자바 프로그램을 만들고 당신의 컴퓨터에서 실행하기를 원합니다. 그리고이 프로그램은 "Hello world!"를 보내야합니다. 귀하의 Gmail 계정에. 단계를 나열하십시오.

UPD2. 여기 코드는 다음과 같습니다

Properties props = new Properties(); 
props.setProperty ("mail.transport.protocol", "smtp"); 
props.setProperty ("mail.host", "smtp.gmail.com"); 
props.setProperty ("mail.user", "[email protected]"); 
props.setProperty ("mail.password", "password_from_email_above"); 

Session mailSession = Session.getDefaultInstance (props, null); 
mailSession.setDebug (true); 
Transport transport = mailSession.getTransport(); 

MimeMessage message = new MimeMessage (mailSession); 
message.setSubject ("HTML mail with images"); 
message.setFrom (new InternetAddress ("[email protected]")); 
message.setContent ("<h1>Hello world</h1>", "text/html"); 
message.addRecipient (Message.RecipientType.TO, 
     new InternetAddress ("[email protected]")); 

transport.connect(); 
transport.sendMessage (message, 
     message.getRecipients (Message.RecipientType.TO)); 

그리고 예외입니다 : 당신이 SMTP 서버를 구성 할 수있는 튜토리얼을 찾고 있다면

RSET 
250 2.1.5 Flushed 3sm23455365fge.10 
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. 3sm23455365fge.10 
    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1829) 
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1368) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:886) 
    at com.teamdev.imgmail.MailSender.main(MailSender.java:33) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    ... 
+0

귀하의 질문은 너무 막연한는 의미로 대답하는 것입니다. 호스트 및 호스트에서 실행되는 구성 요소에 대해 자세히 알려주십시오. 브랜드 이름을 짓고, 우리는 상관하지 않습니다. 당신이하고 싶은 일, 일하는 것과하지 않는 것에 대해 말해주십시오. –

+0

@Carl Smotricz : UPD 섹션을 추가했습니다. – Roman

+0

업데이트가 많은 * 더 좋은 질문입니다. 이를 위해 Google은 사용자를 위해 아주 큰 서버를 운영하기 때문에 자신의 SMTP 서버가 필요하지 않은 것으로 나타났습니다. –

답변

13

, 당신은 JavaMail에 찾고되어서는 안된다. 선택한 서버 (예 : Kerio ... 또는 Exim, SendMail, Apache James, Postfix)에서 자습서를 찾거나 Serverfault에 문의하십시오. 모든 SMTP 호환 서버는 JavaMail과 잘 호환됩니다.

또는 "표준"메일 제공 업체의 인프라를 사용할 수도 있습니다. 예를 들어 Google의 SMTP 인프라와 함께 Google Apps 계정을 사용하여 Java 응용 프로그램에서 메일을 전송합니다. Using a Gmail account은 JavaMail을 간단하게 테스트하기 위해 자체 SMTP 서버를 설정하지 않으려는 경우 좋은 출발점입니다.

마지막 옵션으로 도메인에 대해 MX Records을 조회하고받는 사람의 SMTP 서버로 메일을 직접 배달 할 수도 있습니다. 해결하기 힘든 몇 가지 공통점이 있습니다.

마지막으로 메일이 스팸으로 필터링되지 않도록하는 방법을 알아야합니다. 이는 거대한 주제입니다. 여기서는 자체 서버를 호스팅 할 때 발생할 수있는 몇 가지 문제를 처리 할 표준 공급자를 사용하는 데 도움이됩니다.

Btw : 게시 한 오류 메시지 : SMTP 서버가 메시지 중계를 거부했습니다. 이것은 SMTP 서버가 example.com에서 실행 중이고 [email protected][email protected]로 보내고 SMTP 서버가 릴레이로 작동하도록 요청하는 경우입니다. 이것은 스패머들이 학대를 당할 때까지 수년 전의 일반적인 관행이었습니다. 당시 포스트 마스터는 중계를 거부하는 것이 좋습니다. 메일을 보내기 전에 인증하거나 서버에서만 호스팅되는 계정으로 보내십시오 (예 : [email protected]과 같은 example.com).

편집 : 여기

private Session createSmtpSession() { 
    final Properties props = new Properties(); 
    props.setProperty("mail.smtp.host", "smtp.gmail.com"); 
    props.setProperty("mail.smtp.auth", "true"); 
    props.setProperty("mail.smtp.port", "" + 587); 
    props.setProperty("mail.smtp.starttls.enable", "true"); 
    // props.setProperty("mail.debug", "true"); 

    return Session.getDefaultInstance(props, new javax.mail.Authenticator() { 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication("[email protected]", "mypassword"); 
    } 
    }); 
} 
+0

감사합니다. 그것의 작품 –

1

내가 문제의 일부를 볼 수 있습니다 (Gmail 계정으로 작동하지만뿐만 아니라 자신의 서버에 대해 수행해야합니다) 당신이 authenticationg로 시작하는 일부 코드입니다. 오류 메시지에서 적절하게 설명됩니다.

메일을 보낼 SMTP 서버 (예 : JavaMail 구성에서 구성한 주소 중 하나)가 [email protected]으로 메일을 전달하지 않습니다. SMTP 서버에 구성 문제가있는 것 같습니다. sfussenegger가 지적했듯이, javamail과 아무 관련이 없습니다.

동시에 모든 문제를 디버깅하지 않으므로 알려진 SMTP 클라이언트에서 SMTP 서버 주소를 지정하는 것이 좋습니다. 예를 들어, Thunderbird가 정상적으로 작동합니다. Thunderbird에서 메일을 보낼 수 있다면 JavaMail에서 문제가 거의 없어야합니다.


업데이트 :

구글의 SMTP 서버의 정확한 주소는 다음과 같습니다 smtp.gmail.com. 이 서버가 JavaMail에서 구성한 서버입니까? 일치하는 오류 메시지를 표시 할 수 있습니까?

0

이 작동합니다 : 당신은 javax.mail 종속성을 클래스 패스에은 JavaMail mail.jar을 둘 필요가

import java.text.MessageFormat; 
import java.util.List; 
import java.util.Properties; 

import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class Emailer { 

    public static void main(String[] args) { 

     String hostname = args[0]; 
     final String userName = args[1]; 
     final String passWord = args[2]; 
     String toEmail = args[3]; 
     String fromEmail = args[4]; 
     String subject = args[5]; 
     String body = ""; 
     // add rest of args as one body text for convenience 
     for (int i = 6; i < args.length; i++) { 
      body += args[i] + " "; 
     } 

     Properties props = System.getProperties(); 
     props.put("mail.smtp.host", hostname); 

     Session session = Session.getInstance(props, new Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(userName, passWord); 
      } 
     }); 

     MimeMessage message = new MimeMessage(session); 
     try { 
      message.setFrom(new InternetAddress(fromEmail)); 
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); 
      message.setSubject(subject); 
      message.setText(body); 
      Transport.send(message); 

     } catch (MessagingException e) { 
      System.out.println("Cannot send email " + e); 
     } 
    } 
} 

. Google에서 원하는대로 이메일을 보낼 수 있는지 확실하지 않습니다. ISP와 같은 다른 이메일 제공 업체를 이용해보십시오.

+0

Google은 정확한 반송 주소 (또는 내가 Google에 등록한 주소 중 하나)를 지정하는 한 원하는 곳 (API 포함)의 메일을 보낼 수있게합니다. –

2

동작하는 예제 상기 답변 조합 활성화-1.1.jar메일 1.4.1.jar 및 SMTP를 사용하여 호스트에서 Gmail이다.

  1. return new PasswordAuthentication("[email protected]", "user_pw");

  2. 는 또한, 당신은 이메일을 수신 할 이메일 주소로 [email protected]를 대체 할 줄 [email protected]user_pw를 교체합니다.

    package com.test.sendEmail; 
    import java.util.Properties; 
    import javax.mail.*; 
    import javax.mail.internet.*; 
    
    public class sendEmailTest { 
    
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
        // TODO Auto-generated method stub 
        sendEmailTest emailer = new sendEmailTest(); 
        //the domains of these email addresses should be valid, 
        //or the example will fail: 
        emailer.sendEmail(); 
    } 
    
    /** 
        * Send a single email. 
        */ 
    public void sendEmail(){ 
    Session mailSession = createSmtpSession(); 
    mailSession.setDebug (true); 
    
    try { 
        Transport transport = mailSession.getTransport(); 
    
        MimeMessage message = new MimeMessage (mailSession); 
    
        message.setSubject ("HTML mail with images"); 
        message.setFrom (new InternetAddress ("[email protected]")); 
        message.setContent ("<h1>Hello world</h1>", "text/html"); 
        message.addRecipient (Message.RecipientType.TO, new InternetAddress ("[email protected]")); 
    
        transport.connect(); 
        transport.sendMessage (message, message.getRecipients (Message.RecipientType.TO)); 
    } 
    catch (MessagingException e) { 
        System.err.println("Cannot Send email"); 
        e.printStackTrace(); 
    } 
    } 
    
    private Session createSmtpSession() { 
    final Properties props = new Properties(); 
    props.setProperty ("mail.host", "smtp.gmail.com"); 
    props.setProperty("mail.smtp.auth", "true"); 
    props.setProperty("mail.smtp.port", "" + 587); 
    props.setProperty("mail.smtp.starttls.enable", "true"); 
    props.setProperty ("mail.transport.protocol", "smtp"); 
    // props.setProperty("mail.debug", "true"); 
    
    return Session.getDefaultInstance(props, new javax.mail.Authenticator() { 
        protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("[email protected]", "user_pw"); 
        } 
    }); 
    } 
    
    } 
    
관련 문제