0

Google の Gmail API と OAuth 2.0 を使用して電子メールを送信しようとしています。有効なSMTPTransportのように見えるものをなんとか取得しましたが(有効かどうかは完全にはわかりません)、電子メールを送信しようとすると、sendMessageが発生する行でNullPointerExceptionが発生します。実際、例外はその行で正確には発生しません。奇妙なのは、Eclipse では、デバッガーの現在の行が sendMail メソッドの最初の行に戻り、NullPointerException で呼び出し元のクライアントに戻ることです。null 例外の原因がわかりません。smtpTransport および msg 変数は null ではありません:

  private Session session;

  public SMTPTransport connectToSmtp(String host, int port, String userEmail, String oauthToken, boolean debug) throws Exception
  {
    try
    {
      Properties props = new Properties();
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.starttls.required", "true");
      props.put("mail.smtp.sasl.enable", "false");
      session = Session.getInstance(props);
      session.setDebug(debug);

      final URLName unusedUrlName = null;
      SMTPTransport transport = new SMTPTransport(session, unusedUrlName);

      // If the password is non-null, SMTP tries to do AUTH LOGIN.
      final String emptyPassword = null;
      transport.connect(host, port, userEmail, emptyPassword);

      byte[] response = String.format("user=%s\1auth=Bearer %s\1\1", userEmail, oauthToken).getBytes();
      response = BASE64EncoderStream.encode(response);

      transport.issueCommand("AUTH XOAUTH2 " + new String(response), 235);

      return transport;
    }
    catch (Exception ex)
    {
      return null;
    }
  }

  public synchronized void sendMail(String subject, String body, String user, String oauthToken, String recipients)
  {
    try
    {
      SMTPTransport smtpTransport = connectToSmtp("smtp.gmail.com", 587, user, oauthToken, true);

      MimeMessage message = new MimeMessage(session);
      DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
      message.setSender(new InternetAddress(user));
      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));

      smtpTransport.sendMessage(message, message.getAllRecipients());
    }
    catch (Exception e)
    {
    }
  }

編集: sendMail のコードを更新しましたが、まだ同じ問題があります。logcat には例外がまったく表示されません。実際、サーバーへの接続は受け入れられます。ただし、コードを何度も実行すると、最終的に次のように logcat で例外が発生します。

メソッド myapp.sendMail から参照されているクラス 'javax.activation.DataHandler' が見つかりませんでした

DataHandler が見つからない理由がわかりません。コンパイル時に検出されず、実行時にのみ検出される jar ファイルが欠落している可能性がありますか?

02-28 14:33:14.619: I/ActivityManager(199): Starting: Intent { act=com.google.android.gms.common.account.CHOOSE_ACCOUNT cmp=com.google.android.gms/.common.account.AccountPickerActivity (has extras) } from pid 967
02-28 14:33:14.619: E/ActivityManager(199): exception bw.write()java.io.IOException: Transport endpoint is not connected
02-28 14:33:14.619: D/PowerManagerService(199): acquireWakeLock flags=0x1 tag=ActivityManager-Launch
02-28 14:33:14.899: E/ActivityRecord(199): sendActivityPerformanceInfo exception occurs: java.io.IOException: Transport endpoint is not connected
02-28 14:33:14.899: I/ActivityManager(199): Displayed com.google.android.gms/.common.account.AccountPickerActivity: +260ms
02-28 14:33:14.909: D/PowerManagerService(199): releaseWakeLock flags=0x1 tag=ActivityManager-Launch
02-28 14:33:16.879: E/ActivityManager(199): exception bw.write()java.io.IOException: Transport endpoint is not connected
02-28 14:33:16.879: D/PowerManagerService(199): acquireWakeLock flags=0x1 tag=ActivityManager-Launch
02-28 14:33:17.089: I/ActivityManager(199): Process com.google.android.gms (pid 642) has died.
02-28 14:33:18.629: D/PowerManagerService(199): acquireWakeLock flags=0xa tag=KEEP_SCREEN_ON_FLAG
02-28 14:33:18.649: W/InputManagerService(199): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@40928628 (uid=10025 pid=1085)
02-28 14:33:18.719: D/PowerManagerService(199): releaseWakeLock flags=0x1 tag=ActivityManager-Launch
02-28 14:33:22.139: D/PowerManagerService(199): releaseWakeLock flags=0xa tag=KEEP_SCREEN_ON_FLAG
02-28 14:33:23.969: I/System.out(967): DEBUG: setDebug: JavaMail version 1.4.6
02-28 14:33:23.989: I/System.out(967): DEBUG SMTP: useEhlo true, useAuth false
02-28 14:33:24.009: I/System.out(967): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
02-28 14:33:24.139: I/System.out(967): 220 mx.google.com ESMTP 44sm11905543eek.5 - gsmtp
02-28 14:33:24.139: I/System.out(967): DEBUG SMTP: connected to host "smtp.gmail.com", port: 587
02-28 14:33:24.149: I/System.out(967): EHLO localhost
02-28 14:33:24.219: I/System.out(967): 250-mx.google.com at your service, [217.238.138.215]
02-28 14:33:24.239: I/System.out(967): 250-SIZE 35882577
02-28 14:33:24.239: I/System.out(967): 250-8BITMIME
02-28 14:33:24.239: I/System.out(967): 250-STARTTLS
02-28 14:33:24.259: I/System.out(967): 250 ENHANCEDSTATUSCODES
02-28 14:33:24.269: I/System.out(967): DEBUG SMTP: Found extension "SIZE", arg "35882577"
02-28 14:33:24.269: I/System.out(967): DEBUG SMTP: Found extension "8BITMIME", arg ""
02-28 14:33:24.269: I/System.out(967): DEBUG SMTP: Found extension "STARTTLS", arg ""
02-28 14:33:24.279: I/System.out(967): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
02-28 14:33:24.289: I/System.out(967): STARTTLS
02-28 14:33:24.359: I/System.out(967): 220 2.0.0 Ready to start TLS
02-28 14:33:25.319: I/System.out(967): EHLO localhost
02-28 14:33:25.589: I/System.out(967): 250-mx.google.com at your service, [217.238.138.215]
02-28 14:33:25.599: I/System.out(967): 250-SIZE 35882577
02-28 14:33:25.609: I/System.out(967): 250-8BITMIME
02-28 14:33:25.609: I/System.out(967): 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
02-28 14:33:25.619: I/System.out(967): 250 ENHANCEDSTATUSCODES
02-28 14:33:25.629: I/System.out(967): DEBUG SMTP: Found extension "SIZE", arg "35882577"
02-28 14:33:25.639: I/System.out(967): DEBUG SMTP: Found extension "8BITMIME", arg ""
02-28 14:33:25.639: I/System.out(967): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
02-28 14:33:25.639: I/System.out(967): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
02-28 14:33:25.679: I/System.out(967): AUTH XOAUTH2 ??????????????????????????????==
02-28 14:33:26.309: I/System.out(967): 235 2.7.0 Accepted
4

1 に答える 1

0

メールに使用される jar ファイルとの互換性がないことが判明しました。Android に必要な jar ファイルは、次の場所からダウンロードできます。

https://code.google.com/p/javamail-android/downloads/list

于 2013-02-28T14:20:32.407 に答える