2011-12-10 81 views
1

我開發了一個GWT電子郵件應用程序。當我運行它時,它可以正常工作,並且不會拋出任何錯誤,但是在點擊發送按鈕後郵件不會傳送給收件人。我認爲肯定會有一些事情我做錯了。請任何幫助,將不勝感激。 在此先感謝。這裏是我的服務器和客戶端代碼的快照:Javax郵件不起作用

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 

我已經被點擊

+0

服務器上是否有任何錯誤記錄? –

+0

有沒有錯誤:(我會把控制檯的打印 –

回答

1

當我沉默的電子郵件故障問題,這是因爲我用於發件人的地址不是爲我的應用程序註冊的管理員。您只能從您的應用的管理員發送電子郵件,或者從[email protected]發送電子郵件,或者,如果用戶使用其Google帳戶登錄其Google帳戶地址,則只能發送電子郵件。

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

+2

我已經發現了這個問題,我需要部署應用程序。它不會發送消息,如果你在本地機器上運行。所以愚蠢的我:( –