Automatyczne odpowiadanie na mail w GMail

0

Witam. Mam problem z modyfikacją kodu.

Mam skrypt który automatycznie odpowiada na maile w gmailu filtrując je po tytule oraz nadawcy. Chciałbym wprowadzić dwie modyfikacje. Pierwsza z nich polega na dodaniu cytatu starej wiadomości (odpisuje bez załączania pierwotnego maila), oraz druga za pomocą której mógłbym dodać kolejne kryterium i odpisywać na maile od innych nadawców z innymi filtrami w tytule. Czy znajdzie się tutaj dobra dusza która pomoże to zrobić?

const g = {
  subjectFilter: 'pytanie o przedmiot',
  from: '[email protected]',
  labelName: 'Auto-replied',
  textBody: `Witam. Dziękuję za zainteresowanie moją ofertą, odpowiem najszybciej, jak to możliwe. Moja firma jest czynna od poniedziałku do piątku, od 9:00 do 17:00 oraz w sobotę od 9:00 do 12:00. W tym czasie, proszę spodziewać się odpowiedzi. Pozdrawiam, Tomek`,
  htmlBody: `<p>Witam. Dziękuję za zainteresowanie moją ofertą, odpowiem najszybciej, jak to możliwe. Moja firma jest czynna od poniedziałku do piątku, od 9:00 do 17:00 oraz w sobotę od 9:00 do 12:00. W tym czasie, proszę spodziewać się odpowiedzi. Pozdrawiam, Tomek</p>`,

  maxThreads: 100,
  startingThread: 0,
  replyCount: 0,
};

function checkAndReply() {
  
  init_();
  while (true) {
    
    const threads = GmailApp.search(g.query, g.startingThread, g.maxThreads);
    g.startingThread += g.maxThreads;
    threads.forEach((thread) => {
      
      thread.reply(g.textBody, { htmlBody: g.htmlBody });
      
      g.label.addToThread(thread);
      
      g.replyCount++;
    });
    
    if (threads.length < g.maxThreads) {
      break;
    }
  }
 
  const text =
    g.replyCount == 0
      ? 'No new emails found.'
      : g.replyCount == 1
      ? 'Replied to one new email.'
      : `Replied to ${g.replyCount} new emails.`;
  console.log(text);
}

function init_() {
 
  const labels = GmailApp.getUserLabels().map((l) => l.getName());
  if (!labels.includes(g.labelName)) {
    GmailApp.createLabel(g.labelName);
  }
  g.label = GmailApp.getUserLabelByName(g.labelName);
  
  const queryFilter = {
    subject: g.subjectFilter,
    from: g.from,
    '-label': g.labelName,
  };
  g.query = Object.entries(queryFilter)
    .map((e) => e.join(':'))
    .join(' ');
 
  const triggers = ScriptApp.getProjectTriggers();
  if (triggers.length == 0) {
    ScriptApp.newTrigger('checkAndReply').timeBased().everyMinutes(1).create();
  }
}

2

Zacznijmy od tego, że cytowanie poprzedniej wiadomości w całości jest totalnie głupie i bez sensu. Przecież Gmail nawet ukrywa cytaty domyślnie, powiedziałbym, że to coś znaczy gdyby ten sam Gmail na chama nie doklejał tych cytatów automatycznie. Top posting to też zło, ale tutaj Gmail podąża za głupim trendem. Cytaty mają sens tylko, gdy fragmentami odpowiadasz na treść, tj. wklejasz kawałek oryginału, odpisujesz, znowu kawałek, odpisujesz.

Daj sobie 10 minut i przemyśl powyższe.

Serio. 10 minut. Nie krócej.

Dopiero teraz jak już jesteś absolutnie pewien, że chcesz robić takie głupie rzeczy to jedziemy dalej:

Wersja tekstowa

Rozbij treść maila (tekstową!) wg nowych linii (\n), do każdej linii dodaj poprzedzające > i następnie sklej to ponownie nowymi liniami. Z pustym wierszem pomiędzy dodaj na koniec (top posting, zło, ale standard) albo na początek (odrobina rozsądku, ale tylko odrobina, tylko nikt tak nie robi, więc jak ktoś będzie uprawiał top posting w odpowiedziach to będzie masakra, ale w sumie to nie ma znaczenia, bo nikt nie czyta cytatów w całości i tak).

Wersja HTML

Nie ma jednego złotego standardu jak ma wyglądać cytat w HTML. Każdy klient robi to po swojemu. Więc Ty w zasadzie też możesz zrobić po swojemu, typowo to jakaś forma nagłówka + <blockquote> byłoby semantycznie poprawne. Dorzucam strukturę, którą posługuje się Gmail (w zasadzie to samo, co napisałem wyżej):

<div class="gmail_quote">
  <div dir="ltr" class="gmail_attr">śr., 21 gru 2022 o 17:47 &lt;<a href="mailto:[email protected]" target="_blank">[email protected]</a>&gt; napisał(a):<br></div>
  <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    CYTOWANA TREŚĆ
  </blockquote>
