Java tutorial
/* * 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); } } }