Sending Email: For Real

Problem

You need to send email, and the browser trick in Section 19.2 won’t cut it.

Solution

Provide a real email client.

Discussion

A real email client allows the user considerably more control. Of course, it also requires more work. In this recipe I’ll build a simple version of a mail sender, relying upon the JavaMail standard extension in package javax.mail and javax.mail.internet (the latter contains classes that are specific to Internet email protocols). This first example shows the steps of sending mail over SMTP, the standard Internet mail protocol. The steps are listed in the sidebar.

As is usual in Java, you must catch certain exceptions. This API requires that you catch the MessagingException , which indicates some failure of the transmission. Class Sender is shown in Example 19-3.

Example 19-3. Sender.java

import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*; 

/** sender -- send an email message.
 */
public class Sender {

    /** The message recipient. */
    protected String message_recip = "[email protected]";
    /* What's it all about, Alfie? */
    protected String message_subject = "Re: your mail";
    /** The message CC recipient. */
    protected String message_cc = "[email protected]";
    /** 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("[email protected]"));

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

Of course, a program that can only send one message to one address is not useful in the long run. The second version (not shown here, but in the source tree accompanying this book) allows the To, From, Mailhost, and Subject to come from the command line, and reads the mail text either from a file or from the standard input.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.191.254.44