I have developed a GWT email application. When I run it, it works fine and doesnt throw any error, but the mail doesn't get delivered to the recipient after i've clicked send button. I think there must be something i'm doing wrong. Please, any help would be much appreciated. Thanks in advance. Here is a snapshot of my server and client codes:

    package com.ukstudentfeedback.server;

import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.ukstudentfeedback.client.MailClient;
import com.ukstudentfeedback.shared.FieldVerifier;

@SuppressWarnings("serial")
public class MailServerImpl extends RemoteServiceServlet implements MailClient{

    public String sendMessage(String to, String from, String subject, String message) throws IllegalArgumentException
    {
        // Verify that no input is null. 
                if (!FieldVerifier.isValidName(to, from, subject, message)) {
                    // If the input is not valid, throw an IllegalArgumentException back to
                    // the client.
                    throw new IllegalArgumentException(
                            "Name must be at least 4 characters long");
                }



        try 
        {
            Properties props = new Properties();
            props.put("smtp.gmail.com", "mail.google.com");
            props.put("smtp.gmail.username","my email");
            props.put("smtp.gmail.password","my password");
            Session session = Session.getDefaultInstance(props, null);
            Message msg = new MimeMessage(session);
            InternetAddress me = new InternetAddress(from, 
                       "Me");
            InternetAddress you = new InternetAddress(to);
            msg.setFrom(me);
              msg.setRecipient(Message.RecipientType.TO, you);
            msg.setSubject(subject);
            msg.setContent(message, 
                       "text/plain");
            Transport.send(msg);          

        }

        catch (AddressException e) 
        {
            // ...
            e.printStackTrace();
        } catch (MessagingException e) 
        {
            // ...
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return to;

    }

}

Client code:

    package com.ukstudentfeedback.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.ukstudentfeedback.shared.FieldVerifier;
import com.ukstudentfeedback.client.MailClient;
import com.ukstudentfeedback.client.MailClientAsync;

public class Ukstudentfeedback implements EntryPoint{

    private static final String SERVER_ERROR = "An error occurred while "
            + "attempting to contact the server. Please check your network "
            + "connection and try again.";

    /**
     * Create a remote service proxy to talk to the server-side Greeting service.
     */
    private final MailClientAsync sendMessage = GWT
            .create(MailClient.class);

    // ...
    public void onModuleLoad()
    {
        java.lang.System.out.println("I finally worked!");
        final Button sendButton;
        final TextBox toField, fromField, subjectField, messageField;
        final Label errorLabel = new Label();

        sendButton = new Button("Send");
        toField = new TextBox();
        fromField = new TextBox();
        subjectField = new TextBox();
        messageField = new TextBox();

        sendButton.addStyleName("sendButton");
        toField.addStyleName("input");
        fromField.addStyleName("input");
        subjectField.addStyleName("input");
        messageField.addStyleName("textarea");

        //toField.setText("Testing123");
     // Add the nameField and sendButton to the RootPanel
     // Use RootPanel.get() to get the entire body element
        RootPanel.get("sendButton").add(sendButton);
        RootPanel.get("To").add(toField);
        RootPanel.get("From").add(fromField);
        RootPanel.get("Subject").add(subjectField);
        RootPanel.get("Message").add(messageField);
        RootPanel.get("errorLabelContainer").add(errorLabel);

        // Focus the cursor on the to field when the app loads
                toField.setFocus(true);
                toField.selectAll();

                //sendButton.setEnabled(true);

                // Create the popup dialog box
                final DialogBox dialogBox = new DialogBox();
                dialogBox.setText("Message Sent");
                dialogBox.setAnimationEnabled(true);
                final Button closeButton = new Button("Close");
                // We can set the id of a widget by accessing its Element
                closeButton.getElement().setId("closeButton");
                final Label textToServerLabel = new Label();
                final HTML serverResponseLabel = new HTML();
                VerticalPanel dialogVPanel = new VerticalPanel();
                dialogVPanel.addStyleName("dialogVPanel");
                dialogVPanel.add(new HTML("<b>Message Sent:</b>"));
                dialogVPanel.add(textToServerLabel);
                dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));
                dialogVPanel.add(serverResponseLabel);
                dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
                dialogVPanel.add(closeButton);
                dialogBox.setWidget(dialogVPanel);

