2011-12-07 36 views
0

嗯,我把我的Gmail地址和我的通行证放在2个EditTexts中,当我点击确定按钮时,我尝试用我的Gmail邮件api发送邮件。但如果我把错误的数据,它不认证,因此我不会发送电子邮件。如果我再次启动应用程序并使用真实数据,则无法再次进行身份验证。我做错了什么或者是用java mail api完成的事情吗?下面是我用什么方法发送电子邮件:第二次身份验证失败Java邮件API

public GmailSender(String user, String password) { 
    this.user = user; 
    this.password = password; 

    Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    props.setProperty("mail.host", mailhost); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.port", "465"); 
    props.put("mail.smtp.port", "587"); 
    props.put("mail.smtp.socketFactory.port", "465"); 
    props.put("mail.smtp.socketFactory.port", "587"); 
    props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
    props.setProperty("mail.smtp.quitwait", "false"); 

    session = Session.getDefaultInstance(props, this); 

} 

protected PasswordAuthentication getPasswordAuthentication() { 

    return new PasswordAuthentication(user, password); 
} 
public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { 

    MimeMessage message = new MimeMessage(session); 
    DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 
    message.setSender(new InternetAddress(sender)); 
    message.setSubject(subject); 
    message.setDataHandler(handler); 
    if (recipients.indexOf(',') > 0) 
     message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); 
    else 
     message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); 
    Transport.send(message); 
} 

public class ByteArrayDataSource implements DataSource { 
    private byte[] data; 
    private String type; 

    public ByteArrayDataSource(byte[] data, String type) { 
     super(); 
     this.data = data; 
     this.type = type; 
                  } 

    public ByteArrayDataSource(byte[] data) { 
     super(); 
     this.data = data; 
              } 

    public void setType(String type) { 
     this.type = type; 
             } 

    public String getContentType() { 
     if (type == null) 
      return "application/octet-stream"; 
     else 
      return type; 
            } 

    public InputStream getInputStream() throws IOException { 
     return new ByteArrayInputStream(data); 
                  } 

    public String getName() { 
     return "ByteArrayDataSource"; 
          } 

    public OutputStream getOutputStream() throws IOException { 
     throw new IOException("Not Supported"); 
                   } 

} 

} 这里是我从logcat中得到

12-07 09:58:50.781: E/Validate(595): println needs a message 
12-07 09:58:50.781: E/Validate(595): java.lang.NullPointerException: println needs a  message 
12-07 09:58:50.781: E/Validate(595): at android.util.Log.println_native(Native Method) 
12-07 09:58:50.781: E/Validate(595): at android.util.Log.i(Log.java:143) 
12-07 09:58:50.781: E/Validate(595): at  stathis.example.teliko.Data.onClick(Data.java:107) 
12-07 09:58:50.781: E/Validate(595): at  android.view.View.performClick(View.java:2408) 
12-07 09:58:50.781: E/Validate(595): at android.view.View$PerformClick.run(View.java:8816) 
12-07 09:58:50.781: E/Validate(595): at android.os.Handler.handleCallback(Handler.java:587) 
12-07 09:58:50.781: E/Validate(595): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-07 09:58:50.781: E/Validate(595): at android.os.Looper.loop(Looper.java:123) 
12-07 09:58:50.781: E/Validate(595): at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-07 09:58:50.781: E/Validate(595): at java.lang.reflect.Method.invokeNative(Native Method) 
12-07 09:58:50.781: E/Validate(595): at java.lang.reflect.Method.invoke(Method.java:521) 
12-07 09:58:50.781: E/Validate(595): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-07 09:58:50.781: E/Validate(595): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-07 09:58:50.781: E/Validate(595): at dalvik.system.NativeStart.main(Native Method) 
+0

来自服务器的回应。 – hovanessyan

+0

当然,但我该如何做到? – dothedos

+0

你在logcat中有一些输出吗? – hovanessyan

回答

1

我不知道这是不是你的问题,但下面的代码是错误的:

Properties props = new Properties(); 
... 
props.put("mail.smtp.port", "465"); 
props.put("mail.smtp.port", "587"); 
props.put("mail.smtp.socketFactory.port", "465"); 
props.put("mail.smtp.socketFactory.port", "587"); 

Properties对象是一种Map,它从一个String映射到Object。如果您使用同一个密钥连续拨打put方法两次,则第二个呼叫中的值将替换您在第一个呼叫中添加的值

所以上面的等价于:

Properties props = new Properties(); 
... 
props.put("mail.smtp.port", "587"); 
props.put("mail.smtp.socketFactory.port", "587"); 

你的 “465” 项目将被忽略。

+0

那么你是对的,但如果我使用465端口只有它出现了相同的错误! – dothedos