【发布时间】:2016-05-23 17:07:48
【问题描述】:
我有一个发布功能,可以在数据库中插入有关流程的信息并将电子邮件发送给一个收件人。
$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@email.com");
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("emailfrom@emailfrom.com", "", 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();
}
}
但是 post 函数触发了两次。怎么了?需要我在 apache 上配置一些东西吗?有人可以帮助我吗?
【问题讨论】:
-
你是怎么调用这个函数的?比如你是用AJAX发帖吗?
-
我有一个安卓应用,我用 Volley Api 调用这个函数
-
我敢打赌你会调用这个函数两次。在主题中贴上时间戳:
$mail->Subject .= md5(microtime(true));。也检查你的日志。 -
哪个是“发送电子邮件代码块”?取消注释代码并将
$app->post('/sendemail', ...)暂时重命名为$app->get('/sendemail', ...)并通过浏览器直接访问该路由。它会发送两次电子邮件吗?如果是这样,那么您可能走在正确的轨道上。如果不是,我猜这与 Android/Volley 有关。 -
我找到了解决方案。谢谢大家帮助我。 @Mikey 谢谢你,你拯救了我的一天。下面是volley的bug解决方案stackoverflow.com/a/27873079/2154577
标签: php android-volley phpmailer slim slim-3