在没有 SMTP 身份验证的情况下使用 PHPMailer 发送电子邮件

Send email using PHPMailer without SMTP authentication

我不经常使用 PHP,但是当我这样做并且需要编写一个函数来发送电子邮件时,我只使用了 mail() 函数。我在共享托管服务上使用过它,而且我总是收到来自...嗯...不是帐户的电子邮件?机器人?它甚至没有电子邮件地址。

这就是我此刻想要实现的目标 - 无需真正连接到 SMTP 服务器或通过身份验证即可向我发送电子邮件。 PHPMailer 如何做到这一点?在我的情况下甚至有可能吗?如果你不知何故得到我的问题,这些电子邮件是怎么称呼的;那些...不是由...发送的...电子邮件帐户?

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer-master\src\Exception.php';
require 'PHPMailer-master\src\PHPMailer.php';
require 'PHPMailer-master\src\SMTP.php';

$mail = new PHPMailer();
                                            
$mail->FromName = "A random name";
$mail->addAddress("myemail@gmail.com", "Recepient Name");
$mail->isHTML(true);
$mail->Subject = "Subject is here";
$mail->Body = "Hello, <br>test body ";

if(!$mail->Send()) {
     echo "Mailer Error: " . $mail->ErrorInfo;
} else {
     echo "Message has been sent";
}
?>

这确实让我笑了......

不,电子邮件不能神奇地 spring 存在,但电子邮件用户帐户和地址之间不一定存在直接关联。

当您通过调用 mail() 从共享主机帐户发送邮件时,邮件服务器知道您发送的帐户,因此有时不需要身份验证。例如,这就是 GoDaddy 的运作方式。不幸的是,这种方法很容易被滥用,因为通常没有什么能阻止你 flat-out 谎报你是谁。这就是为什么此类服务通常 a) 糟糕且 b) 实际传递消息极其不可靠的原因。

如果您不指定“发件人”地址,服务器通常会根据它已有的信息来创建一个地址——通常是您的用户帐户名或用户名 运行 脚本 (例如 www-data),以及您所在服务器的主机名,通常类似于 randomnumber.hostingprovider.example.com。查看您之前发送的 headers 封邮件,您可能会看到类似的内容。

有时,此地址对于给定共享服务器上的所有用户来说都是相同的,因此您的交付声誉可能取决于其他人发送的内容,这很可能是垃圾邮件、网络钓鱼、恶意软件等。

这种模糊性对于可传递性来说非常糟糕,因此如果您在这样的系统上托管您的联系表,预计来自它的消息最终会进入垃圾邮件文件夹。

如果您使用 SMTP 通过“正确的”帐户发送邮件,您将获得更多的控制权和可靠性,但不幸的是,一些托管服务提供商(又是 GoDaddy)阻止出站 SMTP 并强制您使用他们的邮件服务器。这是一种说法,如果您想发送将被送达的电子邮件,请使用体面的托管服务提供商。

一旦您控制了您的发送,您就可以准确选择发送邮件的地址,受身份验证限制,包括 SPF、DKIM 和 DMARC,但那是另一回事了。

据我所知,这是可能的,并且每次都能正常工作。在去年,我发现我使用 mail() 函数发送的电子邮件会立即进入我的垃圾邮件箱(以及其他人的垃圾箱),造成极大的混乱。我升级到 PHPMailer 来解决这个问题,我从来没有将它设置为使用 SMTP 并且工作正常。

我的代码是:

$mail = new PHPMailer(true); 
$html = $email->get(); // This gets a standard HTML Template to use as the base of the e-mail.
$title = 'Title for Inside the HTML';
$subject = 'The E-mail Subject';
$html = str_replace('[title]',$title,$html); //Use this to replace the [title] element in my HTML Template with $title.
$html = str_replace('[date]',date("F j, Y g:i A"),$html); // Again, replaces [date] in the HTML Template with the current date and time.
$body = 'Hello My Good Friend,<br>This is just a simple <strong>HTML Message</strong><br><br>Thank you.';
$html = str_replace('[body]',$body,$html); //Add my HTML Message to the HTML Template.

try {
    //Recipients
    $mail->setFrom('noreply@example.com', 'My Organization');
    $mail->addAddress($row["email"], $row["fullname"]);     // Add a recipient
    
    //Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = $subject;
    $mail->Body    = $html;
    $mail->AltBody = strip_tags($html,'<br>');
            
    $mail->send();
                
    //Return Success Message
    $rMsg .= '<div class="alert alert-success">
                <strong>Success: </strong> We have e-mailed the warning.</div>';
} catch (Exception $e) {
        $rMsg .= '<div class="alert alert-danger">
                    <strong>Error: </strong> There was an error e-mailing the warning.</div>';
}