2014-08-28 49 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