【问题标题】:Object Oriented PHP Email Contact Form Not Sending面向对象的 PHP 电子邮件联系表未发送
【发布时间】:2013-07-17 17:14:00
【问题描述】:

我已经在 PHP 中完成了很多联系表单,没有问题,但是我对 oop 很陌生,我无法完全理解它应该如何工作。我正在与一位帮助我自学这一点的导师合作,基本上为我提供了学习 oop 的资源,但我一直坚持这一点。我要制作一个简单的联系表格,将用户信息发送到同一表格上指定的电子邮件。这些是我的要求:

用户类应该:

  • 包含相关提交的数据作为类的属性

  • 有一个构造方法,可以让你在一个语句中声明类并设置数据

Email 类应该:

  • 保持静止

  • 有一种方法可以让您在一个声明中发送电子邮件

  • 有一种方法可以将格式化标签 ([b] / [i] / [[name]]) 替换为适当的等价物

  • 有权访问方法(私有/公共)

我现在不担心验证或语法转换,因为我只是想弄清楚为什么电子邮件没有发送。

runner.php:

<?php
class User  {

public $firstName;
public $lastName;
public $toEmail;
public $fromName;
public $fromEmail;
public $subject;
public $message;

public function post() {
if (isset($_POST['Submit'])) {
$mail = new email($_POST['firstName'], $_POST['lastName'], $_POST['toEmail'],     $_POST['fromName'], $_POST['fromEmail'], $_POST['subject'], $_POST['message']);
$mail->toEmail = $POST['$toEmail'];
$mail->sendMail();
    }
  }
}

class email {

private $fristName;
private $lastName;
private $toEmail;
private $fromName;
private $fromEmail;
private $subject;
private $message;

public static function __construct($firstName, $lastName, $toEmail, $fromName, $fromEmail, $subject, $message) {
    $this->firstName = $firstName;
    $this->lastName = $lastName;
    $this->toEmail = $toEmail;
    $this->fromName = $fromName;
    $this->fromEmail = $fromEmail;
    $this->subject = $subject;
    $this->firstName = $message;
}

 function sendMail($mail) {
    $contents = "To: $firstName&nbsp;$lastName<br />From: $fromName<br />Subject: $subject<br />Message: $message";
    $headers = "From:" . $fromEmail;
    $sendmail = mail($this->toEmail, $this->subject, $this->message, $this->contents, $headers);
    }
}
?>

form.html:

<html>
<head>
</head>
<body>
<form action="runner.php" method="POST">
<b>To</b></br>
<label>First Name</label>
<input type="text" name="firstName" id="firstName"></br>
<label>Last Name</label>
<input type="text" name="lastName" id="lastName"></br>
<label>Email</label>
<input type="text" name="toEmail" id="toEmail"></br></br>
<b>From</b></br>
<label>Name</label>
<input type="text" name="fromName" id="fromName"></br>
<label>Email</label>
<input type="text" name="fromEmail" id="fromEmail"></br></br>
<b>Compose Email</b></br>
[b]<b>bold</b>[\b] and [i]<i>italic</i>[\i] tags permitted in email body</br>
<label>Subject</label>
<input type="text" name="subject" id="subject"></br>
<label>Body</label>
<textarea name="message" id="message"></textarea></br></br></br>
<input type="submit" value="Submit"></form>
</body>
</html>

我什至不知道我是否走在正确的轨道上。任何帮助/资源将不胜感激。

【问题讨论】:

  • 您是否遇到任何错误?
  • 您的$fristName 拼写错误。
  • 好吧,你永远不会调用 post()sendMail()... 此外,你定义了 2 个类,但从未实例化它们中的任何一个。所以什么都不应该发生。如果你想使用你定义的类,你需要先创建它们的实例,然后调用你创建的实例的方法。然后,您将开始看到一些不言自明的错误,这些错误应该表明代码有什么问题。
  • @Connor,真是一团糟……在一行中声明所有变量。 (读作:“这是一种个人风格偏好”,来自“制表符与空格”类别)
  • @Connor 我最初确实有,但我不确定它是否正确,因为在我观看/阅读的许多教程中,它们都在不同的行中。

标签: php forms oop


【解决方案1】:

我可能错了,但我认为这与您的 $contents 变量有关。您只在sendMail 类中设置了它,但您使用了$this-&gt;contents。尝试将private $contents; 设置为实例变量,或者只在这一行使用$contents

$sendmail = mail($this->toEmail, $this->subject, $this->message, $this->contents, $headers);

(应该是:)

$sendmail = mail($this->toEmail, $this->subject, $this->message, $contents, $headers);

【讨论】:

    【解决方案2】:

    如果你在本地工作,php邮件功能将无法使用。

    尝试使用 phpmailer library(smtp) 或尝试将脚本上传到启用邮件服务器的主机。

    【讨论】:

    • 可以在本地工作并设置邮件服务器。
    • 是的,您可以使用本地的 smtp 设置来完成。尝试使用支持 html 的 phpmailer 库。
    【解决方案3】:
    <?php
    class User  {
    
    public $firstName;
    public $lastName;
    public $toEmail;
    public $fromName;
    public $fromEmail;
    public $subject;
    public $message;
    
    public function post() {
    if (isset($_POST['Submit'])) {
    $mail = new email($_POST['firstName'], $_POST['lastName'], $_POST['toEmail'],     $_POST['fromName'], $_POST['fromEmail'], $_POST['subject'], $_POST['message']);
    
    $mail->toEmail = $POST['$toEmail'];
    

    toEmail 是私有财产。如果您希望能够像这样设置它,那么它应该被声明为公共的。另外,您发布的 HTML 表单中没有 $toEmail 字段,因此您可能想在这里写 toEmail

    另外,你已经在构造函数中设置了这个值。

    $mail->sendMail();
        }
      }
    }
    
    class email {
    

    类应该以大写字母开头是一般约定,但这主要是样式问题。

    private $fristName;
    private $lastName;
    private $toEmail;
    private $fromName;
    private $fromEmail;
    private $subject;
    private $message;
    
    public static function __construct($firstName, $lastName, $toEmail, $fromName, $fromEmail, $subject, $message) {
    

    您不能拥有静态构造函数...您应该将其设为普通构造函数,或者,如果您希望该类仅包含静态属性,则将其完全删除。如果你希望属性是静态的,你应该在上面的代码中定义它们。

    另外,如果这必须是一个只包含静态属性的类,那么您可能不想实例化它。

        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->toEmail = $toEmail;
        $this->fromName = $fromName;
        $this->fromEmail = $fromEmail;
        $this->subject = $subject;
        $this->firstName = $message;
    }
    
     function sendMail($mail) {
        $contents = "To: $firstName&nbsp;$lastName<br />From: $fromName<br />Subject: $subject<br />Message: $message";
        $headers = "From:" . $fromEmail;
    

    $firstName, $lastName, ..., 在这里不可用,你可能的意思是使用$this-&gt;firstName, ...等。

        $sendmail = mail($this->toEmail, $this->subject, $this->message, $this->contents, $headers);
    

    mail() 功能可能被托管服务提供商禁用。如果发生这种情况,您应该会看到一条错误消息。

        }
    }
    ?>
    

    您没有实例化任何这些类。您可能想要执行以下操作:

    $user = new User();
    $user->post();
    

    【讨论】:

    • 感谢您提供详细信息 - 将返回并处理此问题,再次感谢
    猜你喜欢
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2019-09-04
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多