0

javax メール クラスを使用して、Gmail SMTP 経由で添付ファイル付きの複数のメールを送信しています。電子メールの送信は、doInBackground() 関数の AsyncTask 内で行われます。メールの配列リストがあり、1 つずつ送信しています。最初の電子メールは正常に送信されますが、次の電子メールから MessagingException: Could not connect to SMTP host が発生します。なぜこの問題が発生するのかよくわかりません。必要なリソースが解放されていない可能性はありますか? 誰もこの問題の解決策を知っていますか?

04-30 10:10:25.109: W/System.err(619): javax.mail.MessagingException: SMTP ホストに接続できませんでした: localhost、ポート: 25; 04-30 10:10:25.109: W/System.err(619): ネストされた例外は: 04-30 10:10:25.109: W/System.err(619): java.net.ConnectException: localhost/127.0. 0.1:25 - 接続が拒否されました 04-30 10:10:25.109: W/System.err(619): com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391) 04-30 10:10: 25.109: W/System.err(619): at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) 04-30 10:10:25.109: W/System.err(619): at javax .mail.Service.connect(Service.java:288) 04-30 10:10:25.109: W/System.err(619): javax.mail.Service.connect(Service.java:169) 04-30 10 :10:25.109: W/System.err(619): javax.mail.Service.connect(Service.java:118) 04-30 10:10:25.109: W/System.err(619): javax.郵便物。

私のメール送信 asynctask クラス

class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    Mail thisMail;

    public SendEmailAsyncTask() {
        if(V) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
        this.thisMail = mailQueue.get(mailCounter);
        sendMessageToClient("Sending " + thisMail.getRecipients());

    }

    @Override
    protected Boolean doInBackground(Void... params) {
        if(V) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()");
        try {
            thisMail.send();
            return true;
        } catch (AuthenticationFailedException e) {
            Log.e(SendEmailAsyncTask.class.getName(), "Gmail account details are wrong");
            createNotification("Gmail account details are incorrect. Please check them in the settings.");
            setFlag(FLAG_BAD_ACCOUNT);
            e.printStackTrace();
            return false;
        } catch (MessagingException e) {
            Log.e(SendEmailAsyncTask.class.getName(), thisMail.getRecipients() + " sending failed");
            e.printStackTrace();
            return false;
        } 
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if(result) { // email send success
            //sent successfully 
            if(D) Log.d(SendEmailAsyncTask.class.getName(), "email sent successfully");
            sendMessageToClient("Email sent");
        } else {
            //retry? or quit
            if(D) Log.d(SendEmailAsyncTask.class.getName(), "email was not sent");
            sendMessageToClient("Email not sent");
        }       

            mailCounter++;
            // if there are more mails in the queue start another send email task
            if (mailCounter < mailQueue.size()) {
                SendEmailAsyncTask sendTask = new SendEmailAsyncTask();
                sendTask.execute();

            // if there are no more in the mail queue, delete the data set
            } else {
                deleteTask = new DeleteFilesAsyncTask(currentDataSet.getDate(), currentDataSet.getMachine());
                deleteTask.execute();
            }

        sendTask = null;
    }
}

編集: メール ラッパー クラスを調べると、使用しているポートは 25 ではなく 465 です。

public class Mail extends javax.mail.Authenticator {   
private String mailhost = "smtp.gmail.com";   
private String user;   
private String password;   
private Session session;   
private Multipart multipart;
private String subject;
private String body;
private String sender;
private String recipients;

static {   
    Security.addProvider(new JSSEProvider());   
}  

public Mail(String user, String password) {
    this.user = user;   
    this.password = password;   
    multipart = new MimeMultipart();

    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.socketFactory.port", "465");   
    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);
    session = Session.getInstance(props, this);
}   

}

4

1 に答える 1

1

誰も答えを持っていないようなので、わかりました...私は自分の質問に答えます。

送信を後でスケジュールするのではなく、作成したらすぐにメールを送信することで、問題を回避しました。

前のコード: (1 回の送信が成功した後にエラーが発生しました)

class CreateEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    @Override
    protected Boolean doInBackground(Void... params) {
        // create emails and add to the queue
    }

    @Override
    protected void onPostExecute(Boolean result) {
        SendEmailAsyncTask sendTask = new SendEmailAsyncTask();
        sendTask.execute();
}

class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    @Override
    protected Boolean doInBackground(Void... params) {
        // send emails
    }
}

変更されたコード: (すべてのメールでうまく機能します)

class CreateEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
    @Override
    protected Boolean doInBackground(Void... params) {
        // create emails
        // send emails
    }
}

タイムアウトか何かでメール オブジェクトが無効になる可能性があると思いますが、よくわかりません。Java Mail API ドキュメントを確認しましたが、多くの情報が見つかりませんでした...

于 2012-04-30T22:40:02.277 に答える