CORS标头不能与PHPMailer一起使用

时间:2017-08-29 13:39:15

标签: php ajax email cors phpmailer

我正在制作一个必须集成在合作伙伴网页中的代码。简而言之,大多数(如果不是全部)文件都是从不同的域(其中一个伙伴)调用的,它们存储在那里(我的,托管在One.com上)。

我使用AJAX调用来检索各种代码并将请求发送到我的数据库。在每个文件的开头,我有<?php header("Access-Control-Allow-Origin: *");?>使我的服务器接受来回答来自合作伙伴域的呼叫。 (我还不知道这些域名,将来我可能会删除通配符。)

一切正常。但是......现在我想让代码通过用户提交的信息向合作伙伴网站的管理员发送邮件。为此,一个简单的表单呈现给用户,一旦他点击发送按钮,我使用jQuery来检索不同input的值,将它们推入一个数组并将其作为传递方式传递给用户通过data来电sendMail.phpAJAX个文件。

    $.ajax({
        url:$urlBase+'inscription/sendMail.php',
        type:'post',
        data:{'participant':elements,'formation':extra0,'location':'test'},
        success:function(){
            console.log('done');
        },
        error:function(jqXHR, textStatus, errorThrown) {
            alert('RetreiveIns : ' + textStatus + ' : ' + errorThrown);
        }
    });

sendMail.php file我使用PHPMailer通过SMTP发送电子邮件。我使用谷歌的smtp,因为我的域之一由于其DNS配置而无法使用(邮件被发送到MS Exchange服务器)。

<?php header("Access-Control-Allow-Origin: *");
include ('../init.php'); //$bdd est init ici !!!!
require '../PHPMailer-master/PHPMailerAutoload.php';

function convert_accent($string){
    return utf8_decode($string);
}

//echo (extension_loaded('openssl')?'SSL loaded':'SSL not loaded')."\n";
//var_dump($_POST['participant']);
//var_dump($_POST['formation']);

$titre="";
$titre=convert_accent("Title ".$_POST['formation'][0]['text'].".");
$message="";
$message=$message.convert_accent("Message : \n\n");
foreach($_POST['formation'] as $key => $value){
    $message=$message. convert_accent($value['label']) . convert_accent($value['text']) . "\n";
}
$message=$message.convert_accent("\nInformations :\n");
foreach($_POST['participant'] as $key => $value){
    $message=$message. convert_accent($value['label']) . convert_accent($value['text']) . "\n";
}
$message=$message.convert_accent("\nDetails.\n");
convert_accent($message);
//var_dump($message);

$mail = new PHPMailer;

//$mail->SMTPDebug = 3;                               // Enable verbose debug output

$mail->SMTPOptions = array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com';                        // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'myEmail';//@gmail.com';            // SMTP username
$mail->Password = 'ThePassword';                      // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587;                                    // TCP port to connect to

$mail->setFrom('myEmail@gmail.com', 'Server');
$mail->addAddress('myTestEmail@hotmail.com', 'Admin');

$mail->Subject = $titre;
$mail->Body    = $message;
$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';
}
?>

当我测试它并点击发送按钮时,我必须等待一段时间(我猜是暂停)并收到以下错误:

Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin »
ne permet pas de consulter la ressource distante située sur 
http://www.easy-pro.be/scripts/inscription/sendMail.php. Raison : 
l’en-tête CORS « Access-Control-Allow-Origin » est manquant.

我在互联网上搜索解决方案,但我找不到一个为我工作的人。

我尝试了这四个标题的任意组合:

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST");
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header("Access-Control-Allow-Credentials: true");

我尝试将通配符切换为我用来测试代码的页面的主机。

我尝试通过创建一个简单的PHP文件来解决方法,我将发布的数据放在$GLOBALS中,然后包含sendMail文件,希望它认为调用没有跨越域名 - 更多,我的服务器到我的服务器,但它没有改变。我读到使用cURL可能会有所作为,但我不知道如何使用它,我已经失去了太多心思,无法在研究过程中开始研究它。

<?php header("Access-Control-Allow-Origin: *");
$GLOBALS['formation']  = $_POST['formation'];
$GLOBALS['participant']  = $_POST['participant'];
$GLOBALS['hostLloaction']  = $_POST['location'];

include('sendMail.php');
?>

我不知道自己错过了什么,所以欢迎任何帮助。

修改: 我还尝试在AJAX调用中添加:crossDomain: true,,但它没有改变任何内容。

其他测试: 我尝试在PHPMailer的.php文件的开头添加四个标题,但它没有改变任何内容。

另一方面,我在sendMail.php中输入了错误,并意识到我没有再犯过CORS错误。所以我修正了错误并评论了以下几行:

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

一切都没有错误。当然,由于显而易见的原因,没有发送邮件。

有什么想法吗?

0 个答案:

没有答案