【问题标题】:PHPMailer install without Composer没有 Composer 的 PHPMailer 安装
【发布时间】:2017-09-15 20:36:43
【问题描述】:

请原谅我的无知。 我正在尝试在 Linux 上的 PHP 5.6 下安装 PHPMailer 6.0.1。 我的 PHP 安装是远程的,我通过 FTP 管理我所有网站的 PHP(我通常将包作为 .zip 下载到 Win 10,解压缩然后通过 FTP 将结果传输到我的网站空间)。

在安装 PHPMailer 的各种方法中,Composer 是首选,但这是我遇到的问题。 Composer 的所有说明似乎都不适合这种工作方式——安装程序要我“选择你想使用的命令行 PHP”,但我本地没有 PHP ... 恼人的是,我看到 PHPMailer 的 composer.json 文件已安装等待使用。 但是没有 PHPMailerAutoload.php(这是 Composer 创建的吗?)

所以我尝试手动安装 PHPMailer。我下载、解压缩和 FTP 将生成的目录上传到我的 webspace 文件夹中的 PHPMailer。然后我在我的 PHP 代码的头部和任何函数之外插入以下内容:

require_once 'PHPMailer/src/PHPMailer.php';
require_once 'PHPMailer/src/SMTP.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

使用“use”语句我得到一个语法错误unexpected 'use' (T_USE) ... 没有它们,我就试图实例化: $mail = 新的 PHPMailer; 但这失败了,找不到'class 'PHPMailer'

请问我做错了什么,我怎样才能做得更好?

【问题讨论】:

  • 如果您在本地安装 PHP,您的生活会轻松很多。拥有本地开发环境非常有用。

标签: php phpmailer


【解决方案1】:

这不是 PHPMailer 特有的——它是您使用任何使用命名空间的无数 PHP 包所需要做的。关于如何使用 use 的 PHP 文档是 here

简短的版本是,您需要将 namespaceuse 指令放在任何其他脚本之前,因此如果您只是颠倒命令的顺序,它应该可以工作:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require_once 'PHPMailer/src/PHPMailer.php';
require_once 'PHPMailer/src/SMTP.php';

顺便说一下,这是 PHPMailer 自述文件中的示例和 PHPMailer 提供的所有其他示例中使用的顺序。您可能会发现the upgrade guide 也很有用。

PHPMailerAutoload.php 文件不再存在 - composer 的自动加载器做得更好。 PHPMailer 自己的composer.json 文件是用来解析依赖和标记你的应用程序自己的composer 文件的兼容性要求,也就是说,它是用来告诉你项目的composer 文件如何使用PHPMailer——但不是你项目的composer 文件本身——你的每个包load 会有自己的。

在没有本地 PHP 实例的情况下进行开发是一项艰巨的工作——在您的实时服务器上进行开发,容我们说,“令人沮丧”!如果您不能直接安装 PHP,请使用 Docker、VirtualBox 或完全自包含的 XAMPP 之类的东西在容器或 VM 中运行它。

【讨论】:

  • 颠倒 'use' 和 'require' 的顺序并没有什么区别,但是将两者都移到脚本的头部是有效的 - 非常感谢。查看“使用”的文档,我仍然不清楚为什么会这样,因为除了它们在任何函数之外(并且假设在其中定义的任何类名的实例化之前)没有先决条件定位。
  • 我没想到您还没有将它们放在脚本的开头。
  • PHPMailer\PHPMailer\PHPMailer 的废话完美运行!使用thanks\thanks\thanks。
  • 在 laravel 项目中我应该在哪里解压我的 phpmailer
  • 如果你在没有作曲家的情况下使用 Laravel,你就做错了。您不必在任何地方解压缩它 - 只需将依赖项添加到您的 composer.json 文件中,composer 就会为您处理它。
【解决方案2】:

在 6.02 版中,每个 phpmailer 模块都包含命名空间 PHPMailer\PHPMailer 声明,因此以下工作(不需要自动加载器,但此例程应位于 /src 文件夹中):

include($_SERVER['DOCUMENT_ROOT'].'/path_setup.php');
require_once ($_SERVER['DOCUMENT_ROOT'].'/php/PHPMailer/src/PHPMailer.php');
require_once ($_SERVER['DOCUMENT_ROOT'].'/php/PHPMailer/src/SMTP.php');
require_once ($_SERVER['DOCUMENT_ROOT'].'/php/PHPMailer/src/Exception.php');
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$mail = new PHPMailer(true);

【讨论】:

  • 我损失了 12 个小时。真的 PHPMailer 需要文件夹 'PHPMailer/src/'
  • 不要忘记将 /PHPMailer 和 /PHPMailer/src 添加到您的路径中。
【解决方案3】:

修改你require,并尝试像PHPMailer的wiki所说的那样设置:

<?php
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;

Link of wiki

【讨论】:

  • 我认为 PHPMailer 6.0.1 中不再存在 PHPMailerAutoload.php
  • 确实没有。
  • 对不起,我没有看到他的版本。我使用的是 6.0 之前的版本。
【解决方案4】:

没有作曲家是不行的......

警告:require(src/Exception.php):打开流失败:第 5 行的 C:\xampp\htdocs\test\test.php 中没有这样的文件或目录

致命错误:require(): Failed opening required 'src/Exception.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\testtest\test.php on line 5

【讨论】:

  • 这个答案与问题无关
【解决方案5】:

首先创建一个文件夹src并创建Exception.php,PHPMailer.php,SMTP.php Liber's然后我们得到结果

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'src/Exception.php';
require 'src/PHPMailer.php';
require 'src/SMTP.php';

$mail = new PHPMailer;
$mail->isSMTP(); 
$mail->SMTPDebug = 2; // 0 = off (for production use) - 1 = client messages - 2 = client and server messages
$mail->Host = "smtp.gmail.com"; // use $mail->Host = gethostbyname('smtp.gmail.com'); // if your network does not support SMTP over IPv6
$mail->Port = 587; // TLS only
$mail->SMTPSecure = 'tls'; // ssl is depracated
$mail->SMTPAuth = true;
$mail->Username = '@gmail.com';
$mail->Password = '';
$mail->setFrom('@gmail.com', '...');
$mail->addReplyTo('@gmail.com', ' Name');
$mail->addAddress('@gmail.com', '...');
$mail->Subject = 'PHPMailer GMail SMTP test';
$mail->msgHTML("Hello test SMTP body"); //$mail->msgHTML(file_get_contents('contents.html'), __DIR__); //Read an HTML message body from an external file, convert referenced images to embedded,
$mail->AltBody = 'HTML messaging not supported';
// $mail->addAttachment('images/phpmailer_mini.png'); //Attach an image file

if(!$mail->send()){
    echo "Mailer Error: " . $mail->ErrorInfo;
}else{
    echo "Message sent!";
}
?>*strong text*

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2015-05-16
    • 2015-01-18
    • 1970-01-01
    • 2018-09-10
    • 2014-06-28
    • 2019-09-12
    相关资源
    最近更新 更多