2014-08-28 54 views
0

我試圖發送電子郵件而不使用電子郵件客戶端。所以我嘗試了一些教程中給出的代碼。但總是,當我嘗試發送我的電子郵件時,發送失敗,transport.connect()方法上的NullPointerExceptionJavaMail API獲取NullpointerException

我的代碼

package com.example.app; 


import java.io.UnsupportedEncodingException; 
import java.util.List; 
import java.util.Properties; 

import javax.mail.AuthenticationFailedException; 
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 android.util.Log; 

public class GMail { 

    final String emailPort = "587";// gmail's smtp port 
    final String smtpAuth = "true"; 
    final String starttls = "true"; 
    final String emailHost = "smtp.gmail.com"; 
    // final String fromUser = "****"; 
    // final String fromUserEmailPassword = "****"; 

    String fromEmail; 
    String fromPassword; 
    List<String> toEmailList; 
    String emailSubject; 
    String emailBody; 

    Properties emailProperties; 
    Session mailSession; 
    MimeMessage emailMessage; 

    public GMail() { 

    } 

    public GMail(String fromEmail, String fromPassword, 
      List<String> toEmailList, String emailSubject, String emailBody) { 
     this.fromEmail = fromEmail; 
     this.fromPassword = fromPassword; 
     this.toEmailList = toEmailList; 
     this.emailSubject = emailSubject; 
     this.emailBody = emailBody; 

     emailProperties = System.getProperties(); 
     emailProperties.put("mail.smtp.port", emailPort); 
     emailProperties.put("mail.smtp.auth", smtpAuth); 
     emailProperties.put("mail.smtp.starttls.enable", starttls); 
     Log.i("GMail", "Mail server properties set."); 
    } 

    public MimeMessage createEmailMessage() throws AddressException, 
      MessagingException, UnsupportedEncodingException { 

     mailSession = Session.getInstance(emailProperties, null); 
     emailMessage = new MimeMessage(mailSession); 

     emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail)); 
     for (String toEmail : toEmailList) { 
      Log.i("GMail","toEmail: "+toEmail); 
      emailMessage.addRecipient(Message.RecipientType.TO, 
        new InternetAddress(toEmail)); 
     } 

     emailMessage.setSubject(emailSubject); 
     emailMessage.setContent(emailBody, "text/html");// for a html email 
//  emailMessage.setText(emailBody);// for a text email 
     Log.i("GMail", "Email Message created."); 
     return emailMessage; 
    } 

    public void sendEmail() throws AddressException, MessagingException, AuthenticationFailedException { 
     try{ 
      Transport transport = mailSession.getTransport("smtp"); 
      Log.i("GMail", "Transport created"); 
      transport.connect(emailHost, fromEmail, fromPassword); 
      Log.i("GMail","allrecipients: "+emailMessage.getAllRecipients()); 
      transport.sendMessage(emailMessage, emailMessage.getAllRecipients()); 
      transport.close(); 
      Log.i("GMail", "Email sent successfully."); 
     } 
     catch(Exception e){ 
      Log.i("GMail", "Exception " + e.getMessage()); 
     } 
    } 

} 

使用AsyncTask發送郵件:

package com.example.app; 


import java.util.List; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.util.Log; 

public class SendMailTask extends AsyncTask { 

    private ProgressDialog statusDialog; 
    private Activity sendMailActivity; 

    public SendMailTask(Activity activity) { 
     sendMailActivity = activity; 

    } 

    protected void onPreExecute() { 
     statusDialog = new ProgressDialog(sendMailActivity); 
     statusDialog.setMessage("Getting ready..."); 
     statusDialog.setIndeterminate(false); 
     statusDialog.setCancelable(false); 
     statusDialog.show(); 
    } 

    @Override 
    protected Object doInBackground(Object... args) { 
     try { 
      Log.i("SendMailTask", "About to instantiate GMail..."); 
      publishProgress("Processing input...."); 
      GMail androidEmail = new GMail(args[0].toString(), 
        args[1].toString(), (List) args[2], args[3].toString(), 
        args[4].toString()); 
      publishProgress("Preparing mail message...."); 
      androidEmail.createEmailMessage(); 
      publishProgress("Sending email...."); 
      androidEmail.sendEmail(); 
      publishProgress("Email Sent."); 
      Log.i("SendMailTask", "Mail Sent."); 
     } catch (Exception e) { 
      publishProgress(e.getMessage()); 
      Log.e("SendMailTask", e.getMessage(), e); 
     } 
     return null; 
    } 

    @Override 
    public void onProgressUpdate(Object... values) { 
     statusDialog.setMessage(values[0].toString()); 

    } 

    @Override 
    public void onPostExecute(Object result) { 
     statusDialog.dismiss(); 
    } 

} 

,並在這個活動我打電話sendMail()

package com.example.app; 

import java.util.Arrays; 
import java.util.List; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.RadioGroup; 

