web-dev-qa-db-ja.com

「To:」メールアドレスをGmailからエクスポート

ここで同様の質問を見つけました: 受信したGmailメッセージから電子メールアドレスを取得する しかし、違いは「From:」ではなく「To:」アドレスが欲しいということです。

ドメインにキャッチオールメールアドレスがあります。私がそこに大量のスパムメールを受け取っていることを除いて、私のホストは、私が使ったすべてのもののために個々のメールアカウントをセットアップする必要があると私に言っています。私は自分が使ったドメイン名で何百ものユニークなメールを持っていますが、それらをすべてリストに入れる簡単な方法はありません。

GmailApp APIでこれを行う方法を見つけようとしています。以下のコードを試しましたが、探していたものがまったく得られませんでした。 Gmailアカウントで、*@mydomain.comなどのメールを受信したすべての一意/個別のメールアドレスを取得したい。

function getEmails() { 
  // http://stackoverflow.com/a/12029701/1536038  
  // get all messages      
  var eMails = GmailApp.getMessagesForThreads(
    GmailApp.search('after:2015/1/14 before:2016/3/12'))
      .reduce(function(a, b) {return a.concat(b);})
      .map(function(eMails) {
    return eMails.getTo() 
  });

  // sort and filter for unique entries  
  var aEmails = eMails.sort().filter(function(el,j,a)
    {if(j==a.indexOf(el))return 1;return 0});  

  // create 2D-array
  var aUnique = new Array();  
  for(var k in aEmails) {
    aUnique.Push([aEmails[k]]);
  }

  // add data to sheet
  SpreadsheetApp.getActiveSheet().getRange(1, 1, aUnique.length, 1)
    .setValues(aUnique);
} 

//////////////////以下の回答を得た後、このコードをページングで変更しました。しかし、ページングを何らかの形でループに組み込み、すべての一意の電子メールを1回のパスで取得できるようにすることで、さらに改善できます。

function GetAddresses ()
{
  // Get the active spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();  

  // Create / empty the target sheet
  var sheetName = "Pixeltrics Emails";
  var sheet = ss.getSheetByName (sheetName) || ss.insertSheet (sheetName, ss.getSheets().length);
  sheet.clear();

  // Get all messages in a nested array (threads -> messages)
  var addressesOnly = [];
  var messageData = [];

  var pageSize = 500;
  var startIndex = 500;
   // Get all messages for the current batch of threads
     var eMails = GmailApp.getMessagesForThreads(
       GmailApp.search('to:(@mydomain.com)',startIndex,pageSize))
       .reduce(function(a, b) {return a.concat(b);})
      .map(function(eMails) {
        var matched = eMails.getTo().match(/<[^@]*@mydoman\.com>/ig);
        return (matched ? matched : []);
      })
     .reduce(function(a, b) {return a.concat(b);});

 // lowercase, filter for unique entries, sort
  var aEmails = eMails.map(function(text) {return text.toLowerCase().slice(1, -1);})
                      .filter(function(el,j,a) {return j == a.indexOf(el)})
                      .sort();

  // create 2D-array
  aUnique = aEmails.map(function(el) {return [el];}); 

   // add data to sheet
  SpreadsheetApp.getActiveSheet().getRange(1, 1, aUnique.length, 1)
    .setValues(aUnique);
}
1
pixelwiz

メソッドgetToは、受信者の名前と電子メールアドレスを含む文字列を返します。アドレス、特に*@mydomain.comに一致するアドレスを抽出する必要があります。これは、以下の正規表現を使用して行われます。

var matched = eMails.getTo().match(/<[^@]*@mydomain\.com>/ig);

結果は配列またはヌルです。 nullを空の配列に置き換えてから、結果を再度フラット化します(concatで削減)。

さらに、重複を正しく見つけるために、すべてのアドレスが小文字になります。コマンドslice(1,-1)は、電子メールの周りの角かっこを取り除きます。次に、一意がフィルタリングされ、結果がソートされます。 (ソートする方が良いと思うafter重複を除外する:ソートするのにはるかに小さい配列。)

そして、この関数では.map.reduceがすべてなので、2D配列を作成するときに.mapも使用しました。

function getEmails() { 
  // modified from http://stackoverflow.com/a/12029701  
  // get all messages, extract matching addresses from To fields 
  var eMails = GmailApp.getMessagesForThreads(GmailApp.search('after:2015/1/14 before:2016/3/12'))
      .reduce(function(a, b) {return a.concat(b);})
      .map(function(eMails) {
        var matched = eMails.getTo().match(/<[^@]*@mydomain\.com>/ig);
        return (matched ? matched : []);
      })
      .reduce(function(a, b) {return a.concat(b);});

  // lowercase, filter for unique entries, sort
  var aEmails = eMails.map(function(text) {return text.toLowerCase().slice(1, -1);})
                      .filter(function(el,j,a) {return j == a.indexOf(el)})
                      .sort();

  // create 2D-array
  aUnique = aEmails.map(function(el) {return [el];}); 

  // add data to sheet
  SpreadsheetApp.getActiveSheet().getRange(1, 1, aUnique.length, 1)
    .setValues(aUnique);
} 
1
user79865