0

アプリケーション内でメールを送信しようとしています。ユーザーとのやり取りをポップアップ表示するつもりはありません。私は2つのJavaコードを持っています。

MainActivity.java

package com.example.test;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
public static String EXTRA_MESSAGE = "com.example.MESSAGE";

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


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);

}

public void sendMessage(View view)
{
    try {   
        test sender = new test();
        sender.send();
        Toast.makeText(getApplicationContext(), "Message Sent!!! :)", Toast.LENGTH_LONG).show();
    } catch (Exception e) {   
        //Log.e("SendMail", e.getMessage(), e);   
    } 
}

public void exit(View view)
{
    System.exit(0);
}    
}

test.java

package com.example.test;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

import android.widget.Toast;

public class test extends MainActivity
{
public void send()
{
    String host = "smtp.gmail.com";
String from = "MYUSERNAME";
String pass = "MYPASS";
try
{
Properties props = new Properties();
props.put("mail.smtp.starttls.enable", "true"); // added this line
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", from);
props.put("mail.smtp.password", pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");

String[] to = {"ADDRESSTOSEND@gmail.com"}; // added this line

Session session = Session.getDefaultInstance(props, null);
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));

InternetAddress[] toAddress = new InternetAddress[to.length];

// To get the array of addresses
for( int i=0; i < to.length; i++ ) { // changed from a while loop
    toAddress[i] = new InternetAddress(to[i]);
}
System.out.println(Message.RecipientType.TO);

for( int i=0; i < toAddress.length; i++) { // changed from a while loop
    message.addRecipient(Message.RecipientType.TO, toAddress[i]);
}
message.setSubject("This is subject");
message.setText("Welcome to your mail");
Transport transport = session.getTransport("smtp");
transport.connect(host, from, pass);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
catch(Exception e)
{
    Toast.makeText(getApplicationContext(), "Error" + e, Toast.LENGTH_LONG).show();
}
}
}

送信ボタンを押してもメールが送信できません。xml onClick を使用して sendMessage() を呼び出しました。

日食にはエラーはありません。プロジェクトはコンパイル、インストールされますが、メールが届きません。Java だけを使用javacして test.java を実行してみると、問題なく動作します。アカウントにメールが届きます。

私を助けてくれてありがとう。

4

3 に答える 3

0

送信コードを試したことはありませんが、コンテキストを取得する方法で null ポインターが発生します。

行で NullPointerException が発生している可能性がgetApplicationContext()ありToast.makeText(getApplicationContext(), "Error" + e, Toast.LENGTH_LONG).show();ます。コンテキストを取得するためにアクティビティを拡張しないでください。代わりに、コンストラクターを使用してコンテキストを Test クラスに渡します。

例えば:

public class Test {
    private Context cntxt;

    public Test(Context context){
        this.cntxt = context;
    }
    public void send() {
        //Code to send
        //And when you need the context you use the cntxt
        Toast.makeText(cntxt, "Error" + e, Toast.LENGTH_LONG).show()
    }
}

また、大文字で始まるクラス名を宣言することは、良い習慣であり慣習であることも覚えておいてください。test の名前を Test に変更する必要があります。

于 2013-09-23T14:32:28.660 に答える
0

ありますか

<uses-permission android:name="android.permission.INTERNET" />

アプリケーションのマニフェスト ファイルで?

編集1:

変えてみたらどうですか

Session session = Session.getDefaultInstance(props, null);

Session session = Session.getDefaultInstance(props, new MailAuthenticator(from, pass));
于 2013-09-22T15:50:57.573 に答える