Pick up email response content

8

I'm using the imap library to sign in to a company account and bring in the new emails when it's an answer of an email I would just pick up the new content but I can not get this just the full conversation. Let me give you an example:

A client sends me an email with the following content: 'Hi'

I respond by saying 'Hi, how are you?'

He answers me: 'Everything is great'

When I check my mailbox for the node to save the text. I want to get only the last content that he sent me that would be 'All right', but the imap library returns the whole conversation to me like this:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed of eiusmod tempor inciidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, it wanted nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo conseat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. "

April 5, 2018 10:50, [email protected] (mailto: [email protected]) wrote: test

April 5, 2018 10:31, [email protected] (mailto: [email protected]) wrote: customer response

April 5, 2018 10:30, [email protected] (mailto: [email protected]) wrote: answer answer

April 5, 2018 09:45, [email protected] (mailto: [email protected]) wrote: email sent by the client

In this example of the log I would like to take only the lorem ipsum ... which is the content of the last email reply.

My code:

imap.once('ready', function () {
    openInbox(imap, function (err, box) {
        if (err) throw err;
        var f = imap.seq.fetch('1:9999', {
            bodies: [''],
            struct: true
        });
        f.on('message', function (msg, seqno) {
            msg.on('body', function (stream, info) {
                var buffer = '';
                var prefix = '(#' + seqno + ') ';
                stream.on('data', function (chunk) {
                    buffer += chunk.toString('utf8');
                });

                stream.once('end', function () {
                    simpleParser(buffer).then(function(mail){
                        var email = {};
                        if (mail.headers.has('date')) {
                            email.date = (mail.headers.get('date'));
                        }
                        if (mail.headers.has('subject')) {
                            email.subject = (mail.headers.get('subject'));
                        }
                        if (mail.headers.has('from')) {
                            email.address = (mail.headers.get('from').value[0].address);
                        }

                        if (mail.inReplyTo) {
                            console.log(mail.text);
                            console.log('----');

                        } else {
                            email.text = mail.text;
                        }
                        // console.log(email);


                    }).catch(err => {
                        console.log(err);
                    });
                });
            });
            msg.once('attributes', function (attrs) {
                // console.log(prefix + 'Attributes: %s', inspect(attrs, false, 8));
            });
            msg.once('end', function () {
                // console.log(prefix + 'Finished');
            });
        });
        f.once('error', function (err) {
            console.log('Fetch error: ' + err);
        });
        f.once('end', function () {
            console.log('Done fetching all messages!');
            return imap.end();
        });
    });
});

imap.once('error', function (err) {
    console.log(err);
});

imap.once('end', function () {
    console.log('Connection ended');
});

imap.connect();

If someone could give me some help I will be very grateful. Thanks in advance.

    
asked by anonymous 05.04.2018 / 21:22

3 answers

2

Following the same example of @DiegoMarques

/^(Em\s)?\d{1,2} de \w+ de \d{4}/gm

The above expression will separate if you find the following sequences: April 5, 2018 and or April 10, 2018

The expression below is more complete:

^(Em\s)?\d{1,2}\sde\s\w+\sde\s\d{4}\s\d{1,2}:\d{1,2}([^@]+@\w+\.\w+\.\w+|,\s\sescreveu\:)?

and will separate if you find the following sequences:

5 de Abril de 2018 10:50, [email protected]
Em 5 de Abril de 2018 10:50, [email protected]

10 de abril de 2018 09:49
10 de abril de 2018 09:49,  escreveu:
Em 10 de abril de 2018 09:49
Em 10 de abril de 2018 09:49,  escreveu:
  

You can test at regex101.com

In the case of Outlook , the date comes with the default:

Em qua, 11 de abr de 2018 às 09:08

Expression looks like this:

^(Em\s\w+,\s)|(Em\s)?\d{1,2}\sde\s\w+\sde\s\d{4}\s(às\s)?\d{1,2}:\d{1,2}([^@]+@\w+\.\w+\.\w+|,\s\sescreveu\:)?

