Подключение Zapier с помощью PHPMailer Script - PullRequest
0 голосов
/ 21 мая 2019

Я использую Zapier для сбора потенциальных клиентов с Facebook, а затем отправляю их на мой CRM. У меня есть сценарий, связанный с моей CRM, который должен обрабатывать лиды. для каждого нового отведения скрипт сработает, скрипт собирает данные, переданные из Zapier, преобразует их в XML и отправляет моему клиенту.

Все работает, кроме одной вещи. PHPMailer, кажется, вызывает проблемы с zapier, потому что всякий раз, когда включена функция email (), Zapier выдаст мне ошибку.

FYI - это работает, когда я захожу в URL скрипта и устанавливаю параметры GET вручную. XML отправляется. Но при запуске скрипта из zapier возникает проблема.

Ошибка Zapier: "У нас были проблемы с отправкой вашего теста до конца. Приложение вернуло «Внутренняя ошибка сервера» без дополнительной информации. Похоже, сервер подключенного приложения не работает или в настоящее время возникают проблемы. Пожалуйста, проверьте страницу состояния приложения или свяжитесь со службой поддержки, если нет проблем, о которых сообщают. "

<?php
$firstName = isset($_GET['firstName']) ? $_GET['firstName'] : '';
$lastName = isset($_GET['lastName']) ? $_GET['lastName'] : '';
$fullName = isset($_GET['fullName']) ? $_GET['fullName'] : '';
$phone = isset($_GET['phone']) ? $_GET['phone'] : '';
$experience = isset($_GET['experience']) ? $_GET['experience'] : '';
$city = isset($_GET['city']) ? $_GET['city'] : '';
$email = isset($_GET['email']) ? $_GET['email'] : '';
$utm_source = isset($_GET['utm_source']) ? $_GET['utm_source'] : '';
$campaignId = isset($_GET['campaignId']) ? $_GET['campaignId'] : '';
$utm_medium = isset($_GET['utm_medium']) ? $_GET['utm_medium'] : '';



require 'vendor/autoload.php';
header('Content-Type: text/plain');

function createXML($data,$dataSource){
$dom = new DOMDocument('1.0', 'utf-8');
$cv = $dom->createElement("cv");
$candidate = $dom->createElement('candidate');
$source_type = $dom->createElement('source_type');

function recursive($dom, $parent, $key, $value) {

    if(is_array($value)) {
        $new_parent = $dom->createElement($key);

        foreach($value as $k => $v){
            recursive($dom, $new_parent, $k, $v);
        }

        $parent->appendChild($new_parent);
    } else {
        $field = $dom->createElement($key, htmlspecialchars($value));
        $parent->appendChild($field);
    }
}
foreach($dataSource as $key => $value){
    // api need COLUMN without end of _<number>
    if(preg_match('/COLUMN_([0-9]+)/', $key)) $key = 'COLUMN';
    recursive($dom, $source_type, $key, $value);
}
foreach($data as $key => $value){
    // api need COLUMN without end of _<number>
    if(preg_match('/COLUMN_([0-9]+)/', $key)) $key = 'COLUMN';
    recursive($dom, $candidate, $key, $value);
}

// $cv->appendChild($candidate)

$cv->appendChild($candidate);
$cv->appendChild($source_type);
$dom->appendChild($cv);
$node = $cv->appendChild($source_type);
$node->setAttribute('type','other');
$dom->formatOutput = true;

return $dom;
}




 $data = array(
    "first_name" => filter_var($firstName, FILTER_SANITIZE_STRING),
    "last_name"  => filter_var($lastName, FILTER_SANITIZE_STRING),
    "mobile"     => filter_var($phone, FILTER_SANITIZE_STRING),
    'email'      => '',
    'id'      => '',


);
$dataSource = array(
    "source_title"        => filter_var($utm_source, FILTER_SANITIZE_STRING),
    "first_name"          => '',
    "last_name"           => '',
    "mobile"           => '',
    "email"           => '',
    "employee_number" => '',
    "department"      => '',
    "email"           => '',
);



//problematic function
function email(){
    global $xmlData;
    $mail = new PHPMailer(true);   
    $mail->isHTML(false);
    $mail->isSMTP();
    $mail->setFrom('XML@gmail.com', 'Yashir CV Lead');

    $mail->addAddress("BinaryRx@gmail.com");        
    $mail->Subject = "Yashir CV Lead";
    $mail->Body = $xmlData;
    $today = date('d-m-Y H:i:s');
    $mail->send();
    echo "Report Sent - " . $today;
}

///////// IF I uncomment bellow,Zapier will give me the following error:
//We had trouble sending your test through.
//The app returned "Internal Server Error" with no further details. 
//It looks like the server for your connected app is down or currently experiencing problems.
//Please check the app's status page or contact support if there are no reported issues.

//Uncomment bellow.
// email();

?>

Я ожидаю, что каждый Лид отправит электронное письмо, содержащее XML.

1 Ответ

0 голосов
/ 21 мая 2019

Две ключевые проблемы. Во-первых, вы используете SMTP, но вы не установили Host на свой почтовый сервер - так что он не будет работать, если не будет localhost - так ли это?

Вы просите PHPMailer выдавать исключения (передавая true в конструктор), но у вас нет блока try / catch, обернутого вокруг вызовов PHPMailer, поэтому любые ошибки приведут к неперехваченным исключениям - что даст вам именно тот симптом, который вы видите. Попробуйте это:

function email()
{
    global $xmlData;
    $mail = new PHPMailer(true);
    try {
        $mail->isHTML(false);
        $mail->isSMTP();
        $mail->setFrom('XML@gmail.com', 'Yashir CV Lead');

        $mail->addAddress("BinaryRx@gmail.com");
        $mail->Subject = "Yashir CV Lead";
        $mail->Body = $xmlData;
        $today = date('d-m-Y H:i:s');
        $mail->send();
        echo "Report Sent - ".$today;
    } catch (Exception $e) {
        echo 'Sending failed'.$e->getMessage();
    }
}

В целом, главное отладить одну вещь за раз - проверить, что функция email() на самом деле работает независимо, прежде чем вы начнете пытаться делать вещи, которые зависят от ее работы, потому что иначе вы не будете знать, какой бит код не работает.

Если вы используете PHP 7.0 или более позднюю версию, вы можете упростить эти начальные проверки параметров, используя оператор null coalesce . Вы можете заменить это:

$firstName = isset($_GET['firstName']) ? $_GET['firstName'] : '';

с:

$firstName = $_GET['firstName'] ?? '';
...