Javax邮件消息无效

时间:2011-12-10 15:21:55

标签: google-app-engine gwt gmail jmail

我开发了一个GWT电子邮件应用程序。当我运行它,它工作正常,并没有抛出任何错误,但邮件在我点击发送按钮后没有传递给收件人。我认为一定有些事我做错了。请,任何帮助将不胜感激。 提前致谢。以下是我的服务器和客户端代码的快照:

    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;

    }

}

客户代码:

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

控制台:

 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

我被点击了

1 个答案:

答案 0 :(得分:1)

当我遇到无声电子邮件失败问题时,原因是我为发件人使用的地址不是为我的应用程序注册的管理员。您只能从您应用的管理员或arbitrary@yourappid.appspotmail.com发送电子邮件,或者,如果用户使用其Google帐户登录了其Google帐户地址,则只能发送电子邮件。

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