Or simple way:

/^(Em\s\w+,\s)|(Em\s)?\d{1,2} de \w+ de \d{4}/gm
  

You can test at regex101.com

Example 1

let mail = {
   text: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."

5 de Abril de 2018 10:50, [email protected] (mailto:[email protected]) escreveu:teste

5 de Abril de 2018 10:31, [email protected] (mailto:[email protected]) escreveu: resposta cliente

5 de Abril de 2018 10:30, [email protected] (mailto:[email protected]) escreveu:resposta atendimento

5 de Abril de 2018 09:45, [email protected] (mailto:[email protected]) escreveu: email enviado pelo cliente'
}

let reg = /^(Em\s)?\d{1,2} de \w+ de \d{4}/gm,
    separa = mail.text.split(reg);
console.log(separa[0]);

Example 2

let mail = {
   text: 'Olá, como vai?

Se você é programador ou desenvolvedor de diversos tipos de aplicações C#
(web, desktop, mobile, etc.), então este lançamento é pra você:



Ao final deste curso você irá tirar proveito das melhorias de parâmetros
out e in, aprender a retornar múltiplos valores de forma simples com
tuplas, simplificar condições e conversões de valores com correspondência
de padrões, explorar funções locais e nova sintaxe de expressão no C# 7,
padronizar os estilos de código C# da sua equipe de desenvolvimento e muito
mais!
Comece já                                     
11.04.2018 / 07:56
2

The problem in this case is that the responses are actually concatenated with the message, and who does this is the responding user's email client.

What you can do in this case is treat the whole text as a string and filter the content you want. What can help you in this case are regular expressions, which will help you to clear the unwanted text through patterns.

In this example you posted, you can see the following pattern when the other responses are concatenated:

<dia> de <mês> de <ano> <hora>:<minuto>, <email> (mailto:<email>) escreveu:

Then follow an example in javascript extracting content based on your example:

var msg = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."' +
'' +
'5 de Abril de 2018 10:50, [email protected] (mailto:[email protected]) escreveu:teste' +
'' +
'5 de Abril de 2018 10:31, [email protected] (mailto:[email protected]) escreveu: resposta cliente' +
'' +
'5 de Abril de 2018 10:30, [email protected] (mailto:[email protected]) escreveu:resposta atendimento' +
'' +
'5 de Abril de 2018 09:45, [email protected] (mailto:[email protected]) escreveu: email enviado pelo cliente';

var arrMsg = msg.split(/[0-9]+ de [a-zA-Z]+ de [0-9]+ [0-9:]+, [^@]+@[^ ]+ \(mailto:[^@]+@[^ ]+\) escreveu:/g);

var msgTratada = arrMsg[0];

console.log(msgTratada);

Remembering that if the pattern changes, you will have to adapt the treatment to cover these variations.

    
09.04.2018 / 16:52
2

As your last reply or sent message always presents a line with a time in hh:mm format, the way I did it was to detect in which line of the conversation there are strings with this information. >

What I did was break the entire array conversation ( msg_ ) by separating by \n line break. Then a% of% by traversing the array by checking which indexes have for with regex hh:mm (next numbers before and after colon /\d+:\d+/ ), and storing the index and the < in> text of occurrences in an object ( : ).

  

What I need to know is which line has data_obj = {} , and check if   this line also has a date in the month format   20 ".

Assuming this conversation example:

> Tudo bem! Estarei lá às 8:30
> 5 de Abril de 2018 10:50, [email protected] (mailto:[email protected]) escreveu:teste
> 5 de Abril de 2018 10:31, [email protected] (mailto:[email protected]) escreveu: resposta cliente

In the above case, what's important is to just get the text " > Okay! I'll be there at 8:30 ", which is the last conversation I received.

At first hh:mm , checking for , will generate the object:

data_obj = {
0: "> tudo bem! estarei lá às 8:30",
1: "> 5 de abril de 2018 10:50, [email protected] (mailto:[email protected]) escreveu:teste",
2: "> 5 de abril de 2018 10:31, [email protected] (mailto:[email protected]) escreveu: resposta cliente"
}

In all lines, the hh:mm pattern was found and added to the object, where key is the position of the occurrence in the array initially created; and the value of the respective key text (converted to lowercase for further verification). But see that the first item of the object, although it has a time ( hh:mm ) does not have a date (in the second 8:30 that will come, this item will be ignored).

With the object being fed, I will make a% of_configuring whether each text of the object has the " day pattern month strong from 20 "with regex:

/\d\sde\s(jan|fev|mar|abr|mai|jun|jul|ago|set|out|nov|dez)[\w]+\sde\s20/
  

Note: The above regex will only work until the year 2099.: D

The first occurrence found, your key will be the position of the initial array ( for ) which is how far I want to get the information. In this case, I make a for in with msg_ (line break) and join .

The theoretical part is sometimes a bit difficult to understand and explain, but seeing the code becomes clearer.

See the example:

The sample conversation text below is this:

Olá, como vai?
Se você é programador ou desenvolvedor de diversos tipos de aplicações C#
(web, desktop, mobile, etc.), então este lançamento é pra você:
Ao final deste curso você irá tirar proveito das melhorias de parâmetros
out e in, aprender a retornar múltiplos valores de forma simples com
tuplas, simplificar condições e conversões de valores com correspondência
de padrões, explorar funções locais e nova sintaxe de expressão no C# 7,
padronizar os estilos de código C# da sua equipe de desenvolvimento e muito
mais!
Comece já
Em 10 de abril de 2018 09:49,  escreveu:
> Resposta atendimento
>
>
> 10 de Abril de 2018 09:48, "erick zanetti"  > escreveu:
>
>
> Olá, erick,
> A data de entrega do seu trabalho Lista Vetores
>  é
> amanhã. Você deseja entregá-lo?

Note: In the code in the example, I added \n just to simulate line breaks.

var mail = {
   "text":
   'Olá, como vai?\n\n'
   +'Se você é programador ou desenvolvedor de diversos tipos de aplicações C#\n'
   +'(web, desktop, mobile, etc.), então este lançamento é pra você:\n\n\n'
   +'Ao final deste curso você irá tirar proveito das melhorias de parâmetros\n'
   +'out e in, aprender a retornar múltiplos valores de forma simples com\n'
   +'tuplas, simplificar condições e conversões de valores com correspondência\n'
   +'de padrões, explorar funções locais e nova sintaxe de expressão no C# 7,\n'
   +'padronizar os estilos de código C# da sua equipe de desenvolvimento e muito\n'
   +'mais!\n'
   +'Comece já\n\n'
   +'Em 10 de abril de 2018 09:49,  escreveu:\n\n'
   +'> Resposta atendimento\n'
   +'>\n'
   +'>\n'
   +'> 10 de Abril de 2018 09:48, "erick zanetti"  > escreveu:\n'
   +'>\n'
   +'>\n'
   +'> Olá, erick,\n'
   +'> A data de entrega do seu trabalho Lista Vetores\n'
   +'>  é\n'
   +'> amanhã. Você deseja entregá-lo?'
}

msg_ = mail.text.split("\n");

var idx_;
var data_obj = {};
for(var x=0; x<msg_.length; x++){
   if(msg_[x].match(/\d+:\d+/)){
      data_obj[x] = msg_[x].toLowerCase();
   }
}

for(var key in data_obj){
   if(data_obj[key].match(/\d\sde\s(jan|fev|mar|abr|mai|jun|jul|ago|set|out|nov|dez)[\w]+\sde\s20/)){
      idx_ = key;
      break;
   }
}

var ultima = msg_.slice(0,idx_).join("\n");

console.log(ultima);
    
10.04.2018 / 18:19