PHPMailer дважды отправляет электронные письма на slimframework

У меня есть функция публикации для вставки информации о процессе в базу данных и отправки электронной почты одному получателю.

$app->post('/sendemail', function ($request, $response) {
    //Save info process
    $message =  saveDataBaseInfo();

    if ($message == "OK") {         

        // Send email
        $res = sendEmail("Some text", "<p>Some text</p>", "Some subject", "[email protected]");

        if ($res == "Fail") {
            return $res;
        }
    }     
});

public function sendEmail($body, $bodyHtml, $subject, $emailTo) {

    $mail = new PHPMailer;

    $mail->SingleTo = true;
    $mail->isSMTP();
    $mail->Host = 'myHost';
    $mail->SMTPAuth = true;
    $mail->Username = 'theuser';
    $mail->Password = '******';
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;  
    $mail->setFrom("[email protected]", "", false);
    $mail->addAddress($emailTo);
    $mail->isHTML(true);

    $mail->Subject = $subject;
    $mail->Body = $bodyHtml;
    $mail->AltBody = $body;
    $send = $mail->send();

    if (!$send) {
        return "Success"
    } else {
        return "Fail";
    }
}

И я вызываю эту функцию в своем приложении для Android, как показано ниже.

// Click event function
private void sendEmailClick() { 

    HashMap<String, String> parms = new HashMap<>();
    // parms like emailTo for example

    TaskServerAsync taskServerAsync = new TaskServerAsync(this, parms);
    taskServerAsync.execute(R.string.urlSendEmail);
}

public class TaskServerAsync extends AsyncTask<Integer, String, JSONObject> implements Response.ErrorListener {   
    private Map<String, String> parm;
    private Context context;

    public TaskServerAsync(Context context ,Map<String, String> parms) {
        this.parm = parm;
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        //Show progressBar
        progressBar.show();
    }

    @Override
    protected JSONObject doInBackground(Integer... values) {
        RequestFuture<JSONObject> future = RequestFuture.newFuture();

        // Class send request server with volley
        ServerConn.send(context, values[0], parms, future, this);

        JSONObject json = null;
        try {
            // Get future response
            json = future.get(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }

        return json;

    }

    @Override
    protected void onProgressUpdate(String... values) {

    }

    @Override
    protected void onPostExecute(JSONObject response) {        
        dismissProgressBar();
    }

    @Override
    public void onErrorResponse(VolleyError error) {
        // Show error server and dismiss ProgressBar
        dismissProgressBar();
    }

    private void dismissProgressBar() {
        if (progressBar != null)
            progressBar.dismiss();
    }
}

Но функция публикации сработала дважды. Что случилось? Нужно ли мне что-то настраивать на апаче? Кто-то может мне помочь?


person Vinicius Maciel    schedule 23.05.2016    source источник
comment
Как вы вызываете эту функцию? Например, вы используете AJAX для публикации?   -  person Mikey    schedule 23.05.2016
comment
У меня есть приложение для Android, и я вызываю эту функцию с помощью Volley Api.   -  person Vinicius Maciel    schedule 23.05.2016
comment
Тогда это усложняет вашу проблему. Вы должны обновить свой вопрос с помощью кода Java, который вы используете для публикации. Это может быть проблема с вашим кодом Java. Если вы попытаетесь опубликовать сообщение по этому маршруту без использования приложения для Android, оно также будет отправлено дважды?   -  person Mikey    schedule 23.05.2016
comment
Держу пари, вы вызываете функцию дважды. Вставьте в тему метку времени: $mail->Subject .= md5(microtime(true));. Проверьте также свои журналы.   -  person Synchro    schedule 23.05.2016
comment
В проекте Android я вызываю сервер с Volley в процессе AsyncTask для работы в фоновом режиме.   -  person Vinicius Maciel    schedule 23.05.2016
comment
Я обновил способ вызова функции сервера в проекте Android.   -  person Vinicius Maciel    schedule 23.05.2016
comment
Вы уверены, что sendEmailClick на стороне Android не срабатывает дважды? Один раз для buttonPressed и один раз для buttonReleased? Просто догадываюсь, потому что код для этого отсутствует.   -  person puelo    schedule 23.05.2016
comment
Я сделал тест. Когда я прокомментировал блок кода отправки электронной почты, функция post была вызвана один раз. Поэтому я думаю, что проблема в phpmailer. Чего-то не хватает, я думаю.   -  person Vinicius Maciel    schedule 23.05.2016
comment
Что такое блок кода отправки электронной почты? Раскомментируйте код и временно переименуйте $app->post('/sendemail', ...) в $app->get('/sendemail', ...) и получите прямой доступ к этому маршруту через браузер. Он отправляет письмо дважды? Если это так, то вы, вероятно, на правильном пути. Если нет, я предполагаю, что это как-то связано с Android/Volley.   -  person Mikey    schedule 24.05.2016
comment
@ Майки, ты прав, мои вызовы залпа создают эту проблему. Я изменил сообщение, чтобы получить, и я проверил в браузере, как вы сказали ранее. Было отправлено одно электронное письмо. Теперь, как я могу решить эту проблему?   -  person Vinicius Maciel    schedule 24.05.2016
comment
Я нашел решение. Спасибо всем, кто помогает мне. @Майки, спасибо, ты спас мой день. Ниже решение для ошибки залпа stackoverflow.com/a/27873079/2154577   -  person Vinicius Maciel    schedule 24.05.2016


Ответы (1)


Как отмечено, проблема заключается в том, что приложение Android отправляет вызов API дважды.

person Rob Allen    schedule 13.11.2016