2016-04-23 23 views
1

Ich versuche eine JavaScript-App zu erstellen, die die Google Mail-API verwendet, um E-Mails (an mich selbst) zu senden, einschließlich der strukturierten Daten, die für den Google Mail-Posteingang benötigt werden, um eine Hotelreservierung zu erkennen. Ziel ist es, Details zur Reservierung in einem HTML-Formular eingeben zu können und die App schickt mir eine E-Mail als Inbox, erkennt dann als Hotelreservierung und fügt ein Trip-Bündel meinem Posteingang hinzu.Wie senden Sie eine strukturierte E-Mail-Markup mit Gmail API und Javascript?

Ich folgte einem Beispiel, here, das Google Apps Scripts verwendet, um E-Mails von meinem Konto an mich selbst zu senden. Das Skript zieht den Körper aus einer Datei als HTML, einschließlich der notwendigen strukturierten Daten im JSON-Format. Dies funktioniert einwandfrei, und Inbox erkennt die Hotelreservierung.

Hier ist der Apps Script-Code:

function manuallyCreateTrips() { 
    var htmlBody = HtmlService.createHtmlOutputFromFile('hotel').getContent(); 

    MailApp.sendEmail({ 
    to: Session.getActiveUser().getEmail(), 
    subject: 'Somewhere ' + new Date(), 
    htmlBody: htmlBody, 
    }); 
} 

Und hier ist der HTML-Inhalt der E-Mail (hotel de.html):

<html> 
    <body> 
    <script type="application/ld+json"> 
{ 
    "@context": "http://schema.org", 
    "@type": "LodgingReservation", 
    "reservationNumber": "None", 
    "reservationStatus": "http://schema.org/Confirmed", 
    "underName": { 
    "@type": "Person", 
    "name": "Richard Guy" 
    }, 
    "reservationFor": { 
    "@type": "LodgingBusiness", 
    "name": "Somewhere", 
    "address": { 
     "@type": "PostalAddress", 
     "streetAddress": "Street", 
     "addressLocality": "Locality", 
     "addressRegion": "Region", 
     "postalCode": "Postcode", 
     "addressCountry": "UK" 
    }, 
    "telephone": "+44 1234 123123" 
    }, 
    "checkinDate": "2016-04-27T13:00:00+01:00", 
    "checkoutDate": "2016-04-28T12:00:00+01:00" 
} 
</script> 


    <p> 
     This is a hotel reservation at Somewhere. 
    </p> 
    </body> 
</html> 

Aber anstatt die JSON manuell eingeben, würde Ich mag um eine schönere Schnittstelle zu haben. Also habe ich mit dem Erstellen eines einfachen E-Mail-Clients in Javascript unter Verwendung der Gmail-API begonnen, indem ich dem bearbeiteten Beispiel here folgte. Der Client arbeitet mit OK, um E-Mails zu senden, die ich dann in meinem Google Mail-Konto erhalte.

Hier sind die Funktionen, die die E-Mail zusammenstellen und senden:

function sendEmail() 
{ 
    $('#send-button').addClass('disabled'); 

    sendMessage(
    { 
     'To': $('#compose-to').val(), 
     'Subject': $('#compose-subject').val(), 
     'Content-Type': 'text/html; charset=utf-8', 
    }, 
    $('#compose-message').val(), 
    composeTidy 
); 

    return false; 
} 

