0

Apache NNTP APIに基づいて、インターチューブに出入りするのではなく、自分自身にのみメッセージを送信しようとしています。関連する特定のクラスは、NNTP メッセージを受け取り、それを通常の 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 <7e60dce5-09d7-4cee-bbc1-137207f03dd0@googlegroups.com> article retrieved - head follows
BODY 3
222 3 <7e60dce5-09d7-4cee-bbc1-137207f03dd0@googlegroups.com> 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 <kfpdt3$5g9$1@dont-email.me> article retrieved - head follows
BODY 4
222 4 <kfpdt3$5g9$1@dont-email.me> 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 <markspace@nospam.nospam>: 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 <markspace@nospam.nospam>: 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 メッセージを変換するより良い方法があれば、私は確かに提案を受け入れます。理解できない理由で問題があると思われるため、ニュースグループのヘッダーは既に削除しています。基本的に、これらのヘッダーを解析して、送信する有効なメッセージを作成する方法がわかりません。

4

1 に答える 1

1

はい、送信者情報を修正する必要があります。問題は(まったく)あなたのコードではありません。MTA が電子メールを拒否しています。Sendmail は、多くの場合、無効に見える「送信元」アドレスを許可しないように構成されています。この場合、「nospam.nospam」の DNS ルックアップが失敗したことを示しています。

エンベロープは、usenet 記事の投稿者のアドレスを使用しようとするのではなく、news2mail@myhost.org のような送信者を反映する必要があります。

利用可能な電子メール ゲートウェイへの複数の usenet ニュースがあります。自分でロールするのではなく、それらのいずれかを使用することを検討したい場合があります。

于 2013-03-06T09:24:34.160 に答える