title: I got error Recipient address required with Gmail API
body: <p>I want to send an email with Gmail API.  </p>
  
  <p>Document say Gmail API require RFC2822 formatted and base64 encoded string.<br>
  So I write email contents and pass it to raw property.<br>
  But I got error: <code>Recipient address required.</code>  </p>
  
  <p>How can I fix this?  </p>
  
  <p>Here is my code.</p>
  
  <pre class="lang-js prettyprint-override"><code>const fs = require('fs');
  const readline = require('readline');
  const {google} = require('googleapis');
  
  // If modifying these scopes, delete token.json.
  const SCOPES = ['https://www.googleapis.com/auth/gmail.send'];
  // The file token.json stores the user's access and refresh tokens, and is
  // created automatically when the authorization flow completes for the first
  // time.
  const TOKEN_PATH = 'token.json';
  
  // Load client secrets from a local file.
  fs.readFile('credentials.json', (err, content) =&gt; {
    if (err) return console.log('Error loading client secret file:', err);
    // Authorize a client with credentials, then call the Gmail API.
    authorize(JSON.parse(content), sendGmail);
  });
  
  /**
   * Create an OAuth2 client with the given credentials, and then execute the
   * given callback function.
   * @param {Object} credentials The authorization client credentials.
   * @param {function} callback The callback to call with the authorized client.
   */
  function authorize(credentials, callback) {
    const {client_secret, client_id, redirect_uris} = credentials.installed;
    const oAuth2Client = new google.auth.OAuth2(
        client_id, client_secret, redirect_uris[0]);
  
    // Check if we have previously stored a token.
    fs.readFile(TOKEN_PATH, (err, token) =&gt; {
      if (err) return getNewToken(oAuth2Client, callback);
      oAuth2Client.setCredentials(JSON.parse(token));
      callback(oAuth2Client);
    });
  }
  
  /**
   * Get and store new token after prompting for user authorization, and then
   * execute the given callback with the authorized OAuth2 client.
   * @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
   * @param {getEventsCallback} callback The callback for the authorized client.
   */
  function getNewToken(oAuth2Client, callback) {
    const authUrl = oAuth2Client.generateAuthUrl({
      access_type: 'offline',
      scope: SCOPES,
    });
    console.log('Authorize this app by visiting this url:', authUrl);
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    rl.question('Enter the code from that page here: ', (code) =&gt; {
      rl.close();
      oAuth2Client.getToken(code, (err, token) =&gt; {
        if (err) return console.error('Error retrieving access token', err);
        oAuth2Client.setCredentials(token);
        // Store the token to disk for later program executions
        fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) =&gt; {
          if (err) return console.error(err);
          console.log('Token stored to', TOKEN_PATH);
        });
        callback(oAuth2Client);
      });
    });
  }
  
  function sendGmail(auth){
    const makeBody = (params) =&gt; {
        params.subject = new Buffer.from(params.subject).toString("base64");
        const str = [
            'Content-Type: text/plain; charset=\"UTF-8\"\n',
            'MINE-Version: 1.0\n',
            'Content-Transfer-Encoding: 7bit\n',
            `to: ${params.to} \n`,
            `from: ${params.from} \n`,
            `subject: =?UTF-8?B?${params.subject}?= \n\n`,
            params.message
        ].join(' ');
        return new Buffer.from(str).toString('base64').replace(/\+/g,'-').replace(/\//g,'_');
    }
  
    const messageBody = `
    this is a test message
    `;
  
    const raw = makeBody({
        to : 'foo@gmail.com',
        from : 'foo@gmail.com',
        subject : 'test title',
        message:messageBody
    });
  jj
  
    const gmail = google.gmail({version:'v1',auth:auth});
    gmail.users.messages.send({
        userId:"me",
        resource:{
            raw:raw
        }
    }).then(res =&gt; {
      console.log(res);
    });
  }
  </code></pre>
  
  <p>resulr:</p>
  
  <pre><code>Error: Recipient address required
  </code></pre>
  
  <p>edit :  show whole code. This code still get the same error.  </p>
  
  <p>This is almost Google's sample and I think bug is in my code.<br>
  I add sendGnail method and edit <code>authorize(JSON.parse(content), listLabels);</code> to <code>authorize(JSON.parse(content), sendGmail);</code> ,change SCOPES ,and delete listLabels method.<br>
  (listLabels method worked fine.)<br>
  After execute listLabels method, I change SCOPES and re-create token.json.<br>
  After get Labels, I change </p>
  
  <p>Here is sample
  <a href="https://developers.google.com/gmail/api/quickstart/nodejs?hl=ja" rel="nofollow noreferrer">https://developers.google.com/gmail/api/quickstart/nodejs?hl=ja</a></p>