function sendMessage(headers_obj, message, callback) 
{ 
    var email = ''; 

    for(var header in headers_obj) 
    email += header += ": "+headers_obj[header]+"\r\n"; 

    email += "\r\n" + message; 

    var sendRequest = gapi.client.gmail.users.messages.send({ 
    'userId': 'me', 
    'resource': { 
     'raw': window.btoa(email).replace(/\+/g, '-').replace(/\//g, '_') 
    } 
    }); 

    return sendRequest.execute(callback); 
} 

Die Funktion sendemail() ruft nachrichts(), um ein Objekt mit den Kopfzeilen vorbei, eine Zeichenfolge, die (im HTML-Format) Inhalt enthält, die E-Mail und eine Rückruffunktion, um danach aufzuräumen. sendMessage() kombiniert die Header mit dem Inhalt und codiert das Los als base64. Ich sende den gleichen HTML-Inhalt der E-Mail wie zuvor und die E-Mail kommt in meinem Posteingang an. Jede HTML-Formatierung im Nachrichtentext wird in meinem E-Mail-Viewer korrekt angezeigt. Der Gmail-Posteingang scheint die strukturierten Daten jedoch nicht zu erfassen. Daher wird die Reservierung nicht zu einer neuen Reise hinzugefügt.

Wenn ich die Quelle der zwei E-Mails vergleiche, kann ich signifikante Unterschiede in den Headern sehen.

Dies war die erfolgreiche E-Mail:

Delivered-To: [email protected] 
Received: by 10.79.103.71 with SMTP id b68csp826548ivc; 
     Fri, 22 Apr 2016 09:09:32 -0700 (PDT) 
X-Received: by 10.60.21.33 with SMTP id s1mr8900353oee.74.1461341372514; 
     Fri, 22 Apr 2016 09:09:32 -0700 (PDT) 
Return-Path: <[email protected]nces.google.com> 
Received: from mail-ob0-x248.google.com (mail-ob0-x248.google.com. [2607:f8b0:4003:c01::248]) 
     by mx.google.com with ESMTPS id b134si2357523oih.30.2016.04.22.09.09.32 
     for <[email protected]> 
     (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); 
     Fri, 22 Apr 2016 09:09:32 -0700 (PDT) 
Received-SPF: pass (google.com: domain of [email protected]nces.google.com designates 2607:f8b0:4003:c01::248 as permitted sender) client-ip=2607:f8b0:4003:c01::248; 
Authentication-Results: mx.google.com; 
     dkim=pass [email protected]; 
     spf=pass (google.com: domain of [email protected]nces.google.com designates 2607:f8b0:4003:c01::248 as permitted sender) smt[email protected]maestro.bounces.google.com; 
     dmarc=pass (p=NONE dis=NONE) header.from=gmail.com 
Received: by mail-ob0-x248.google.com with SMTP id js7so145982383obc.0 
     for <[email protected]>; Fri, 22 Apr 2016 09:09:32 -0700 (PDT) 
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; 
     d=gmail.com; s=20120113; 
     h=mime-version:message-id:date:subject:from:to; 
     bh=L6yElux8juWH24FvYKyFSYm7hSo/j0YatA7rHQ62QZ4=; 
     b=iUcZ/k5ctSENTTcliXUd1jyE8FnHigru+fx97U26V4ppudjHaWF5tgTXhHD9di+qu3 
     dCTG/5uXRDZq/9lXox+zLGn1CUJv8otDjzyu4zQQzMCgFWkrlPvzauPCxmWMeqKBpsEN 
     sbipWbMvTPMSLbUkzWNmC7aDqHEQffdlTu69+oEidkxBVGYYGHO6XWBNT78O9owYLUXD 
     +7KzpEwciGDmdXkN+bFf9kFXsIapq7kHja3o3Y56Xz/lEeZDOYfOF211IhQ/ALWKEzpe 
     uL3iOu1GItLVC6oUVt46d8qYxHfNtP0qmQXzNjuL4YC/XuFeR6eJQ8mXBj8pM8YkIfst 
     1GYg== 
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; 
     d=1e100.net; s=20130820; 
     h=x-gm-message-state:mime-version:message-id:date:subject:from:to; 
     bh=L6yElux8juWH24FvYKyFSYm7hSo/j0YatA7rHQ62QZ4=; 
     b=QOSVkBTnwapvWbnMDhcvjyvrS84JL0QsG2vbckfUMLpFgjNcA5uw0QxZYRBLgYEjkT 
     r3IvezvZqgtXES6QU6XUBnZQ8h7sVhgKGvB5t/b4BZbKbnkImGAhIhSQDqFtlY0+ZgqS 
     GcuWs1eacvCKMfi5RKLvH6O1Bn63gEfdYtz3EjwfZdle1lvg9WvU3GSWt8G2Hw/Bb8Z2 
     sYo3Ok4jwLFgdguCsJG8CK6eUKwAdLvgmrfU1oh0UJVDVGbWallEsVJPXW/iqAYvgOVr 
     0BFsTMxKheruSLeKgx5PbUYYfOul8mLbYZz/NkLxU+hHuUd+zVvIvIPmidK+0CvMyGUB 
     YFeA== 
X-Gm-Message-State: AOPr4FVRMkINNmOkf3rYdLZspc+99SeliqYmKfw/6w4zvXITcXqVY/CP1fJO86bNJRLEPwl2jO4UMroedpRj6A== 
MIME-Version: 1.0 
X-Received: by 10.182.250.201 with SMTP id ze9mr14627612obc.0.1461341372044; 
Fri, 22 Apr 2016 09:09:32 -0700 (PDT) 
Message-ID: <[email protected]> 
Date: Fri, 22 Apr 2016 16:09:32 +0000 
Subject: Somewhere Fri Apr 22 2016 17:09:31 GMT+0100 (BST) 
From: [email protected] 
To: [email protected] 
Content-Type: multipart/alternative; boundary=001a11c1fabe608d370531150d89 

--001a11c1fabe608d370531150d89 
Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes 

Somewhere 

--001a11c1fabe608d370531150d89 
Content-Type: text/html; charset=ISO-8859-1 

<html> 
    <body> 
    <script type="application/ld+json"> 
{ 
    "@context": "http://schema.org", 
    "@type": "LodgingReservation", 
    "reservationNumber": "None", 
    "reservationStatus": "http://schema.org/Confirmed", 
    "underName": { 
    "@type": "Person", 
    "name": "Richard Guy" 
    }, 
    "reservationFor": { 
    "@type": "LodgingBusiness", 
    "name": "Somewhere, 
    "address": { 
     "@type": "PostalAddress", 
     "streetAddress": "Address", 
     "addressLocality": "Locality", 
     "addressRegion": "Region", 
     "postalCode": "Postcode", 
     "addressCountry": "Country" 
    }, 
    "telephone": "+12 1234 606630" 
    }, 
    "checkinDate": "2016-04-23T13:00:00+01:00", 
    "checkoutDate": "2016-04-24T12:00:00+01:00" 
} 
</script> 


    <p> 
     Somewhere 
    </p> 
    </body> 
</html> 
--001a11c1fabe608d370531150d89-- 

Und hier ist die E-Mail von dem Javascript-App mit der API von Google Mail gesendet:

Received: from 760084270114 
    named unknown 
    by gmailapi.google.com 
    with HTTPREST; 
    Sat, 23 Apr 2016 09:43:29 -0400 
To: [email protected] 
Subject: Test reservation 
Content-Type: text/html; charset=utf-8 
Date: Sat, 23 Apr 2016 09:43:29 -0400 
Message-Id: <[email protected]om> 
From: [email protected] 

<html> 
    <body> 
    <script type="application/ld+json"> 
{ 
    "@context": "http://schema.org", 
    "@type": "LodgingReservation", 
    "reservationNumber": "None", 
    "reservationStatus": "http://schema.org/Confirmed", 
    "underName": { 
    "@type": "Person", 
    "name": "Richard Guy" 
    }, 
    "reservationFor": { 
    "@type": "LodgingBusiness", 
    "name": "Somewhere, 
    "address": { 
     "@type": "PostalAddress", 
     "streetAddress": "Address, 
     "addressLocality": "Locality", 
     "addressRegion": "Region", 
     "postalCode": "Postcode", 
     "addressCountry": "UK" 
    }, 
    "telephone": "+12 3456 606630" 
    }, 
    "checkinDate": "2016-04-23T13:00:00+01:00", 
    "checkoutDate": "2016-04-24T12:00:00+01:00" 
} 
</script> 


    <p> 
     Somewhere 
    </p> 
    </body> 
</html> 

Irgendwelche Ideen ??

+0

Wenn man sich die Header anschaut, sagt der Arbeiter "charset = ISO-8859-1", während derjenige, den man in den nicht arbeitenden einfügt, utf8 ist. Macht Veränderung einen Unterschied? –

+0

Leider nicht. Ich vermute, das Problem ist, dass der Posteingang strukturierte Daten ignoriert [es sei denn, die E-Mail wird mit DKIM authentifiziert] (https://developers.google.com/gmail/markup/actions/securing-actions). Ich kann nicht herausfinden, wie die Authentifizierung mithilfe der Google Mail-API aktiviert wird. In der Zwischenzeit als Apps Script-Funktion 'MailApp.sendEmail() 'sendet authentifizierte E-Mails. Ich werde Google Forms oder Google Tabellen verwenden, um die Eingabedaten zu erhalten, und ein Apps-Skript zum Senden der E-Mail verwenden. –

+0

@frederik: Danke. Ich habe daran gearbeitet, indem ich die Daten in ein Google-Tabellen-Dokument eingegeben und ein Apps-Skript verwendet habe, um die Daten herauszuziehen, den HTML-Text für die E-Mail zu erstellen und sie mit MailApp.sendEmail() zu senden. Die Oberfläche ist nicht schön, aber es war nicht schwierig, dem Blatt eine Schaltfläche "Create Trip" hinzuzufügen. Inbox erkennt dies korrekt als eine Reise, solange der Inhalt richtig strukturiert ist. Immer noch neugierig zu wissen, ob ich das mit der Gmail-API hätte tun können ... –

Antwort

0

Am Ende fand ich es ziemlich einfach, ein einigermaßen poliertes Front-End-Formular mit clientseitigem JavaScript und Bootstrap-Styling in einer Google Apps Script (GAS) -Web-App zu implementieren. Serverseitige Funktionen behandeln das Senden der E-Mail mit den eingebetteten strukturierten Daten. Da die Funktion MailApp.sendEmail() von GAS E-Mails digital signiert, war dies erfolgreich. Ich habe den resultierenden Code auf GitHub gelegt und die Web-App here veröffentlicht. Danke für die Vorschläge!