</div>

Style są inline. Klasy są nieużywane, więc możesz je wywalić.

No i tu znowu - doklej to na koniec wiadomości HTML i masz top posting, doklej na początku masz normalne flow, którego nikt nie używa.

EDIT: A w sumie autorespondery to jest dopiero wkurzająca rzecz, która nie służy do niczego poza wkurzaniem odbiorców. Co mi daje? Nic, poza wiedzą, że masz jakiś automat.

0
dzek69 napisał(a):

Zacznijmy od tego, że cytowanie poprzedniej wiadomości w całości jest totalnie głupie i bez sensu. Przecież Gmail nawet ukrywa cytaty domyślnie, powiedziałbym, że to coś znaczy gdyby ten sam Gmail na chama nie doklejał tych cytatów automatycznie. Top posting to też zło, ale tutaj Gmail podąża za głupim trendem. Cytaty mają sens tylko, gdy fragmentami odpowiadasz na treść, tj. wklejasz kawałek oryginału, odpisujesz, znowu kawałek, odpisujesz.

Daj sobie 10 minut i przemyśl powyższe.

Serio. 10 minut. Nie krócej.

Dopiero teraz jak już jesteś absolutnie pewien, że chcesz robić takie głupie rzeczy to jedziemy dalej:

Wersja tekstowa

Rozbij treść maila (tekstową!) wg nowych linii (\n), do każdej linii dodaj poprzedzające > i następnie sklej to ponownie nowymi liniami. Z pustym wierszem pomiędzy dodaj na koniec (top posting, zło, ale standard) albo na początek (odrobina rozsądku, ale tylko odrobina, tylko nikt tak nie robi, więc jak ktoś będzie uprawiał top posting w odpowiedziach to będzie masakra, ale w sumie to nie ma znaczenia, bo nikt nie czyta cytatów w całości i tak).

Wersja HTML

Nie ma jednego złotego standardu jak ma wyglądać cytat w HTML. Każdy klient robi to po swojemu. Więc Ty w zasadzie też możesz zrobić po swojemu, typowo to jakaś forma nagłówka + <blockquote> byłoby semantycznie poprawne. Dorzucam strukturę, którą posługuje się Gmail (w zasadzie to samo, co napisałem wyżej):

<div class="gmail_quote">
  <div dir="ltr" class="gmail_attr">śr., 21 gru 2022 o 17:47 &lt;<a href="mailto:[email protected]" target="_blank">[email protected]</a>&gt; napisał(a):<br></div>
  <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    CYTOWANA TREŚĆ
  </blockquote>
</div>

Style są inline. Klasy są nieużywane, więc możesz je wywalić.

No i tu znowu - doklej to na koniec wiadomości HTML i masz top posting, doklej na początku masz normalne flow, którego nikt nie używa.

EDIT: A w sumie autorespondery to jest dopiero wkurzająca rzecz, która nie służy do niczego poza wkurzaniem odbiorców. Co mi daje? Nic, poza wiedzą, że masz jakiś automat.

Dziękuję za tak obszerną odpowiedź. Jak pewnie zauważyłeś, skrypt ma spełniać funkcję autorespondera na allegro. Wprowadzili takie udogodnienia, że jak nie odpiszesz odpowiednio szybko na pytanie kupującego, to spada Ci jakość sprzedaży. Tylko i wyłącznie po to jest mi to potrzebne. Chodzi o to, żeby wiadomość wyglądała w identyczny sposób jak ta, w której klikniemy na ikonkę odpowiedź bezpośrednio w gmail. Wtedy czat odpowiednio rozpoznaje konwersację i przypisuje wiadomość do konkretnego wątku. Czy to rozwiązanie jest odpowiedzią na mój problem?

0
Tomasz Rak napisał(a):

Chodzi o to, żeby wiadomość wyglądała w identyczny sposób jak ta, w której klikniemy na ikonkę odpowiedź bezpośrednio w gmail. Wtedy czat odpowiednio rozpoznaje konwersację i przypisuje wiadomość do konkretnego wątku. Czy to rozwiązanie jest odpowiedzią na mój problem?

Jeżeli dobrze kojarzę to Allegro rozpoznaje odpowiedzi po adresie Reply-To. Jeżeli odpowiadasz na ten adres, a nie na adres nadawcy, to powinno być ok, bez potrzeby cytowania.

image

Niemniej jeżeli uważasz, że cytowanie uratuje świat to powyższe powinno zadziałać. Powinno być identycznie jak w Gmailu, ew. braknie jakiegoś odstępu czy coś, ale to już sobie sam wybadaj. Treść HTML w Gmailu możesz podejrzeć przez Chrome Dev Tools

0

Odpowiedziałem bez cytowania wiadomości na adres reply-to i allegro odpisało, że nie mogą dostarczyć wiadomości. Wybacz, ale nie znam się na programowaniu. Czy byłbyś na tyle uprzejmy i umieścił to w kodzie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1