PHP中的已发送邮件引发504网关超时

时间:2019-03-02 14:35:21

标签: php email gmail

我正在使用Ubuntu VM。

我有这个PHP

<?php

# --------------------------------------------------------------------------------
# Goal    : send an email
# Run     : curl 45.55.88.57/code/mail.php  | php


$to      = 'email@gmail.com';
$subject = '';
$message = 'hello';
$headers = 'From: john@gmail.com' . "\r\n" .
    'Reply-To: john@gmail.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?>

我跑了这个

curl 45.55.88.57/code/mail.php  | php

我明白了

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   176  100   176    0     0      2      0  0:01:28  0:01:00  0:00:28    45
<html>
<head><title>504 Gateway Time-out</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Time-out</h1></center>
<hr><center>nginx</center>
</body>
</html>

我的代码是错误的,还是我的VM有问题?

我没有收到任何电子邮件。

5 个答案:

答案 0 :(得分:4)

不要忘记设置您的Gmail设置。 请按照this tutorial设置Google smtp。

答案 1 :(得分:1)

在您的虚拟机中,只需在虚拟机上运行带有以下代码的测试php文件

<?php
  echo phpinfo();
?>

如果仍然遇到相同的错误,则是由于虚拟机之前存在某个服务器层导致的。

但是,如果看到不同的输出,则必须看到PHP配置信息。

在配置中,查找“已加载的配置文件”,它将为您提供php.ini配置文件的确切路径。

如Tuckbros所述,在php.ini中,检查您的邮件设置(http://php.net/manual/en/mail.configuration.php#ini.smtp)。

确保已在服务器上安装sendmail并在php.ini中正确配置了“ sendmail_path”配置。

答案 2 :(得分:0)

您可以使用PHPMailer。 它很容易使用。 https://github.com/PHPMailer/PHPMailer
这是发送电子邮件的标准代码:(我已复制)

$mail->SMTPDebug = 2;                                 // Enable verbose debug output
$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587;                                    // TCP port to connect to

//Recipients
$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
$mail->addAddress('ellen@example.com');               // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

//Attachments
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

//Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

更多信息:
https://github.com/PHPMailer/PHPMailer/wiki/Tutorial
https://www.youtube.com/watch?v=YtNraQxUTM0 https://www.sitepoint.com/sending-emails-php-phpmailer/

让我知道是否可行。
PS。如果您想找出原因,为什么您的邮件不在Gmail收件箱中: 您的mail()的HTTP标头不安全。如果您的标头不安全,则可能会有标头注入的机会。
更多信息:
https://mediatemple.net/community/products/dv/204643950/understanding-an-email-header
https://www.gracefulsecurity.com/http-header-injection/

答案 3 :(得分:0)

您可以按照以下步骤使用来自Google的免费SMTP服务器

步骤1:

  

Allow access for less secure apps   
  Less secure app access

步骤2:请勿使用2因子身份验证来访问您的Google帐户。
 第3步:设置POP

  1.   

    在计算机上,打开Gmail。点击右上角的设置

  2.   

    设置。单击设置。单击转发和POP / IMAP选项卡。在

  3.   

    “ POP下载”部分,选择“为所有邮件启用POP”或“启用”

  4.   

    从现在开始到达的邮件的POP。在页面底部,

  5.   

    点击保存更改。

步骤3:在电子邮件客户端上更改外发邮件(SMTP)服务器

  

smtp.gmail.com   需要SSL:是   需要TLS:是(如果可用)   需要验证:是   TLS / STARTTLS的端口:587

***如果您通过工作或学校帐户使用Gmail,请与管理员联系以获取正确的SMTP配置。

您可以点击以下链接:Gmail messages on other email clients using POP

答案 4 :(得分:0)

您可能没有任何MTA(邮件传输代理)正在运行。该问题可以通过多种方式解决。如果要使用外部服务器的电子邮件地址,则最容易安装和配置一些MTA,例如非常简单的msmtp。