Mega Code Archive

 
Categories / Java / Network Protocol
 

This program shows how to use sockets to send plain text mail messages

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