2011-09-13 4 views
2

이 질문은 전에 물어 보았지만 2-3 년 전부터 상황이 바뀌 었다고 생각합니다. 어떤 코드 샘플도 현재 작동하지 않습니다.자바를 사용하여 Gmail 계정에 이메일 보내기

Properties props = new Properties(); 
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
props.setProperty("mail.transport.protocol", "smtp"); 
props.setProperty("mail.host", "smtp.gmail.com"); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.port", "465"); 
props.put("mail.debug", "true"); 
props.put("mail.smtp.socketFactory.port", "465"); 
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); 
props.put("mail.smtp.socketFactory.fallback", "false"); 
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication("uname","password"); 
    } 
}); 
session.setDebug(true); 
Transport transport = session.getTransport(); 
InternetAddress addressFrom = new InternetAddress("[email protected]"); 
MimeMessage message = new MimeMessage(session); 
message.setSender(addressFrom); 

for (int j = 0; j < 20; j++) { 
    message.setSubject("Testing javamail plain"+Math.random()); 
    message.setContent("This is a test", "text/plain"); 
    String sendTo [] = {"[email protected]"}; 
    if (sendTo != null) { 
     InternetAddress[] addressTo = new InternetAddress[sendTo.length]; 
     for (int i = 0; i < sendTo.length; i++) { 
      addressTo[i] = new InternetAddress(sendTo[i]); 
     } 
     message.setRecipients(Message.RecipientType.TO, addressTo); 
    } 
    transport.connect(); 
    Transport.send(message); 
    transport.close(); 
    System.out.println("DONE"); 
} 

를 그리고이 예외를 throw : 나는 자바 1.6에서 다음 코드를 시도하고 내가 웹 서비스에 대한 웹 서버와 CXF framefork 같은 바람둥이를 사용하고

org.apache.cxf.interceptor.Fault: javax.mail.NoSuchProviderException: Unable to locate provider for protocol: smtp 
org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:155) 
org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:121) 
org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:164) 
org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:91) 
org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
java.util.concurrent.FutureTask.run(FutureTask.java:138) 
org.apache.cxf.workqueue.SynchronousExecutor.execute(SynchronousExecutor.java:37) 
org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:106) 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) 
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:206) 
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:218) 
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:161) 
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:114) 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:184) 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:112) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:163) 

. 도움을 주시면 감사하겠습니다.

답변

6

난 당신이 java.mail 항아리 클래스 경로에 파일을 jar 파일을 지원 CXF가 있다고 가정합니다. 실제로 CXF는 Apache Geronimo Javamail/activation 구현을 사용하므로 애플리케이션 클래스 패스에 두 가지 버전의 Sun Javamail 라이브러리가 있습니다. 애플리케이션에서 전자 메일을 보내려고하면 Java 라이브러리의 버전에 대해 혼란스러워집니다. 사용하고 넘어진다. 그래서 해결책은 될 수 중은 JavaMail jar 파일을 제거하거나 치어 파일의 제로니모있는 javamail을 제외하려면 :

<exclusions>   
    <exclusion>    
     <groupId>org.apache.geronimo.specs</groupId> 
     <artifactId>geronimo-javamail_1.4_spec</artifactId>  
    </exclusion> 
    <exclusion> 
      <groupId>org.apache.geronimo.specs</groupId> 
      <artifactId>geronimo-activation_1.1_spec</artifactId> 
    </exclusion> 

희망이 당신을 도울.

+0

예, 문제가 해결되었습니다. 감사! – Aarkan

+0

+1 – infinity

+0

@infinity 답변을 pom.xml에 어디에 넣어야합니까? – Shahe

0

javax.mail 종속성을 충족해야합니다. 당신은 메이븐을 사용하는 경우, 당신의 pom.xml 파일에 다음을 추가합니다

<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>mail</artifactId> 
    <version>1.4.4</version> 
</dependency> 
+2

그러나 경우 OP는 JavaMail을 설치하지 않았고,'javax.mail.NoSuchProviderException'은 어디에서 왔을까요? –

3

이 당신을 도울 수 있습니다 는 pom.xml 파일에 다음을 추가 그리고

<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-rt-core</artifactId> 
    <version>${cxf.version}</version> 
    <exclusions>   
     <exclusion>    
      <groupId>org.apache.geronimo.specs</groupId> 
      <artifactId>geronimo-javamail_1.4_spec</artifactId>  
     </exclusion> 
     <exclusion> 
       <groupId>org.apache.geronimo.specs</groupId> 
       <artifactId>geronimo-activation_1.1_spec</artifactId> 
     </exclusion> 
</exclusions>     
</dependency>  
<dependency>  
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-rt-frontend-jaxws</artifactId>  
    <version>${cxf.version}</version> 
</dependency>    
<dependency> 
    <groupId>org.apache.cxf</groupId> 
    <artifactId>cxf-rt-databinding-jaxb</artifactId>  
    <version>${cxf.version}</version> 
    <exclusions>  
      <exclusion> 
       <groupId>org.apache.geronimo.specs</groupId> 
       <artifactId>geronimo-javamail_1.4_spec</artifactId>   
      </exclusion>  
      <exclusion>  
       <groupId>org.apache.geronimo.specs</groupId> 
       <artifactId>geronimo-activation_1.1_spec</artifactId>  
      </exclusion>  
    </exclusions>   
</dependency> 

메이븐

를 사용하는 경우, 대신 썬있는 javamail/활성화 구현 추가

<dependency>  
    <groupId>javax.mail</groupId> 
    <artifactId>mail</artifactId> 
    <version>1.4</version> 
</dependency>