                // Add a handler to close the DialogBox
                closeButton.addClickHandler(new ClickHandler() {
                    public void onClick(ClickEvent event) {
                        dialogBox.hide();
                        sendButton.setEnabled(true);
                        sendButton.setFocus(true);
                    }
                });

    // Create a handler for the sendButton and nameField
    class MyHandler implements ClickHandler, KeyUpHandler{
                /**
                 * Fired when the user clicks on the sendButton.
                 */
                public void onClick(ClickEvent event) {
                    java.lang.System.out.println("I have been clicked");
                    sendMessageToServer();
                }

                /**
                 * Fired when the user types in the nameField.
                 */
                public void onKeyUp(KeyUpEvent event) {
                    if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
                        sendMessageToServer();
                    }
                }


                public void sendMessageToServer()
                {
                    errorLabel.setText("");
                    String to = toField.getText();
                    String from = fromField.getText();
                    String subject = subjectField.getText();
                    String message = messageField.getText();

                    if (!FieldVerifier.isValidName(to, from, subject, message)) {
                        errorLabel.setText("Please enter at least four characters");
                        return;
                    }


                    sendButton.setEnabled(false);
                    textToServerLabel.setText("Hello");
                    serverResponseLabel.setText("");
                    sendMessage.sendMessage(to, from, subject, message, new AsyncCallback<String>() {
                        public void onFailure(Throwable caught) {
                            // Show the RPC error message to the user
                            dialogBox
                                    .setText("Message sending Failed");
                            serverResponseLabel
                                    .addStyleName("serverResponseLabelError");
                            serverResponseLabel.setHTML(SERVER_ERROR);
                            dialogBox.center();
                            closeButton.setFocus(true);

                        }

                        public void onSuccess(String result) {
                            dialogBox.setText("Message Sent");
                            serverResponseLabel
                                    .removeStyleName("serverResponseLabelError");
                            serverResponseLabel.setHTML(result);
                            dialogBox.center();
                            closeButton.setFocus(true);

                        }
                    });
                }

    }
    // Add a handler to send the name to the server
            MyHandler handler = new MyHandler();
            sendButton.addClickHandler(handler);
            toField.addKeyUpHandler(handler);
            fromField.addKeyUpHandler(handler);
            subjectField.addKeyUpHandler(handler);
            messageField.addKeyUpHandler(handler);
    }
}

Console:

 2011-12-10 16:23:49.985 java[1379:407] [Java CocoaComponent compatibility mode]: Enabled
 2011-12-10 16:23:49.986 java[1379:407] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
 Initializing App Engine server
 Dec 10, 2011 4:23:52 PM com.google.apphosting.utils.jetty.JettyLogger info
 INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
 Dec 10, 2011 4:23:52 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
 INFO: Successfully processed /Users/umajosiah/Programming/Java/eclipse/workspace/ukstudentfeedback/war/WEB-INF/appengine-web.xml
 Dec 10, 2011 4:23:52 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
 INFO: Successfully processed    /Users/umajosiah/Programming/Java/eclipse/workspace/ukstudentfeedback/war/WEB-INF/web.xml
 Dec 10, 2011 4:23:53 PM com.google.appengine.tools.development.DevAppServerImpl start
 INFO: The server is running at http://localhost:8888/
 Dec 10, 2011 4:23:58 PM com.google.appengine.tools.development.LocalResourceFileServlet doGet
 WARNING: No file found for: /images/stripe.png
 Dec 10, 2011 4:24:03 PM com.google.appengine.tools.development.LocalResourceFileServlet doGet
 WARNING: No file found for: /favicon.ico

I have been clicked

有帮助吗?

解决方案

When I had silent email failure problems, it was because the address I was using for the sender was not an admin registered for my application. You can only send email from admins of your app, or from arbitrary@yourappid.appspotmail.com, or, if the user is logged in with their google account, their google account address.

http://code.google.com/appengine/docs/java/mail/usingjavamail.html#Senders_and_Recipients

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top