В то время как обработка электронного письма отвечает, как я могу проигнорировать какие-либо специфические особенности почтового клиента и историю?

Хорошо, я думаю, это то, что вы намеревались:

function countOutlets(obj)
{
   let objUnique= obj.outlet.filter(function(item, index){
      return obj.outlet.indexOf(item) >= index;
  });
  return objUnique
}
var cpy = [{
    "billdate": "2018-09-02",
    "outlet": "JAYANAGAR",
    "Total": 511153,
    "cash": 490289,
    "creditcard": 0,
    "coupon": 0,
    "paytm": 0,
    "credit": 0,
    "swiggy": 20864,
    "kb": 0,
    "bigbasket": 0
  },
  {
    "billdate": "2018-09-02",
    "outlet": "MALLESHWARAM",
    "Total": 115704,
    "cash": 112854,
    "creditcard": 0,
    "coupon": 0,
    "paytm": 0,
    "credit": 0,
    "swiggy": 2850,
    "kb": 0,
    "bigbasket": 0
  },
  {
    "billdate": "2018-09-02",
    "outlet": "KOLAR",
    "Total": 83597,
    "cash": 83597,
    "creditcard": 0,
    "coupon": 0,
    "paytm": 0,
    "credit": 0,
    "swiggy": 0,
    "kb": 0,
    "bigbasket": 0
  },
  {
    "billdate": "2018-09-03",
    "outlet": "JAYANAGAR",
    "Total": 167421,
    "cash": 167421,
    "creditcard": 0,
    "coupon": 0,
    "paytm": 0,
    "credit": 0,
    "swiggy": 0,
    "kb": 0,
    "bigbasket": 0
  },
  {
    "billdate": "2018-09-03",  //here for billdate 2018-09-03 i don't have data for malleshwaram so i want to have output as 0 when i am formating the json
    "outlet": "KOLAR",
    "Total": 53775,
    "cash": 53775,
    "creditcard": 0,
    "coupon": 0,
    "paytm": 0,
    "credit": 0,
    "swiggy": 0,
    "kb": 0,
    "bigbasket": 0
  }
]



function getDataList(jsn) {
  var billdate = [];
  var outlet = [];
  var SalesType = [];

  billdate = [...new Set(jsn.map(ele => ele.billdate))];
  outlet = [...new Set(jsn.map(ele => ele.outlet))];
  for (let i in jsn[0]) {
    if (i !== 'billdate' && i !== 'outlet') {
      SalesType.push(i)
    }
  }

  return {
    billdate,
    outlet,
    SalesType
  }

}
function structureJSON(obj) {
  let alloutlets=countOutlets(getDataList(cpy))
  console.log("billdarte :-" + obj.billdate)
  var arr = [];
  obj.billdate.forEach((ele1, index1) => {

    obj.SalesType.forEach((ele, index) => {
      let row;
      if (index === 0) {
        row = {
          billdate: ele1,
          SalesType: ele
        };
      } else {
        row = {
          billdate: "",
          SalesType: ele
        };
      }
      alloutlets.forEach((ele2, index2) => {
        var selected = cpy.filter((ele3, index3) => {
          return ele3.billdate === ele1 && ele3.outlet == ele2
        });
        if(selected.length!=0)
        row[ele2] = selected[0][ele]
        else
         row[ele2] = "0";
      })
      arr.push(row)
    })

  })

  return arr;

}
var tableValue = structureJSON(getDataList(cpy))
console.log(tableValue)

Я понимаю, что мои countOutlets вроде бы избыточны, но к тому времени, когда я понял это, я уже сделал это.

Надеюсь, это поможет.

6
задан tsdbrown 5 May 2009 в 10:10
поделиться

2 ответа

Я должен сделать парсинг ответа по электронной почте о проекте, над которым я сейчас работаю. В итоге я использовал сопоставление с образцом для идентификации части ответа, поэтому пользователям не нужно было беспокоиться о том, куда вставить свой ответ.

Хорошая новость заключается в том, что реализация действительно не так уж сложна. Сложная часть - это просто протестировать все почтовые клиенты и сервисы, которые вы хотите поддерживать, и выяснить, как определить каждого из них. Как правило, вы можете использовать либо идентификатор сообщения, либо заголовок X-Mailer или Return-Path, чтобы определить, откуда пришло входящее письмо.

Вот метод, который принимает объект TMail, извлекает часть ответа из сообщения и возвращает вместе с почтовым клиентом / сервисом, с которого оно было отправлено. Предполагается, что у вас есть исходное сообщение От: имя и адрес в константах FROM_NAME и FROM_ADDRESS .

def find_reply(email)
  message_id = email.message_id('')
  x_mailer = email.header_string('x-mailer')

  # For optimization, this list could be sorted from most popular to least popular email client/service
  rules = [
    [ 'Gmail', lambda { message_id =~ /.+gmail\.com>\z/}, /^.*#{FROM_NAME}\s+<#{FROM_ADDRESS}>\s*wrote:.*$/ ],
    [ 'Yahoo! Mail', lambda { message_id =~ /.+yahoo\.com>\z/}, /^_+\nFrom: #{FROM_NAME} <#{FROM_ADDRESS}>$/ ],
    [ 'Microsoft Live Mail/Hotmail', lambda { email.header_string('return-path') =~ /<.+@(hotmail|live).com>/}, /^Date:.+\nSubject:.+\nFrom: #{FROM_ADDRESS}$/ ],
    [ 'Outlook Express', lambda { x_mailer =~ /Microsoft Outlook Express/ }, /^----- Original Message -----$/ ],
    [ 'Outlook', lambda { x_mailer =~ /Microsoft Office Outlook/ }, /^\s*_+\s*\nFrom: #{FROM_NAME}.*$/ ],

    # TODO: other email clients/services

    # Generic fallback
    [ nil, lambda { true }, /^.*#{FROM_ADDRESS}.*$/ ]
  ]

  # Default to using the whole body as the reply (maybe the user deleted the original message when they replied?)
  notes = email.body
  source = nil

  # Try to detect which email service/client sent this message
  rules.find do |r|
    if r[1].call
      # Try to extract the reply.  If we find it, save it and cancel the search.
      reply_match = email.body.match(r[2])
      if reply_match
        notes = email.body[0, reply_match.begin(0)]
        source = r[0]
        next true
      end
    end
  end

  [notes.strip, source]
end
9
ответ дан 10 December 2019 в 02:53
поделиться

Я думаю, вы застрянете на этом. Недавно я самостоятельно занимался электронной почтой в TMail, и вы, как правило, обнаружите, что электронная почта, содержащая часть HTML, обычно имеет такую ​​структуру:

part 1 - multipart/mixed
  sub part 1 - text/plain
  sub part 2 - text/html
end

Почтовые клиенты, с которыми я играл в Outlook и Gmail, генерируют ответы в этот формат, и они просто обычно цитируют оригинальное письмо, встроенное в ответ. Сначала я подумал, что «старые» части исходного письма будут отдельными частями, но на самом деле это не так - старая часть просто объединяется с ответной частью.

Вы можете найти в этой строке строку, которая начинается » От: '(поскольку большинство клиентов обычно размещают заголовок в верхней части исходного текста сообщения электронной почты с указанием того, кто его отправил и т. Д.), Но это, вероятно, не гарантировано.

Я не знаю "

0
ответ дан 10 December 2019 в 02:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: