2013-02-24 1 views
0

Apache NNTP API을 기반으로 메시지를 나에게 보내지 않고 인터체인지를 통과하지 않고 직접 보내려고합니다. 관련된 특정 클래스가 NNTP message을 소요하고 있으므로 정기적 인 MIME 타입의 메시지로 해석을 시도합니다 :헤더를 구문 분석하여 MIME 메시지를 만들 수 없습니다.

package net.bounceme.dur.nntp; 

import java.util.Arrays; 
import java.util.Enumeration; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.Properties; 
import javax.mail.Address; 
import javax.mail.Header; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.NoSuchProviderException; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class MessageSender { 

    private final static Logger LOG = Logger.getLogger(MessageSender.class.getName()); 
    private String header; 
    private String body; 
    private Properties p; 
    private Session session; 
    private MimeMessage message; 

    private MessageSender() { 
    } 

    public MessageSender(Properties p, String... s) throws Exception { 
     header = s[0]; 
     body = s[1]; 
     this.p = p; 
     populate(); 
    } 

    private void populate() throws Exception { 
     String lines[] = header.split("\\n"); 
     session = Session.getDefaultInstance(p, null); 
     message = new MimeMessage(session); 
     LOG.fine("\n\n\n\nnew message************\n\n\n\n"); 

     for (String s : lines) { 
      if (!s.contains("comp.lang.java.help")) { 
       message.addHeaderLine(s); 
      } 
     } 
     message.setContent(message, body); 
     String recipient = p.getProperty("recipient"); 
     message.setRecipients(Message.RecipientType.TO, 
       InternetAddress.parse(recipient)); 
     try { 
      send(); 
     } catch (javax.mail.internet.ParseException e) { 
      LOG.warning(e.toString()); 
     } catch (com.sun.mail.smtp.SMTPAddressFailedException e) { 
      LOG.warning(e.toString()); 
      List<Address> addresses = Arrays.asList(message.getAllRecipients()); 
      for (Address a : addresses) { 
       LOG.info(a.toString()); 
      } 
     } 
    } 

    private void send() throws Exception { 
     String protocol = p.getProperty("protocol"); 
     String host = p.getProperty("host"); 
     int port = Integer.valueOf(p.getProperty("port")); 
     String username = p.getProperty("username"); 
     String password = p.getProperty("password"); 
     Transport transport = session.getTransport(protocol); 
     LOG.log(Level.FINE, "{0}{1}{2}{3}{4}", new Object[]{protocol, host, port, username, password}); 
     Enumeration enumOfHeaders = message.getAllHeaders(); 
     while (enumOfHeaders.hasMoreElements()) { 
      Header h = (Header) enumOfHeaders.nextElement(); 
      LOG.log(Level.FINE, "\n\n\nHEADER\n{0}\n{1}", new Object[]{h.getName(), h.getValue()}); 
     } 
     transport.connect(host, port, username, password); 
     transport.sendMessage(message, message.getAllRecipients()); 
    } 
} 

을하지만 헤더에 문제가 있어요 : 이제

init: 
Deleting: /home/thufir/NetBeansProjects/apache_nntp/build/built-jar.properties 
deps-jar: 
Updating property file: /home/thufir/NetBeansProjects/apache_nntp/build/built-jar.properties 
Compiling 1 source file to /home/thufir/NetBeansProjects/apache_nntp/build/classes 
compile: 
run: 
200 Leafnode NNTP Daemon, version 1.11.8 running at localhost (my fqdn: dur.bounceme.net) 
GROUP comp.lang.java.help 
211 35 3 37 comp.lang.java.help group selected 
HEAD 3 
221 3 <[email protected]> article retrieved - head follows 
BODY 3 
222 3 <[email protected]> article retrieved - body follows 
Feb 24, 2013 3:05:04 AM net.bounceme.dur.nntp.MessageSender populate 
WARNING: javax.mail.internet.ParseException: Expected '/', got wrote 
HEAD 4 
221 4 <[email protected]> article retrieved - head follows 
BODY 4 
222 4 <[email protected]> article retrieved - body follows 
Exception in thread "main" javax.mail.SendFailedException: Invalid Addresses; 
    nested exception is: 
    com.sun.mail.smtp.SMTPAddressFailedException: 450 4.1.8 <[email protected]>: Sender address rejected: Domain not found 

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1863) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1119) 
    at net.bounceme.dur.nntp.MessageSender.send(MessageSender.java:80) 
    at net.bounceme.dur.nntp.MessageSender.populate(MessageSender.java:54) 
    at net.bounceme.dur.nntp.MessageSender.<init>(MessageSender.java:35) 
    at net.bounceme.dur.nntp.ArticleReader.<init>(ArticleReader.java:28) 
    at net.bounceme.dur.nntp.Driver.<init>(Driver.java:13) 
    at net.bounceme.dur.nntp.Driver.main(Driver.java:17) 
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 450 4.1.8 <[email protected]>: Sender address rejected: Domain not found 

    at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1730) 
    ... 7 more 
Java Result: 1 
BUILD SUCCESSFUL (total time: 6 seconds) 

을, 그 감사 보낸 사람의 도메인이 없습니다. 그럼에도 불구하고 나는 메시지를 보내고 싶다. 발신자를 변경해야합니까? 머리글을 가능한 한 작게하고 싶습니다.

NNTP -> MIME 메시지로 변환하는 더 좋은 방법이 있다면 나는 분명히 제안을 할 수 있습니다. 나는 그것이 이해가 안되는 이유로 문제가되는 것처럼 이미 뉴스 그룹 헤더를 삭제하고있다. 기본적으로이 헤더를 구문 분석하여 보내는 유효한 메시지를 생성하는 방법을 파악할 수 없습니다.

답변

1

예, 발신자 정보를 수정해야합니다. 문제는 (아주) 당신의 코드가 아닙니다. MTA가 전자 메일을 거부합니다. Sendmail은 종종 유효하지 않은 "보낸 사람"주소를 허용하지 않도록 구성됩니다. 이 경우 "nospam.nospam"에 대한 DNS 조회가 실패했다는 메시지가 표시됩니다.

봉투에는 유즈넷 기사 포스터의 주소를 사용하는 대신 [email protected]와 같은 발신자가 반영되어야합니다.

전자 메일 게이트웨이에 여러 개의 유즈넷 뉴스가 있습니다. 당신은 자신의 롤링 대신에 그들 중 하나를 사용하여 볼 수 있습니다.

+0

모든 단일 NNTP 헤더를 기반으로 거부하는 것처럼 보입니다. 그 중 일부 또는 거의 MIME을 직접 번역하지 않는 것 같습니다. – Thufir

관련 문제