Ankündigung

Einklappen
Keine Ankündigung bisher.

PHPMailer verursacht CORS-Fehler

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHPMailer verursacht CORS-Fehler

    Hi,

    meine PHP-Script wird von einer anderen Domain aus aufgerufen, deshalb CORS. Soweit so gut, die Daten werden per POST verarbeitet und alles fehlerfrei. Sobald ich aber PHPMailer nutzen möchte, um die Daten per Mail zu senden, wirft mir das Script folgenden Fehler:

    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    Mein Script:

    PHP-Code:
    <?php
    if (!isset($_SERVER['HTTP_ORIGIN'])) {
        
    // This is not cross-domain request
        
    echo json_encode(array('status' => '[0] Ein Fehler ist aufgetreten.'));
        exit;
    }

    $wildcard        FALSE;    // Set $wildcard to TRUE if you do not plan to check or limit the domains
    $credentials    TRUE;        // Set $credentials to TRUE if expects credential requests (Cookies, Authentication, SSL certificates)
    $allowedOrigins    = array('https://my-first-domain');

    if (!
    in_array($_SERVER['HTTP_ORIGIN'], $allowedOrigins) && !$wildcard) {
        
    // Origin is not allowed
        
    header("Content-Type: application/json; charset=utf-8");
        echo 
    json_encode(array('status' => '[1] Ein Fehler ist aufgetreten.'));
        exit;
    }

    $origin $wildcard && !$credentials '*' $_SERVER['HTTP_ORIGIN'];

    header("Access-Control-Allow-Origin: " $origin);

    if (
    $credentials) {
        
    header("Access-Control-Allow-Credentials: true");
    }
        
    header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
        
    header("Access-Control-Allow-Headers: Origin");
        
    header('P3P: CP="CAO PSA OUR"'); // Makes IE to support cookies

    // Handling the Preflight
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        
    header("Content-Type: application/json; charset=utf-8");
        echo 
    json_encode(array('status' => '[2] Ein Fehler ist aufgetreten.'));    
        exit;
    }

    if(isset(
    $_POST['ContactEmail'])) {    
        
    // The FILTER_SANITIZE_STRING filter removes tags and remove or encode special characters from a string.
        
    $name         filter_var($_POST['ContactName'], FILTER_SANITIZE_STRING);
        
    $email         filter_var($_POST['ContactEmail'], FILTER_SANITIZE_STRING);


    require 
    'libs/PHPMailer/PHPMailerAutoload.php';

        .......

        if(
    $mail->send()) {
          
    $response "Erfolgreich übermittelt.";
        } else {
          
    $response "Deine E-Mail konnte leider nicht gesendet werden.";
        }

        
    header("Content-Type: application/json; charset=utf-8");
        echo 
    json_encode(array('status' => $response));
    } else {
        
    header("Content-Type: application/json; charset=utf-8");
        echo 
    json_encode(array('status' => '[3] Ein Fehler ist aufgetreten.'));    
        exit;
    }
    ?>
    My AJAX-Call

    Code:
    $.ajax({
    xhrFields: {
    withCredentials: true
    },
    type:     "POST",
    data:     formData,
    contentType:  false,
    cache:      false,
    processData:  false,
    url:      "http://my-second-domain/my-script.php"
    }).done(function(data) {
    console.log("done");
    })
    .fail(function(data) {
    console.log("Error");
    });
    Ich denke dass es an PHPMailer liegt, da wenn ich PHPMailerAutoload.php nicht einbinde und die Daten einfach so verarbeite (z.B. in eine Datei schreibe) dann klappt alles. Sobald ich require 'libs/PHPMailer/PHPMailerAutoload.php'; oder '$mail = new PHPMailer;' sage, kommt der Fehler: No 'Access-Control-Allow-Origin' header is present on the requested resource.

    Ich hoffe ihr könnt mir helfen
    Vg leinaD


  • #2
    Schon mal ins PHP Error-Log geschaut?

    Kommentar


    • #3
      ich würde sagen, das es ein vom User generierter Fehler sein muss, und die Message beschreibt die Ursache des Fehlers vollständig und klar genug für einen Programmierer-Verstand.
      Signaturrrrrrr

      Kommentar


      • #4
        Nach korrigierten Code-Tags ( s.o. ) sollte der Fehler auch ins Auge springen...
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche Tutorials

        Kommentar


        • #5
          Ich habe gerade gesehen, dass die Deklaration des Array falsch ist, das ist jedoch ein dummer Fehler beim Erstellen des POST gewesen.

          Code:
          $allowedOrigins    = array('https://my-first-domain'');
          sollte natürlich heißen:
          Code:
          $allowedOrigins    = array('https://my-first-domain');
          ist also nicht der Fehler.

          Und ja, es mag sicherlich ein klarer Denkfehler oder irgendwas dergleichen sein, jedoch sehe ich hier den Wald vor lauter Bäumen nicht. Sonst hätte ich mir diese Frage auch gespart

          Kommentar


          • #6
            Ich denke dass es an PHPMailer liegt, da wenn ich PHPMailerAutoload.php nicht einbinde und die Daten einfach so verarbeite (z.B. in eine Datei schreibe) dann klappt alles. Sobald ich require 'libs/PHPMailer/PHPMailerAutoload.php'; sage, kommt der Fehler.
            Soweit ich CORS verstanden habe, ist es egal, was Dein PHP Script macht (datei schreiben / mail versenden).

            Ich habe gerade gesehen, dass die Deklaration des Array falsch ist, das ist jedoch ein dummer Fehler beim Erstellen des POST gewesen.
            Kann passieren, aber bitte im Eingangspost ändern!!!

            Hier ein Link zu CORS:
            https://www.html5rocks.com/en/tutorials/cors/

            Kommentar


            • #7
              Sorry, habe es im Eingangspost geändert.

              Es sollte auch egal sein, deshalb verstehe ich nicht wieso in meinem PHP-Skript angeblich kein ''Access-Control-Allow-Origin"-Header vorhanden ist.

              Kommentar


              • #8
                Es macht sicher auch Sinn, sich erstmal nur mit den generierten Headern auseinanderzusetzen wie Sie verschickt werden.
                So wie das da steht ist mir das wesentlich zu unübersichtlich.

                Es lassen sich auch, nur um Fehler besser eingrenzen zu können, verschiedene Haeder statisch setzen, bei der Response, aber auch beim Request.

                Kommentar


                • #9
                  Wurde nach 3 Tagen jetzt schon ins PHP Error-Log geschaut? Wenn ein Header nicht gesendet werden kann, steht es da drin und auch der Grund dazu.

                  Kommentar


                  • #10
                    Das Script ist wohl von hier übernommen:
                    https://zinoui.com/blog/cross-domain-ajax-request

                    Wenn das Script stirbt, bevor der ''Access-Control-Allow-Origin"-Header gesetzt wird, wäre das eine Erklärung.
                    Zum Beispiel wenn die PHPMailer Lib vorher eingebunden wird und dabei ein Fehler auftritt. (Auch deshalb das Error Log prüfen!)
                    Läuft das Script incl. Mailversand denn, wenn es von der selben Domain aufgerufen wird?

                    Kommentar


                    • #11
                      Während ich auf die Logs gewartet hatte, habe ich auf die neuere Version des PHPMailer umgestellt. Unter Umständen lag es daran, denn nun läuft es.
                      Als weitere Änderung habe ich die requires nun an den Anfang gestellt.

                      Unterm Strrich, läuft es jetzt ... dankesehr

                      Kommentar

                      Lädt...
                      X