LightSail Bitnami LAMP通过PHP发送电子邮件返回200,但未发送电子邮件

LightSail Bitnami LAMP通过PHP发送电子邮件返回200,但未发送电子邮件,php,email,bitnami,amazon-lightsail,Php,Email,Bitnami,Amazon Lightsail,我已经发布了一个AWS LightSail Bitnami灯实例。 客户端简单html表单 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Simple Form</title> </head> <body> <form actio

我已经发布了一个AWS LightSail Bitnami灯实例。 客户端简单html表单

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Simple Form</title>
</head>

<body>

<form action="contact2.php" method="post">
<input name="firstName" placeholder="firstName" type="text" size="30" />
<input name="lastName" placeholder="lastName" type="text" size="30" />
<input name="email" placeholder="email" type="text" size="30" />
<input name="phone" placeholder="phone" type="text" size="30" />
<input name="subject" placeholder="subject" type="text" size="30" />
<textarea name="message"  placeholder="message" type="text" size="30"></textarea>

<input name="submit" type="submit" value="Send This">
</form>

</body>
</html>

简单形式
后端php代码

<?php
if (!empty($_POST)) {
    $firstName = $_POST['firstName'];
    $lastName = $_POST['lastName'];
    $email = $_POST['email'];
    $phone = $_POST['phone'];
    $subject = $_POST['subject'];
    $message = $_POST['message'];
    $toEmail = 'mymail@mydomain.com';
    $emailSubject = 'test';
    $headers = ['From' => $email, 'Reply-To' => $email, 'Content-type' => 'text/html; charset=iso-8859-1'];
    
    $body = "Name: $firstName $lastName .\n".
            "Phone: $phone.\n".
            "Message: $message.\n";
    
    mail($toEmail, $emailSubject, $body, $headers);
}
?>

调用contact.php返回状态为200,但不会发送电子邮件

在Heruku上使用相同的精确代码可以完美地工作,并且收到电子邮件

返回状态为200

当然有。您的代码中没有任何内容要求它执行其他操作

if (!mail($toEmail, $emailSubject, $body, $headers)) {
   header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
   print "Failed to send email";
   exit;
}
但是,mail()函数的成功返回值只意味着PHP在其旅程的第一步就传递了消息(在消息到达某人的收件箱之前,至少会有3次甚至更多的跳跃)


顺便说一句,你知道你给我们看的代码允许任何人在任何地方发送任何电子邮件吗?您可能需要在google上搜索PHP邮件头注入。

页面返回200,因为mail()函数不会抛出错误。 如果确实要检查邮件是否已发送,则需要使用以下If条件进行检查:

if(mail($to, $subject, $body, $headers)
在PHP中,除非使用Codeigniter或Laravel之类的框架,否则页面大部分时间返回200

邮件问题 php中的mail()函数使用linux中的sendmail程序发送电子邮件。如果AWS实例无法发送邮件,而heroku实例能够发送邮件,则表示heroku实例已安装sendmail

要解决此问题,您需要SSH到您的AWS Lightsail实例中,并根据您的Linux版本运行此命令

sudo apt-get install sendmail
如果这不起作用,试试这个

sudo yum install sendmail
进一步调试 如果安装无法解决您的问题,请检查此问题

检查服务是否已启动

service sendmail status
注意:上述命令的输出应该是一些-
Active:Active(running)

如果未启动,请运行以下命令启动

service sendmail start
推荐 如果您运行一个小项目,这将起作用。但是,如果您使用此方法发送大量电子邮件,您的实例可能会因为通过此方法发送电子邮件而被AWS阻止此外,通过此方法发送的大多数电子邮件最终都会进入垃圾邮件文件夹

建议使用以下第三方服务之一发送电子邮件

  • PHP邮件程序(使用Gmail凭据发送邮件)
  • AWS SES(发送电子邮件的费用为1/10000美元)
  • 邮枪、Sendgrid、Elasticemail等

  • 您如何确保您的电子邮件已发送?你没有做任何错误检查。如果你考虑是否收到,那么发送服务器可能会有影响(例如,如果发送IP的声誉不好)。由于代码在Heruku上运行得很好,我相信问题不存在,尽管如此,你在生产中/在基本功能运行后是对的(这是一个简单的测试,可以查看所有配置是否正确)您建议的验证检查应该更多。“应该有更多的验证检查”-不在发送电子邮件的PHP代码中。谢谢,我已经安装了sudo apt get install sendmail,状态为Active:Active(running)邮件函数仍然没有发送。配置php.ini文件并添加SMTP=localhost SMTP\u port=25无助于运行以下命令:echo“Subject:sendmail test”| sendmail-vmy@email.comIf这也不起作用,必须有两种可能性:1.防火墙阻止端口25(通过运行:sudo ufw status进行检查),2.已阻止AWS安全规则中的端口。(请检查实例的出站安全角色)。