如何使用Gmail SMTP服务器正确设置PHPMailer


How do I properly set up PHPMailer with Gmail SMTP Servers?

我有一个表单,它基本上有3个单选按钮,可以让你选择你想联系的员工。该表格需要姓名、电子邮件和信息。我找不到它告诉我错误是什么。我正在调试,但不知道错误是从哪里来的。

我的目标是拥有它,这样他们选择的人就会收到电子邮件,当电子邮件发送时,它会被重定向到一个有正确员工信息的页面。然而,就我而言,我无法让它发挥作用。我相信一切都是正确的,但当我插入我在SO上找到的代码以连接到SMTP服务器并通过电子邮件发送联系人表单时,我的formProcess.php中断了。

编辑:在在座各位的帮助下,我找到了解决我遇到的两个错误的方法。然而,现在我已经修复了这些错误,我得到了一个不同的错误。我现在收到这个:

2015-12-23 04:42:59 SMTP错误:无法连接到服务器:无法分配内存(12)2015-12-23 104:42:59 SMTPconnect()失败。https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting2015-12-23 04:42:59 SMTP错误:无法连接到服务器:无法分配内存(12)2015-12-23 04:42:59 SMTP connect()失败。https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

警告:无法修改标头信息-标头已由(输出起始于/www/contact/phpmailer/class.smtp.php:234)在/www/connect/formProcess.php第80行发送

编辑2:我已将其上传到我的托管服务器。它解决了上述错误。我现在遇到了密码失败的问题,尽管我已经使用代码中使用的密码登录。你可以在我的网站上看到它,而不是复制/粘贴错误消息。

第3版:我刚刚注意到Gmail发来了一封电子邮件,上面写着"有人试图从不符合标准安全标准的应用程序登录你的谷歌帐户。"这不可能是巧合吧?这就是我无法连接的原因吗?如果是,我该怎么做才能达到安全标准?

第4版:除了两件事,我现在一切都很好。1,出于某种原因,它发送了两次电子邮件。我不知道为什么,但我觉得我能弄清楚。我现在遇到的真正问题是,我现在想把谷歌的reCAPTCHA也包括在我的表单中。一切都很好,直到我添加了这段代码,我认为这段代码可以验证reCAPTCHA是否成功,是否只是在我的代码中添加了一个错误,而是在我输入下面的代码之后,我的代码中断了。

$curl = curl_init(); 
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => [
       'secret'=>'Well it says secret for a reason!',
       'response'=> $_POST['g-recaptcha-response']
    ]
]);
$response = json_decode(curl_exec($curl));
if (!$response->success){
    $errors[] = 'There was a problem with reCAPTCHA, please try again.';
};

下面是处理表单的所有代码。

<?php
session_start();
ini_set('display_errors', 1); error_reporting(E_ALL);
require_once 'PHPMailerAutoload.php';
$errors = [];
$toWho ='';
if(isset($_POST['name'], $_POST['email'], $_POST['message'],     $_POST['who'])){
$fields = [
  'name' => $_POST['name'],  
  'email' => $_POST['email'],  
  'message' => $_POST['message'],
  'who' => $_POST['who']
];
foreach($fields as $field => $data) {
    if(empty($data)) {
        $errors[] ='The ' .$field. ' field is required.';
    }
}
    if ($fields['who'] ==  "staff1") {
    $toWho = 'staff1@domain.com';
} else if ($fields['who'] == "staff2")  {
    $toWho = 'staff2@domain.com';
} else {
    $toWho = 'staff3@domain.com';
}



$curl = curl_init(); 
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => [
       'secret'=>'Well it says secret for a reason!',
       'response'=> $_POST['g-recaptcha-response']
    ]
]);
$response = json_decode(curl_exec($curl));
if (!$response->success){
    $errors[] = 'There was a problem with reCAPTCHA, please try again.';
};




if(empty($errors)) {
    $mail = new PHPMailer;

    $mail->isSMTP();
    $mail->SMTPAuth = true;
    $mail->smtpSecure = 'tls';
    $mail->Port = 587;
//        $mail->SMTPDebug = 3;
    $mail->Host = 'mailen3.cloudsector.net';
    $mail->From = "No-reply@domain.com";
    $mail->Username = 'No-Reply@domain.com';
    $mail->Password = 'PAsswoRD';
    $mail->SetFrom("No-reply@domain.com", "No Reply" );
    $mail->AddReplyTo($fields['email'], $fields['name']);
    $mail->AddAddress($toWho, $fields['who']);
    $mail->Subject    = $fields['name'] . ' wants to talk!';
    $mail->Body       = 'From: ' .$fields['name']. ' (' .$fields['email']. ') ' .$fields['message']. ;


    $mail->send();

    if($mail->send()) {
        header('Location: ../../' .$fields['who']. 'thanks.php');
        die();
    }else {
        $errors[] = 'Sorry! Something went wrong and your message could not be sent. Please try again ';
    }

}

} else {
     $errors[] = 'Something went wrong.';
 }
 $_SESSION['errors'] = $errors;
 $_SESSION['fields'] = $fields;
 header('Location: index.php');
 ?>

尝试在脚本顶部添加以下代码来显示错误:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

如果您收到服务器错误500,请尝试注释掉小块代码,直到脚本工作为止。这样你就可以发现问题了。