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