This page contains the code
for all the other classes in the EmailClient lab:
EmailClient.java and EmailMessage.java.
/*************************************
* Filename: EmailClient.java
*************************************/
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
public class EmailClient extends Frame {
/* The stuff for the GUI. */
private Button btSend = new Button("Send");
private Button btClear = new Button("Clear");
private Button btQuit = new Button("Quit");
private Label serverLabel = new Label("Local SMTP server:");
private TextField serverField = new TextField("35.246.110.174", 40);
private Label serverPortLabel = new Label("Port number of SMTP server:");
private TextField serverPortField = new TextField("1025", 30);
private Label fromLabel = new Label("From:");
private TextField fromField = new TextField("", 40);
private Label toLabel = new Label("To:");
private TextField toField = new TextField("", 40);
private Label subjectLabel = new Label("Subject:");
private TextField subjectField = new TextField("", 40);
private Label messageLabel = new Label("Message:");
private TextArea messageText = new TextArea(30, 80);
private Label urlLabel = new Label("HTTP://");
private TextField urlField = new TextField("comp211.gairing.com/test.txt", 40);
private Button btGet = new Button("Get");
/**
* Create a new EmailClient window with fields for entering all
* the relevant information (From, To, Subject, and message).
*/
public EmailClient() {
super("Java Emailclient");
/* Create panels for holding the fields. To make it look nice,
create an extra panel for holding all the child panels. */
Panel serverPanel = new Panel(new BorderLayout());
Panel serverPortPanel = new Panel(new BorderLayout());
Panel fromPanel = new Panel(new BorderLayout());
Panel toPanel = new Panel(new BorderLayout());
Panel subjectPanel = new Panel(new BorderLayout());
Panel messagePanel = new Panel(new BorderLayout());
serverPanel.add(serverLabel, BorderLayout.WEST);
serverPanel.add(serverField, BorderLayout.CENTER);
serverPortPanel.add(serverPortLabel, BorderLayout.WEST);
serverPortPanel.add(serverPortField, BorderLayout.CENTER);
fromPanel.add(fromLabel, BorderLayout.WEST);
fromPanel.add(fromField, BorderLayout.CENTER);
toPanel.add(toLabel, BorderLayout.WEST);
toPanel.add(toField, BorderLayout.CENTER);
subjectPanel.add(subjectLabel, BorderLayout.WEST);
subjectPanel.add(subjectField, BorderLayout.CENTER);
messagePanel.add(messageLabel, BorderLayout.NORTH);
messagePanel.add(messageText, BorderLayout.CENTER);
Panel fieldPanel = new Panel(new GridLayout(0, 1));
fieldPanel.add(serverPanel);
fieldPanel.add(serverPortPanel);
fieldPanel.add(fromPanel);
fieldPanel.add(toPanel);
fieldPanel.add(subjectPanel);
/* Create a panel for the URL field and add listener to the GET
button. */
Panel urlPanel = new Panel(new BorderLayout());
urlPanel.add(urlLabel, BorderLayout.WEST);
urlPanel.add(urlField, BorderLayout.CENTER);
urlPanel.add(btGet, BorderLayout.EAST);
fieldPanel.add(urlPanel);
btGet.addActionListener(new GetListener());
/* Create a panel for the buttons and add listeners to the
buttons. */
Panel buttonPanel = new Panel(new GridLayout(1, 0));
btSend.addActionListener(new SendListener());
btClear.addActionListener(new ClearListener());
btQuit.addActionListener(new QuitListener());
buttonPanel.add(btSend);
buttonPanel.add(btClear);
buttonPanel.add(btQuit);
/* Add, pack, and show. */
add(fieldPanel, BorderLayout.NORTH);
add(messagePanel, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
pack();
setVisible(true);
}
static public void main(String argv[]) {
new EmailClient();
}
/* Handler for the Send-button. */
class SendListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
System.out.println("Sending mail");
/* Check that we have the local mailserver */
if ((serverField.getText()).equals("")) {
System.out.println("Need name of SMTP server!");
return;
}
/* Check that we have a port number */
if ((serverPortField.getText()).equals("")) {
System.out.println("Need Port number of SMTP server!");
return;
}
/* Check that we have the sender and recipient. */
if((fromField.getText()).equals("")) {
System.out.println("Need sender!");
return;
}
if((toField.getText()).equals("")) {
System.out.println("Need recipient!");
return;
}
/* Create the message */
EmailMessage mailMessage;
try {
mailMessage = new EmailMessage(fromField.getText(),
toField.getText(),
subjectField.getText(),
messageText.getText(),
serverField.getText(),
Integer.parseInt(serverPortField.getText()));
} catch (UnknownHostException e) {
/* If there is an error, do not go further */
return;
}
/* Check that the message is valid, i.e., sender and
recipient addresses look ok. */
if(!mailMessage.isValid()) {
return;
}
try {
SMTPInteraction connection = new SMTPInteraction(mailMessage);
connection.send(mailMessage);
connection.close();
} catch (IOException error) {
System.out.println("Sending failed: " + error);
return;
}
System.out.println("Email sent succesfully!");
}
}
/* Get URL if specified. */
class GetListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String receivedText;
/* Check if URL field is empty. */
if((urlField.getText()).equals("")) {
System.out.println("Need URL!");
return;
}
/* Pass string from URL field to HTTPGet (trimmed);
returned string is either requested object
or some error message. */
/*********************************************
* Uncomment this for part 2
*********************************************
HTTPInteraction request = new HTTPInteraction(urlField.getText().trim());
// Send http request. Returned String holds object
try {
receivedText=request.send();
}
catch (IOException error) {
messageText.setText("Downloading File failed.\r\nIOException: " + error);
return;
}
// Change message text
messageText.setText(receivedText);
*******************************************/
}
}
/* Clear the fields on the GUI. */
class ClearListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Clearing fields");
fromField.setText("");
toField.setText("");
subjectField.setText("");
messageText.setText("");
}
}
/* Quit. */
class QuitListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
}
/*************************************
* Filename: EmailMessage.java
*************************************/
import java.util.*;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.*;
public class EmailMessage {
/* SMTP-sender of the message (in this case, contents of From-header. */
public String Sender;
/* SMTP-recipient, or contents of To-header. */
public String Recipient;
/* Target MX-host */
public String DestHost;
private InetAddress DestAddr;
public int DestHostPort;
/* The headers and the body of the message. */
public String Headers;
public String Body;
/* To make it look nicer */
private static final String CRLF = "\r\n";
/*
* Create the message object by inserting the required headers from RFC 822
* (From, To, Date).
*/
public EmailMessage(String from, String to, String subject, String text,
String localServer, int localServerPort) throws UnknownHostException {
/* Remove whitespace */
Sender = from.trim();
Recipient = to.trim();
Headers = "From: " + Sender + CRLF;
Headers += "To: " + Recipient + CRLF;
Headers += "Subject: " + subject.trim() + CRLF;
/*
* A close approximation of the required format. Unfortunately only GMT.
*/
SimpleDateFormat format = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss 'GMT'");
String dateString = format.format(new Date());
Headers += "Date: " + dateString + CRLF;
/*
* Get message. We must escape the message to make sure that there are
* no single periods on a line. This would mess up sending the mail.
*/
Body = escapeMessage(text);
/*
* Take the name of the local mailserver and map it into an InetAddress
*/
DestHost = localServer;
try {
DestAddr = InetAddress.getByName(DestHost);
} catch (UnknownHostException e) {
System.out.println("Unknown host: " + DestHost);
System.out.println(e);
throw e;
}
DestHostPort = localServerPort;
}
/*
* Check whether the message is valid. In other words, check that both
* sender and recipient contain only one @-sign.
*/
public boolean isValid() {
int fromat = Sender.indexOf('@');
int toat = Recipient.indexOf('@');
if (fromat < 1 || (Sender.length() - fromat) <= 1) {
System.out.println("Sender address is invalid");
return false;
}
if (toat < 1 || (Recipient.length() - toat) <= 1) {
System.out.println("Recipient address is invalid");
return false;
}
if (fromat != Sender.lastIndexOf('@')) {
System.out.println("Sender address is invalid");
return false;
}
if (toat != Recipient.lastIndexOf('@')) {
System.out.println("Recipient address is invalid");
return false;
}
return true;
}
/* For printing the message. */
public String toString() {
String res;
res = "Sender: " + Sender + '\n';
res += "Recipient: " + Recipient + '\n';
res += "MX-host: " + DestHost + ", address: " + DestAddr + '\n';
res += "Message:" + '\n';
res += Headers + CRLF;
res += Body;
return res;
}
/*
* Escape the message by doubling all periods at the beginning of a line.
*/
private String escapeMessage(String body) {
String escapedBody = "";
String token;
StringTokenizer parser = new StringTokenizer(body, "\n", true);
while (parser.hasMoreTokens()) {
token = parser.nextToken();
if (token.startsWith(".")) {
token = "." + token;
}
escapedBody += token;
}
return escapedBody;
}
}