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 ??
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? –
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. –
@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 ... –