2016-11-02 2 views
4

SendGrid를 사용하여 맞춤 이메일을 보내려고합니다. 몸 전체는 각 메일에서 불과 3-4 일 - 워드 substitions의, 유사하다, 그래서 SendGrid이SendGrid Web API v3 각 수신자마다 다른 대체 값

  • 밥을 대체 사용의 생각 ([email protected]) "안녕 밥을 말하는 이메일을 얻어야한다, 가 lorem ipsum의는

환경이 provided PHP-Class 작곡가에 의해 설치 사용하여 CodeIgniter를 설치 안녕하세요 앨리스가 lorem ipsum의 "를"

  • 앨리스 ([email protected])라고 이메일을 얻어야한다. "

    문제가있는 함수 호출은 addSubstitution($key, $value)이며 오류 400 (잘못된 요청)이 발생합니다. 이 호출없이 요청을 제출하면 모든 것이 예상대로 작동합니다 (당연히 대체되지 않은 자리 표시 자 포함). 나는 깨끗한 202을 얻고있다, 전자 우편은 도착하고있다. SendMail에서 제공하는 오류 텍스트는 {"errors":[{"message":"Bad Request","field":null,"help":null}]}이며 많은 도움이되지 않습니다.

    대체 키에 값 배열을 추가 할 것을 고려했습니다. 이 코드는 thisthis 코드 (첫 번째 예제의 SMTP API를 사용하여 두 번째 코드가 무엇인지 명확히 알 수 없음)에서 복사되었지만 valueaddSubstitution 인 경우에만 문자열을 처리 할 수 ​​있습니다.

    분명해야 함 : 일반적인 접근 방식에서이 기능이 필요합니다. 내 문제는 인사말의 수신자 이름, 개인화 된 수신 거부 링크 등과 관련이 없습니다. "Sendgrid-Marketing-API를 사용하고 이전에 수신자를 업로드하십시오"와 같은 대답이 내 요구를 충족시키지 못하기 때문에이 힌트를 추가합니다. .

    내 PHP 스크립트 (라이트 버전) :

    // General 
    
    $sg = new \SendGrid('api_key'); 
    
    $recipients = array(
        array(
         'email' => '[email protected]', 
         'name' => 'Bob' 
        ), 
        array(
         'email' => '[email protected]', 
         'name' => 'Alice' 
        ) 
    ); 
    
    $mail = new \SendGrid\Mail(); 
    
    $from = new \SendGrid\Email('myname', '[email protected]'); 
    $mail->setFrom($from); 
    
    $mail->setSubject('New mail'); 
    
    $content = new \SendGrid\Content('text/plain', 'Hi -name-, lorem ipsum'); 
    $mail->addContent($content); 
    
    // Personalizations 
    $personalization = new \SendGrid\Personalization(); 
    
    $substitutions_name = array(); 
    
    foreach ($recipients as $recipient) { 
        $email = new \SendGrid\Email(null, $recipient['email']); 
        $personalization->addTo($email); 
        array_push($substitutions_name, $recipient['name']); 
    } 
    
    $personalization->addSubstitution('-name-', $substitutions_name); 
    
    $mail->addPersonalization($personalization); 
    
    $response = $sg->client->mail()->send()->post($mail); 
    

    내 접근 방식은 일반적으로 잘못인가? 내 요구를 충족시키는 SendGrid의 또 다른 유사한 기능이 있습니까?

    빠른 기능과 긴 기능의 루프에서 php mail()을 호출하지 않으므로 필요한 기능이있는 것으로 보이는 SMTP-API를 호출하는 것은 대안이 아닙니다.

    업데이트 : 내가 더 깊고 깊게 파고 들면서 내 솔루션이 완벽하게 작동해야합니다. This SO answer은 정확히 동일한 접근 방식을 사용합니다. 그러나 나는 아직도 400 오류가 발생하는 이유는 무엇입니까? 나머지 코드는 대체 부분이없는 간단한 시도로 작동합니다. 는 PHP 스크립트

    { 
        "from": { 
        "name": "myname", 
        "email": "[email protected]" 
        }, 
        "personalizations": [ 
        { 
         "to": [ 
         { 
          "email": "[email protected]" 
         }, 
         { 
          "email": "[email protected]" 
         } 
         ], 
         "substitutions": { 
         "-name-": [ 
          "Bob", 
          "Alice" 
         ] 
         } 
        } 
        ], 
        "subject": "New mail", 
        "content": [ 
        { 
         "type": "text/plain", 
         "value": "Hi -name-, lorem ipsum" 
        } 
        ] 
    } 
    

    업데이트의 결과 JSON : bwests answer이 따라 내 문제에 대한 솔루션 (테스트)이다 : 편집

    v3에서

    [...] 
    
    $content = new \SendGrid\Content('text/plain', 'Hi -name-, lorem ipsum'); 
    $mail->addContent($content); 
    
    foreach ($recipients as $recipient) { 
        $personalization = new \SendGrid\Personalization(); 
        $email = new \SendGrid\Email(null, $recipient['email']); 
        $personalization->addTo($email); 
        $personalization->addSubstitution('-name-', $recipient['name']); 
        $mail->addPersonalization($personalization); 
    } 
    
    $response = $sg->client->mail()->send()->post($mail); 
    
  • +0

    v3 또는 SMTP를 사용하고 있습니까? SMTP API 링크를 참조하고 있지만 v3에서 상황을 다르게 처리합니다. 이것을 시도하십시오 : https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html – bwest

    +0

    코드가 생성하는 JSON 페이로드를 게시 할 수 있습니까? – bwest

    +0

    @bwest Web API v3을 사용하고 있지만이 주제에 대한 문서 (각 수신자마다 다른 대체 값)는 SMTP-API 문서에서만 찾을 수 있으므로 내 링크에서 찾을 수 있습니다. Btw : 귀하의 링크도 마찬가지입니다. 결과 JSON을 제 질문에 첨부했습니다. –

    답변

    4

    , substitution 값은 배열 일 수 없습니다. 개념은 동일하지만 개인화는 레거시 SMTP API와 다릅니다.

    { 
        "from": { 
        "name": "myname", 
        "email": "[email protected]" 
        }, 
        "personalizations": [ 
        { 
         "to": [ 
         { 
          "email": "[email protected]" 
         } 
         ], 
         "substitutions": { 
         "-name-": "Alice" 
         } 
        }, 
        { 
         "to": [ 
         { 
          "email": "[email protected]" 
         } 
         ], 
         "substitutions": { 
         "-name-": "Bob" 
         } 
        }  
        ], 
        "subject": "New mail", 
        "content": [ 
        { 
         "type": "text/plain", 
         "value": "Hi -name-, lorem ipsum" 
        } 
        ] 
    } 
    

    이 변경 쉽게 하나의 개인 객체를보고 특정 이메일에 대한 모든 메타 데이터를 참조하고 오류를 줄일 수 있도록 하였다 :

    this example 당 페이로드는 같아야합니다 구조화 된 데이터를 사용하는 대신 배열 전반에 걸쳐 일관된 인덱스를 유지하려고하기 때문에 일반적이었습니다.

    +0

    두 가지 전자 메일이 아니라 다른 대체 전자 메일과 동일한 전자 메일에 대해 이야기하고 있다는 것을 이해하면 문서 섹션의 제목을 완전히 이해할 수 없습니다 (나는 기술적으로 그 결과가 있음을 알고 있습니다). 어쨌든, 그것은 doc 것 thats. 솔루션이 작동합니다. 감사합니다! 앞으로 Google 검색자를위한 최종 해결책으로 내 질문을 업데이트 할 것입니다. –

    +1

    그래, 나는 일반적인 사용 사례에 적합하지 않다고 동의한다. 문서 팀에 알리고 즉시 살펴 보겠습니다. – bwest