2016-12-20 4 views
1

J'essaye les apis de gmail. J'ai fait l'auth. Maintenant, je veux créer un brouillon. Mais je reçois cette erreurJS convertir la chaîne en rfc822

{ error: 
I20161220-15:53:43.486(4)?  { errors: [Object], 
I20161220-15:53:43.487(4)?   code: 400, 
I20161220-15:53:43.488(4)?   message: 'Media type \'application/octet-stream\' is not supported. Valid media types: [message/rfc822]' } } } 

Les API Gmail nécessitent une chaîne base64 avec la norme rfc822. Je ne suis pas sûr d'un bon moyen de convertir une chaîne en rfc822. Comment je fais ça? J'utilise météore pour mon application et voici mon code.

import { Meteor } from 'meteor/meteor' 
import { HTTP } from 'meteor/http' 

Meteor.startup(() => { 
    // Meteor.call('createDraft') 


    Meteor.methods({ 
    'createDraft': function() { 
     console.log(this.userId) 

     const user = Meteor.users.findOne(this.userId) 
     const email = user.services.google.email 
     console.log(email) 
     const token = user.services.google.accessToken 
     const dataObject = { 
     message: { 
      raw: CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse('dddd')) 
     }, 
     headers: { 
      Authorization: `Bearer ${token}` 
     } 
     } 
     HTTP.post(`https://www.googleapis.com/upload/gmail/v1/users/${email}/drafts`, dataObject, (error, result) => { 
     if (error) { 
      console.log('err', error) 
     } 
     if (result) { 
      console.log('res', result) 
     } 
     }) 
    } 
    }) 
}) 
+1

[RFC822] (https://www.ietf.org/rfc/rfc0822.txt) est le bon vieux protocole de messagerie depuis le début des années 1980. Ce que Gmail signifie (apparemment), c'est que vous devez composer un e-mail correctement formaté, avec des en-têtes appropriés et un corps valide. Il ne se plaint pas du format de vos chaînes. –

Répondre

0

J'ai juste besoin d'envoyer le type de contenu comme message/rfc822. Voici le code de travail. Notez que le message brut a un problème avec ts car le brouillon créé a un contenu vide. Mais le brouillon lui-même est créé avec succès.

import { Meteor } from 'meteor/meteor' 
import { HTTP } from 'meteor/http' 

Meteor.startup(() => { 
    // Meteor.call('createDraft') 

    Meteor.methods({ 
    'createDraft': function() { 
     console.log(this.userId) 
     // CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse('dddd')) 
     const user = Meteor.users.findOne(this.userId) 
     const email = user.services.google.email 
     console.log(email) 
     const token = user.services.google.accessToken 
     const rawMessage = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(
     'From: [email protected]\r\n' + 
     'To: [email protected]\r\n' + 
     'Subject: Subject Text\r\n\r\n' + 
     'The message text goes here' 
    )).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') 

     const dataObject = { 
     message: { 
      raw: rawMessage 
     }, 
     headers: { 
      'Content-Type': 'message/rfc822', 
      Authorization: `Bearer ${token}` 
     } 
     } 
     HTTP.post(`https://www.googleapis.com/upload/gmail/v1/users/${email}/drafts`, dataObject, (error, result) => { 
     if (error) { 
      console.log('err', error) 
     } 
     if (result) { 
      console.log('res', result) 
     } 
     }) 
    } 
    }) 
}) 
1

base64 encode le message et remplacer tous les + avec -, remplacer tous / avec _ et enlever le = arrière pour le rendre URL de sécurité:

const rawMessage = btoa(
    "From: [email protected]\r\n" + 
    "To: [email protected]\r\n" + 
    "Subject: Subject Text\r\n\r\n" + 

    "The message text goes here" 
).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') 

const dataObject = { 
    message: { 
    raw: rawMessage 
    }, 
    headers: { 
    'Content-Type': 'application/json', 
    Authorization: `Bearer ${token}` 
    } 
}; 
+0

Cela n'a pas fonctionné, cependant j'ai changé ''Content-Type' ':' application/json'' à '' Content-Type '': 'message/rfc822'' et cela a fonctionné. Je vous remercie. –