Mega Code Archive

 
Categories / Java / Network Protocol
 

TestOpenMailRelay -- send self-returning SPAM to check for relay sites

/*  * Copyright (c) Ian F. Darwin, http://www.darwinsys.com/, 1996-2002.  * All rights reserved. Software written by Ian F. Darwin and others.  * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  *  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  * POSSIBILITY OF SUCH DAMAGE.  *   * Java, the Duke mascot, and all variants of Sun's Java "steaming coffee  * cup" logo are trademarks of Sun Microsystems. Sun's, and James Gosling's,  * pioneering role in inventing and promulgating (and standardizing) the Java   * language and environment is gratefully acknowledged.  *   * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for  * inventing predecessor languages C and C++ is also gratefully acknowledged.  */ import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; 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; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; /** TestOpenMailRelay -- send self-returning SPAM to check for relay sites.  * @author Ian F. Darwin  * @version $Id: TestOpenMailRelay.java,v 1.13 2004/03/20 20:52:35 ian Exp $  */ class TestOpenMailRelay {   /** Where to refer people that find the test messages on their system. */   public final static String RSS_SITE = "http://mail-abuse.org/rss/";   /** Where the test messages will be collected. */   public final static String MY_TARGET = "spam-magnet@darwinsys.com";   /** Driver to parse options and control Sender */   public static void main(String[] args) throws IOException {     if (args.length == 0) {       new TestOpenMailRelayGUI().setVisible(true);     } else {       for (int i=0; i<args.length; i++) {         process(args[i]);       }     }   }   /** Try the given mail server, writing output to System.out */   public static void process(String suspect_relay) {     process(suspect_relay, System.out);   }   /** Try the given mail server, writing output to the given PrintStream */   public static void process(String suspect_relay, PrintStream pw) {     pw.println("processs: trying: " + suspect_relay);     try {       // Redirect all output from mail API to the given stream.       System.setOut(pw);       System.setErr(pw);       Sender2 sm = new Sender2(suspect_relay);       sm.addRecipient("nobody@erewhon.moc");       sm.setFrom(MY_TARGET);       sm.setSubject("Testing for open mail relay, see " + RSS_SITE);       sm.setBody("This mail is an attempt to confirm that site " +         suspect_relay + "\n" + "is in fact an open mail relay site.\n"               + "For more information on the problem of open mail relays,\n"               + "please visit site "               + RSS_SITE               + "\n"               + "Please join the fight against spam by closing all open mail relays!\n"               + "If this open relay has been closed, please accept our thanks.\n");       sm.sendFile("");     } catch (MessagingException e) {       pw.println(e);     } catch (Exception e) {       pw.println(e);     }   } } /** GUI for TestOpenMailRelay, lets you run it multiple times in one JVM  * to avoid startup delay.  *  * Starts each in its own Thread for faster return to ready state.  *  * Uses PipedI/OStreams to capture system.out/err into a window.  */ public class TestOpenMailRelayGUI extends JFrame {   public static void main(String unused[]) throws IOException {     new TestOpenMailRelayGUI().setVisible(true);   }   /** The one-line textfield for the user to type Host name/IP */   protected JTextField hostTextField;   /** The push button to start a test; a field so can disable/enable it. */   protected JButton goButton;   /** Multi-line text area for results. */   protected JTextArea results;   /** The piped stream for the main class to write into "results" */   protected PrintStream ps;   /** The piped stream to read from "ps" into "results" */   protected BufferedReader iis;   /** This inner class is the action handler both for pressing    * the "Try" button and also for pressing <ENTER> in the text    * field. It gets the IP name/address from the text field    * and passes it to process() in the main class. Run in the    * GUI Dispatch thread to avoid messing the GUI. -- tmurtagh.    */   ActionListener runner = new ActionListener() {     public void actionPerformed(ActionEvent evt) {       goButton.setEnabled(false);       SwingUtilities.invokeLater(new Thread() {         public void run() {           String host = hostTextField.getText().trim();           ps.println("Trying " + host);           TestOpenMailRelay.process(host, ps);           goButton.setEnabled(true);         }       });     }   };   /** Construct a GUI and some I/O plumbing to get the output    * of "TestOpenMailRelay" into the "results" textfield.    */   public TestOpenMailRelayGUI() throws IOException {     super("Tests for Open Mail Relays");     PipedInputStream is;     PipedOutputStream os;     JPanel p;     Container cp = getContentPane();     cp.add(BorderLayout.NORTH, p = new JPanel());     // The entry label and text field.     p.add(new JLabel("Host:"));     p.add(hostTextField = new JTextField(10));     hostTextField.addActionListener(runner);     p.add(goButton = new JButton("Try"));     goButton.addActionListener(runner);     JButton cb;     p.add(cb = new JButton("Clear Log"));     cb.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent evt) {         results.setText("");       }     });     JButton sb;     p.add(sb = new JButton("Save Log"));     sb.setEnabled(false);     results = new JTextArea(20, 60);     // Add the text area to the main part of the window (CENTER).     // Wrap it in a JScrollPane to make it scroll automatically.     cp.add(BorderLayout.CENTER, new JScrollPane(results));     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     pack(); // end of GUI portion     // Create a pair of Piped Streams.     is = new PipedInputStream();     os = new PipedOutputStream(is);     iis = new BufferedReader(new InputStreamReader(is, "ISO8859_1"));     ps = new PrintStream(os);     // Construct and start a Thread to copy data from "is" to "os".     new Thread() {       public void run() {         try {           String line;           while ((line = iis.readLine()) != null) {             results.append(line);             results.append("\n");           }         } catch (IOException ex) {           JOptionPane.showMessageDialog(null,               "*** Input or Output error ***\n" + ex, "Error",               JOptionPane.ERROR_MESSAGE);         }       }     }.start();   } } class Sender {   /** The message recipient. */   protected String message_recip = "spam-magnet@darwinsys.com";   /* What's it all about, Alfie? */   protected String message_subject = "Re: your mail";   /** The message CC recipient. */   protected String message_cc = "nobody@erewhon.com";   /** The message body */   protected String message_body = "I am unable to attend to your message, as I am busy sunning"       + "myself on the beach in Maui, where it is warm and peaceful."       + "Perhaps when I return I'll get around to reading your mail."       + "Or perhaps not.";   /** The JavaMail session object */   protected Session session;   /** The JavaMail message object */   protected Message mesg;   /** Do the work: send the mail to the SMTP server.  */   public void doSend() {     // We need to pass info to the mail server as a Properties, since     // JavaMail (wisely) allows room for LOTS of properties...     Properties props = new Properties();     // Your LAN must define the local SMTP server as "mailhost"     // for this simple-minded version to be able to send mail...     props.put("mail.smtp.host", "mailhost");     // Create the Session object     session = Session.getDefaultInstance(props, null);     session.setDebug(true); // Verbose!     try {       // create a message       mesg = new MimeMessage(session);       // From Address - this should come from a Properties...       mesg.setFrom(new InternetAddress("nobody@host.domain"));       // TO Address        InternetAddress toAddress = new InternetAddress(message_recip);       mesg.addRecipient(Message.RecipientType.TO, toAddress);       // CC Address       InternetAddress ccAddress = new InternetAddress(message_cc);       mesg.addRecipient(Message.RecipientType.CC, ccAddress);       // The Subject       mesg.setSubject(message_subject);       // Now the message body.       mesg.setText(message_body);       // XXX I18N: use setText(msgText.getText(), charset)       // Finally, send the message!       Transport.send(mesg);     } catch (MessagingException ex) {       while ((ex = (MessagingException) ex.getNextException()) != null) {         ex.printStackTrace();       }     }   }   /** Simple test case driver */   public static void main(String[] av) {     Sender sm = new Sender();     sm.doSend();   } } class Sender2 {   /** The message recipient. */   protected String message_recip;   /* What's it all about, Alfie? */   protected String message_subject;   /** The message CC recipient. */   protected String message_cc;   /** The message body */   protected String message_body;   /** The JavaMail session object */   protected Session session;   /** The JavaMail message object */   protected Message mesg;   /** Properties object used to pass props into the MAIL API */   Properties props = new Properties();   /** Construct a Sender2 object */   public Sender2() throws MessagingException {     // Your LAN must define the local SMTP as "mailhost"     // for this simple-minded version to be able to send mail...     props.put("mail.smtp.host", "mailhost");     finish();   }   /** Construct a Sender2 object.    * @param hostName - the name of the host to send to/via.    */   public Sender2(String hostName) throws MessagingException {     props.put("mail.smtp.host", hostName);     finish();   }   private void finish() {     // Create the Session object     session = Session.getDefaultInstance(props, null);     // session.setDebug(true);    // Verbose!     // create a message     mesg = new MimeMessage(session);   }   public void sendFile(String fileName) throws MessagingException {     // Now the message body.     setBody(message_body);     sendFile();   }   /** Send the file with no filename, assuming you've already called    * the setBody() method.    */   public void sendFile() {     try {       // Finally, send the message! (use static Transport method)       Transport.send(mesg);     } catch (MessagingException ex) {       while ((ex = (MessagingException) ex.getNextException()) != null) {         ex.printStackTrace();       }     }   }   /** Stub for providing help on usage You can write a longer help than this,    * certainly.    */   protected static void usage(int returnValue) {     System.err         .println("Usage: Sender2 [-t to][-c cc][-f from][-s subj] file ...");     System.exit(returnValue);   }   public void addRecipient(String message_recip) throws MessagingException {     // TO Address     InternetAddress toAddress = new InternetAddress(message_recip);     mesg.addRecipient(Message.RecipientType.TO, toAddress);   }   public void addCCRecipient(String message_cc) throws MessagingException {     // CC Address     InternetAddress ccAddress = new InternetAddress(message_cc);     mesg.addRecipient(Message.RecipientType.CC, ccAddress);   }   public void setFrom(String sender) throws MessagingException {     // From Address - this should come from a Properties...     mesg.setFrom(new InternetAddress(sender));   }   public void setSubject(String message_subject) throws MessagingException {     // The Subject     mesg.setSubject(message_subject);   }   /** Set the message body. */   public void setBody(String message_body) throws MessagingException {     mesg.setText(message_body);     // XXX I18N: use setText(msgText.getText(), charset)   }   /** Driver to parse options and control Sender */   public static void main(String[] args) {     try {       Sender2 sm = new Sender2();       // XXX sm.setMailHost();       sm.props.put("mail.smtp.host", "");       sm.addRecipient("www@www.net");       sm.addCCRecipient("");       sm.setFrom("");       sm.setSubject("");       sm.sendFile("");     } catch (MessagingException e) {       System.err.println(e);     }   } }