import javax.swing.*;
import javax.mail.*;
import javax.mail.internet.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.awt.Dimension;
import javax.swing.border.*;

public class Composer extends JFrame implements ActionListener
{
    JButton sendButton = new JButton("Send");
    JLabel fromLabel = new JLabel("From:");
    JLabel toLabel = new JLabel("To:");
    JLabel ccLabel = new JLabel("Cc:");
    JLabel bccLabel = new JLabel("Bcc:");
    JLabel replyToLabel = new JLabel("Reply-To:");
    JLabel subjectLabel = new JLabel("Subject:");
    JTextField fromField = new JTextField(30);
    JTextField toField = new JTextField(30);
    JTextField ccField = new JTextField(30);
    JTextField bccField = new JTextField(30);
    JTextField replyToField = new JTextField(30);
    JTextField subjectField = new JTextField(30);
	JScrollPane bodyScrollPane = new JScrollPane();
    JScrollPane attachmentScrollPane = new JScrollPane();
    JList attachmentList = new JList();
    JTextArea bodyArea = new JTextArea();
    String _smtpHost;

    public Composer(String smtpHost)
    {
	    super("Client Composer");
		_smtpHost = smtpHost;
	    jbInit();
	    show();
    }

    private void jbInit()
    {
        getContentPane().setLayout(null);
		setSize(new Dimension(500, 376));

		sendButton.setBounds(new Rectangle(5, 5, 66, 23));
		fromLabel.setBounds(new Rectangle(5, 28, 52, 23));
		toLabel.setBounds(new Rectangle(5, 51, 52, 23));
		ccLabel.setBounds(new Rectangle(5, 74, 56, 23));
		bccLabel.setBounds(new Rectangle(5, 97, 55, 23));
		replyToLabel.setBounds(new Rectangle(5, 120, 55, 23));
		subjectLabel.setBounds(new Rectangle(5, 143, 55, 23));
		fromField.setBounds(new Rectangle(63, 28, 290, 23));
		toField.setBounds(new Rectangle(63, 51, 290, 23));
		ccField.setBounds(new Rectangle(63, 74, 290, 23));
		bccField.setBounds(new Rectangle(63, 97, 290, 23));
		replyToField.setBounds(new Rectangle(63, 120, 290, 23));
		subjectField.setBounds(new Rectangle(63, 143, 431, 23));
		bodyScrollPane.setBounds(new Rectangle(5, 169, 490, 199));
        attachmentScrollPane.setBorder(new TitledBorder(BorderFactory.createEmptyBorder(),"Attachments"));
        attachmentScrollPane.setBounds(new Rectangle(351, 9, 147, 136));

        getContentPane().add(sendButton);
		getContentPane().add(fromLabel);
		getContentPane().add(toLabel);
		getContentPane().add(ccLabel);
		getContentPane().add(bccLabel);
		getContentPane().add(replyToLabel);
		getContentPane().add(subjectLabel);
		getContentPane().add(toField);
		getContentPane().add(ccField);
		getContentPane().add(subjectField);
        getContentPane().add(bodyScrollPane);
        getContentPane().add(attachmentScrollPane);
        getContentPane().add(fromField);
        getContentPane().add(replyToField);
        getContentPane().add(bccField);
        attachmentScrollPane.getViewport().add(attachmentList);
        bodyScrollPane.getViewport().add(bodyArea);

		sendButton.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e)
    {
		try {
			Object obj = e.getSource();
			if(obj == sendButton) {
				Date _sentDate = new Date();
				String _from = fromField.getText(),
				_subject = subjectField.getText();

				StringTokenizer toks = new StringTokenizer(replyToField.getText(),",");
				InternetAddress[] _replyTo = new InternetAddress[toks.countTokens()];
				for(int i=0;i<_replyTo.length;i++)
				_replyTo[i]=new InternetAddress(toks.nextToken());

				toks = new StringTokenizer(toField.getText(),",");
				InternetAddress[] _to = new InternetAddress[toks.countTokens()];
				for(int i=0;i<_to.length;i++)
				_to[i]=new InternetAddress(toks.nextToken());

				toks = new StringTokenizer(ccField.getText(),",");
				InternetAddress[] _cc = new InternetAddress[toks.countTokens()];
				for(int i=0;i<_cc.length;i++)
				_cc[i]=new InternetAddress(toks.nextToken());

				toks = new StringTokenizer(bccField.getText(),",");
				InternetAddress[] _bcc = new InternetAddress[toks.countTokens()];
				for(int i=0;i<_bcc.length;i++)
				_bcc[i]=new InternetAddress(toks.nextToken());

				Properties props = new Properties();
				props.put("mail.smtp.host", _smtpHost);
				Session session = Session.getDefaultInstance(props, null);

				MimeMessage newMessage = new MimeMessage(session);

				newMessage.setFrom(new InternetAddress(_from));
				newMessage.setReplyTo(_replyTo);
				newMessage.setRecipients(Message.RecipientType.BCC, _bcc);
				newMessage.setRecipients(Message.RecipientType.CC, _cc);
				newMessage.setRecipients(Message.RecipientType.TO, _to);
				newMessage.setSubject(_subject);
				newMessage.setSentDate(_sentDate);

				// Set message contents
				//
				ListModel attModel = attachmentList.getModel();
				System.out.println("no. of attachments: "+attModel.getSize());
				if(attModel.getSize()==0) {
					newMessage.setText(bodyArea.getText());
					System.out.println("no attachments");
				}
				else {
					MimeMultipart parts = new MimeMultipart();

					MimeBodyPart body = new MimeBodyPart();
					body.setContent(bodyArea.getText(),"text/plain");
					body.setDisposition(Part.INLINE);
					parts.addBodyPart(body);

					for(int i=0;i<attModel.getSize();i++) {
						body = new MimeBodyPart();
						body.setContent(bodyArea.getText(),"text/plain");
						body.setDisposition(Part.ATTACHMENT);
						parts.addBodyPart(body);
					}

					newMessage.setContent(parts);
				}

				// Send newMessage
				//
				Transport.send(newMessage);
			}
		} catch (Exception ee) {}
    }

    public static void main(String[] args)
    {
	    Composer comp = new Composer(args[0]);
    }
}
