【问题标题】:php form - godaddy economic hosting Linuxphp 形式 - Godaddy 经济型 Linux 主机
【发布时间】:2015-10-14 00:52:02
【问题描述】:

我有这个表格:

<form action="/sendemail.php" id="main-contact-form" method="post" name="contact-form" role="form">
<div class="form-group">
    <input class="form-control" id="name" name="name" placeholder="put your name" required="" type="text" />
</div>

<div class="form-group">
    <input class="form-control" id="email" name="email" placeholder="Email" required="" type="email" />
</div>

<div class="form-group">
    <input class="form-control" id="subject" name="subject" placeholder="Subject..." required="" type="text" />
</div>

<div class="form-group">
    <textarea class="form-control" name="message" placeholder="Mensaje" required="" rows="8"></textarea>
</div>

<input class="btn btn-primary" id="submit" name="submit" type="submit" value="Enviar" />

这是 sendemail.php:

<?php
        $pos = $_POST;
        $name = $_POST['name'];
        $email = $_POST['email'];
        $message = $_POST['message'];
        $from = $_POST['email']; 
        $to = 'email@gmail.com '; 
        $subject = 'contact message ';

        $body = "From: $name\n E-Mail: $email\n Message:\n $message\n $pos";




    mail ($to, $subject, $body, $from)



?>

电子邮件是空的,我尝试了很多东西,但总是以相同的方式出现,就像表单无法将数据从输入传递到 php 变量。我是 php 新手,欢迎任何帮助。

谢谢。

【问题讨论】:

  • 在发送电子邮件之前尝试显示print_r($body);,以检查这是否显示带有 POST 输入的完整文本。
  • 我在godaddy服务器中测试这个,在本地工作正常。那么,如何在共享主机中使用 print_r?

标签: php sendmail shared-hosting


【解决方案1】:

mail()函数的使用太不安全了,是向量攻击发送大量垃圾邮件,不要再使用了,因为这个原因最好使用PHP Mailer libray。

在您的主机中创建一个 EMAIL 帐户(例如:no-reply@domain.com),然后安装此库 PHP Mailer,现在您可以这样做了:

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

//$mail->SMTPDebug = 3;                               // 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

$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');

$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
$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';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

【讨论】:

  • 这很有趣,php.net/manual/en/function.mail.php 并没有说它已被弃用,那么你说 PHP 的 mail() 不安全的来源是什么?
  • 虽然这个功能没有被弃用,但并不代表它是安全的,很多网站被恶意代码毒化,然后攻击者安装一个控制台(REMOTE FILE INCLUSION)并使用你的服务器无限制地发送垃圾邮件与此不同,使用 PHPMailer,需要在服务器中拥有有效帐户才能发送电子邮件。
  • 由于这些原因,许多托管服务提供商决定阻止此功能,当提供商提供您的托管服务时,他为您提供了一个共享服务器,如果同一服务器中列出的某些网站存在漏洞,您的网站将存在漏洞也是。还有 GMAIL 和 HOTMAIL,开始阻止来自共享服务器的电子邮件。
  • 基本上你给出的例子是当帐户已经被盗用并且恶意用户可以进入并安装脚本来发送垃圾邮件,所以强制用户通过像 PHPMailer 这样的包装器使用远程 SMTP 服务器。如果恶意用户已经可以登录并上传脚本,那么是什么阻止他们使用 PHPMailer 发送垃圾邮件?因为他们没有远程 SMTP 服务器的用户名和密码?但是,这些必须已经以纯文本形式存储在脚本中的某个位置,因此据我所知,最终没有区别(不需要发送邮件的帐户除外)。
  • 这是一个简单的例子,最好的做法是永远不要将密码保存为纯文本,我们处于一个新的开发时代,最佳做法是一种义务,因此,使用环境变量和强大的散列器,在这种情况下,不需要记录将文件上传到易受攻击的站点。所有系统都是易受攻击的,但作为开发人员,我们的工作是减少漏洞,这个例子就是其中的一部分。
【解决方案2】:

更新
经过一番研究,我发现:

您需要咨询 Godaddy 技术支持才能启用“sendmail”。

PHP mail() not working on GoDaddy

---------

我已经测试了您的代码,它有效。我收到了包含ALL $_POST 内容的电子邮件,没有任何问题。

$pos = $_POST;
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = $_POST['email']; 
$to = 'email@gmail.com '; 
$subject = 'contact message ';

注意:

1 - $pos = $_POST;array,它将显示为 Array
2 - 通过mail() 发送的电子邮件很可能最终会进入垃圾邮件文件夹(请阅读下面的 cmets)。

【讨论】:

  • 为什么通过 PHP 的 mail() 发送的电子邮件会与其他任何不同?
  • 例如不包含DKIM-SignatureDomainKey-Signature
  • 那么,如何显示数组的内容?
  • @PedroLobito 这不是真的。这些应该由您的 MTA 完成,而不是由 PHP(或任何其他邮件客户端)完成。我刚刚使用 PHP 的 mail() 给自己发送了一封电子邮件,并且它已正确签名,因此如果您得到不同的结果,则说明您的配置有误。
  • @PedroLobito 托管服务提供商不会启用mail() 功能,因为非常不安全,我1年前就有这个问题。
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 2012-01-18
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2010-09-24
  • 2019-12-27
相关资源
最近更新 更多