Java tutorial
/* This program is a part of the companion code for Core Java 8th ed. (http://horstmann.com/corejava) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.util.Scanner; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingWorker; /** * This program shows how to use sockets to send plain text mail messages. * @author Cay Horstmann * @version 1.11 2007-06-25 */ public class MailTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JFrame frame = new MailTestFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } /** * The frame for the mail GUI. */ class MailTestFrame extends JFrame { public MailTestFrame() { setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); setTitle("MailTest"); setLayout(new GridBagLayout()); // we use the GBC convenience class of Core Java Volume 1 Chapter 9 add(new JLabel("From:"), new GBC(0, 0).setFill(GBC.HORIZONTAL)); from = new JTextField(20); add(from, new GBC(1, 0).setFill(GBC.HORIZONTAL).setWeight(100, 0)); add(new JLabel("To:"), new GBC(0, 1).setFill(GBC.HORIZONTAL)); to = new JTextField(20); add(to, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0)); add(new JLabel("SMTP server:"), new GBC(0, 2).setFill(GBC.HORIZONTAL)); smtpServer = new JTextField(20); add(smtpServer, new GBC(1, 2).setFill(GBC.HORIZONTAL).setWeight(100, 0)); message = new JTextArea(); add(new JScrollPane(message), new GBC(0, 3, 2, 1).setFill(GBC.BOTH).setWeight(100, 100)); comm = new JTextArea(); add(new JScrollPane(comm), new GBC(0, 4, 2, 1).setFill(GBC.BOTH).setWeight(100, 100)); JPanel buttonPanel = new JPanel(); add(buttonPanel, new GBC(0, 5, 2, 1)); JButton sendButton = new JButton("Send"); buttonPanel.add(sendButton); sendButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { new SwingWorker<Void, Void>() { protected Void doInBackground() throws Exception { comm.setText(""); sendMail(); return null; } }.execute(); } }); } /** * Sends the mail message that has been authored in the GUI. */ public void sendMail() { try { Socket s = new Socket(smtpServer.getText(), 25); InputStream inStream = s.getInputStream(); OutputStream outStream = s.getOutputStream(); in = new Scanner(inStream); out = new PrintWriter(outStream, true /* autoFlush */); String hostName = InetAddress.getLocalHost().getHostName(); receive(); send("HELO " + hostName); receive(); send("MAIL FROM: <" + from.getText() + ">"); receive(); send("RCPT TO: <" + to.getText() + ">"); receive(); send("DATA"); receive(); send(message.getText()); send("."); receive(); s.close(); } catch (IOException e) { comm.append("Error: " + e); } } /** * Sends a string to the socket and echoes it in the comm text area. * @param s the string to send. */ public void send(String s) throws IOException { comm.append(s); comm.append("\n"); out.print(s.replaceAll("\n", "\r\n")); out.print("\r\n"); out.flush(); } /** * Receives a string from the socket and displays it in the comm text area. */ public void receive() throws IOException { String line = in.nextLine(); comm.append(line); comm.append("\n"); } private Scanner in; private PrintWriter out; private JTextField from; private JTextField to; private JTextField smtpServer; private JTextArea message; private JTextArea comm; public static final int DEFAULT_WIDTH = 300; public static final int DEFAULT_HEIGHT = 300; } /* This program is a part of the companion code for Core Java 8th ed. (http://horstmann.com/corejava) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* GBC - A convenience class to tame the GridBagLayout Copyright (C) 2002 Cay S. Horstmann (http://horstmann.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** This class simplifies the use of the GridBagConstraints class. */ class GBC extends GridBagConstraints { /** Constructs a GBC with a given gridx and gridy position and all other grid bag constraint values set to the default. @param gridx the gridx position @param gridy the gridy position */ public GBC(int gridx, int gridy) { this.gridx = gridx; this.gridy = gridy; } /** Constructs a GBC with given gridx, gridy, gridwidth, gridheight and all other grid bag constraint values set to the default. @param gridx the gridx position @param gridy the gridy position @param gridwidth the cell span in x-direction @param gridheight the cell span in y-direction */ public GBC(int gridx, int gridy, int gridwidth, int gridheight) { this.gridx = gridx; this.gridy = gridy; this.gridwidth = gridwidth; this.gridheight = gridheight; } /** Sets the anchor. @param anchor the anchor value @return this object for further modification */ public GBC setAnchor(int anchor) { this.anchor = anchor; return this; } /** Sets the fill direction. @param fill the fill direction @return this object for further modification */ public GBC setFill(int fill) { this.fill = fill; return this; } /** Sets the cell weights. @param weightx the cell weight in x-direction @param weighty the cell weight in y-direction @return this object for further modification */ public GBC setWeight(double weightx, double weighty) { this.weightx = weightx; this.weighty = weighty; return this; } /** Sets the insets of this cell. @param distance the spacing to use in all directions @return this object for further modification */ public GBC setInsets(int distance) { this.insets = new Insets(distance, distance, distance, distance); return this; } /** Sets the insets of this cell. @param top the spacing to use on top @param left the spacing to use to the left @param bottom the spacing to use on the bottom @param right the spacing to use to the right @return this object for further modification */ public GBC setInsets(int top, int left, int bottom, int right) { this.insets = new Insets(top, left, bottom, right); return this; } /** Sets the internal padding @param ipadx the internal padding in x-direction @param ipady the internal padding in y-direction @return this object for further modification */ public GBC setIpad(int ipadx, int ipady) { this.ipadx = ipadx; this.ipady = ipady; return this; } }