public class Attendance extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.attendance); 
    } 

    public void clickButSubmit(View view){ 
     String to="****@freenet.de"; 
     String from="****"; 
     String pwd="****"; 
     String subject="test"; 
     String message="bla blub"; 
     List<String> toEmailList=Arrays.asList(to.split("\\s*,\\s*")); 
     Log.i("Attendance", "toEmailList" + toEmailList); 

     new SendMailTask(Attendance.this).execute(from,pwd,toEmailList,subject,message); 
    } 

    public void clickButClear(View view){ 
     RadioGroup rg = (RadioGroup) findViewById(R.id.button_group_attendance); 
     rg.clearCheck(); 
     rg=(RadioGroup) findViewById(R.id.button_group_stint); 
     rg.clearCheck(); 
     rg=(RadioGroup) findViewById(R.id.button_group_weekend); 
     rg.clearCheck();   
    } 
} 

它不使用用戶名工作* *也不* @ googlemail.com。

由於transport.connect()方法拋出異常,因此必須存在身份驗證問題。

這裏是日誌:

08-28 09:42:59.456: I/GMail(4304): Email Message created. 
08-28 09:42:59.846: I/GMail(4304): Transport created 
08-28 09:43:02.846: I/GMail(4304): Exception null 
08-28 09:43:02.846: I/SendMailTask(4304): Mail Sent. 

忽略「已發送郵件」日誌,因爲我只捕捉到了異常,沒有任何干預。

編輯: e.printStackTrace()在異常處理程序提供了:

08-28 10:06:04.317: I/GMail(5439): Exception null 
08-28 10:06:04.317: W/System.err(5439): javax.mail.AuthenticationFailedException 
08-28 10:06:04.317: W/System.err(5439):  at javax.mail.Service.connect(Service.java:319) 
08-28 10:06:04.317: W/System.err(5439):  at com.example.app.GMail.sendEmail(GMail.java:82) 
08-28 10:06:04.367: W/System.err(5439):  at com.example.app.SendMailTask.doInBackground(SendMailTask.java:40) 
08-28 10:06:04.427: W/System.err(5439):  at android.os.AsyncTask$2.call(AsyncTask.java:288) 
08-28 10:06:04.437: W/System.err(5439):  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
08-28 10:06:04.447: W/System.err(5439):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
08-28 10:06:04.447: W/System.err(5439):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
08-28 10:06:04.447: W/System.err(5439):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
08-28 10:06:04.497: W/System.err(5439):  at java.lang.Thread.run(Thread.java:841) 

正因爲如此,我在transport.connect()-method

編輯2提示問題:與mailSession.setDebug(真) :

08-28 11:19:34.664: I/GMail(9492): Email Message created. 
08-28 11:19:34.674: I/System.out(9492): DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc.,1.4.1] 
08-28 11:19:34.684: I/GMail(9492): Transport created 
08-28 11:19:34.684: I/GMail(9492): host smtp.gmail.com 
08-28 11:19:34.684: I/GMail(9492): user name xxxx 
08-28 11:19:34.734: I/GMail(9492): pwd xxxx 
08-28 11:19:34.744: I/System.out(9492): DEBUG SMTP: useEhlo true, useAuth true 
08-28 11:19:34.744: I/System.out(9492): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false 
08-28 11:19:35.824: I/System.out(9492): 220 mx.google.com ESMTP wr10sm10759961wjc.10 - gsmtp 
08-28 11:19:35.894: I/System.out(9492): DEBUG SMTP: connected to host "smtp.gmail.com", port: 587 
08-28 11:19:35.964: I/System.out(9492): EHLO localhost 
08-28 11:19:36.014: I/System.out(9492): 250-mx.google.com at your service, [158.181.68.197] 
08-28 11:19:36.024: I/System.out(9492): 250-SIZE 35882577 
08-28 11:19:36.034: I/System.out(9492): 250-8BITMIME 
08-28 11:19:36.034: I/System.out(9492): 250-STARTTLS 
08-28 11:19:36.034: I/System.out(9492): 250-ENHANCEDSTATUSCODES 
08-28 11:19:36.034: I/System.out(9492): 250-PIPELINING 
08-28 11:19:36.034: I/System.out(9492): 250-CHUNKING 
08-28 11:19:36.084: I/System.out(9492): 250 SMTPUTF8 
08-28 11:19:36.094: I/System.out(9492): DEBUG SMTP: Found extension "SIZE", arg "35882577" 
08-28 11:19:36.094: I/System.out(9492): DEBUG SMTP: Found extension "8BITMIME", arg "" 
08-28 11:19:36.104: I/System.out(9492): DEBUG SMTP: Found extension "STARTTLS", arg "" 
08-28 11:19:36.154: I/System.out(9492): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 
08-28 11:19:36.164: I/System.out(9492): DEBUG SMTP: Found extension "PIPELINING", arg "" 
08-28 11:19:36.164: I/System.out(9492): DEBUG SMTP: Found extension "CHUNKING", arg "" 
08-28 11:19:36.164: I/System.out(9492): DEBUG SMTP: Found extension "SMTPUTF8", arg "" 
08-28 11:19:36.214: I/System.out(9492): STARTTLS 
08-28 11:19:36.284: I/System.out(9492): 220 2.0.0 Ready to start TLS 
08-28 11:19:38.214: I/System.out(9492): EHLO localhost 
08-28 11:19:38.264: I/System.out(9492): 250-mx.google.com at your service, [158.181.68.197] 
08-28 11:19:38.274: I/System.out(9492): 250-SIZE 35882577 
08-28 11:19:38.274: I/System.out(9492): 250-8BITMIME 
08-28 11:19:38.274: I/System.out(9492): 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN 
08-28 11:19:38.274: I/System.out(9492): 250-ENHANCEDSTATUSCODES 
08-28 11:19:38.274: I/System.out(9492): 250-PIPELINING 
08-28 11:19:38.274: I/System.out(9492): 250-CHUNKING 
08-28 11:19:38.334: I/System.out(9492): 250 SMTPUTF8 
08-28 11:19:38.344: I/System.out(9492): DEBUG SMTP: Found extension "SIZE", arg "35882577" 
08-28 11:19:38.344: I/System.out(9492): DEBUG SMTP: Found extension "8BITMIME", arg "" 
08-28 11:19:38.394: I/System.out(9492): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN" 
08-28 11:19:38.424: I/System.out(9492): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" 
08-28 11:19:38.444: I/System.out(9492): DEBUG SMTP: Found extension "PIPELINING", arg "" 
08-28 11:19:38.444: I/System.out(9492): DEBUG SMTP: Found extension "CHUNKING", arg "" 
08-28 11:19:38.444: I/System.out(9492): DEBUG SMTP: Found extension "SMTPUTF8", arg "" 
08-28 11:19:38.444: I/System.out(9492): DEBUG SMTP: Attempt to authenticate 
08-28 11:19:38.504: I/System.out(9492): AUTH LOGIN 
08-28 11:19:38.614: I/System.out(9492): 334 VXNlcm5hbWU6 
08-28 11:19:38.614: I/System.out(9492): ZWIxNG1zQGdvb2dsZW1haWwuY29t 
08-28 11:19:38.674: I/System.out(9492): 334 UGFzc3dvcmQ6 
08-28 11:19:38.704: I/System.out(9492): RkZ3UzIwMDM= 
08-28 11:19:39.044: I/System.out(9492): 534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbsSi 
08-28 11:19:39.084: I/System.out(9492): 534-5.7.14 WAPBKxXrfqaVMKdB7zRhISihBZWTJlb98chHX5cnpuqhm_KUO2czQYBBRTt4KObt7ntZSJ 
08-28 11:19:39.084: I/System.out(9492): 534-5.7.14 QIqeHh6gs0Q2XQDVlZGCxCrGEsYoz5-1Qv7Tc98LT7lP6dO8gCnAbkydaRLbsmTfI8Xl-s 
08-28 11:19:39.084: I/System.out(9492): 534-5.7.14 zG47TvmrvdIMiSF0R91lNdduhygKxOW-VCJcH8KADwJJkJeWxOQXK-uBA-YF2ZUnEMLWvV 
08-28 11:19:39.134: I/System.out(9492): 534-5.7.14 LQKdhEA> Please log in via your web browser and then try again. 
08-28 11:19:39.144: I/System.out(9492): 534-5.7.14 Learn more at 
08-28 11:19:39.164: I/System.out(9492): 534 5.7.14 https://support.google.com/mail/bin/answer.py?answer=78754 wr10sm10759961wjc.10 - gsmtp 
08-28 11:19:39.314: I/GMail(9492): Exception null 
+0

使用'e.printStackTrace();' – Simas 2014-08-28 14:01:49

+0

或者這可能是一個問題,因爲我在模擬器中運行此代碼?權限INTERNET被使用。 – 2014-08-28 14:13:19

+0

也許在連接之前嘗試打印'fromEmail','fromPassword',看看它們是否正確。 – Simas 2014-08-28 14:19:02

回答

0

看來,Gmail可以選擇阻止腳本的訪問,您可以啓用,通過:

Gmail's Recent Activity。它應該在下的不尋常活動

編輯:

那麼你正在使用TLS(port 587, isSSL false)。

嘗試通過SSL連接,那麼:

Properties emailProperties = new Properties(); 
emailProperties.put("mail.smtp.host", "smtp.gmail.com"); 
emailProperties.put("mail.smtp.auth", "true"); 
emailProperties.put("mail.smtp.port", "465"); 
emailProperties.put("mail.smtp.socketFactory.port", "465"); 
emailProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

希望這可以解決您的問題。

+0

你是wrigth。當我在gooogle-accout中啓用「不安全連接」時,它可以正常工作。但我該怎麼做,我不需要這個? 這是SSL加密的問題嗎?其實我不使用一些身份驗證管理器... – 2014-08-28 23:31:53

+0

@paul_schaefer我已經更新了我的答案,試試看。 – Simas 2014-08-29 06:29:12

+0

感謝您的回覆,但它不起作用。同樣的例外... – 2014-08-29 10:43:11