Я создаю надстройку Gmail, которая отправляет определенную информацию об электронных письмах в конечную точку сервера, и для этого она должна выбрать и отформатировать адреса электронной почты следующим образом:
- Если электронная почта находится в папке «Входящие», адрес должен совпадать с адресом отправителя.
- Если электронная почта находится в папке «Отправлено», адрес должен быть адресом получателя. результат
GmailMessage.getFrom()
или GmailMessage.getTo()
является строкой с форматом электронного письма, это адрес, и формат не должен выполняться. - Если результат
GmailMessage.getFrom()
или GmailMessage.getTo()
является строкойс форматом, например, John Doe <john@doe.com>
, тогда адрес должен быть подстрокой между угловыми скобками.
Поэтому я написал следующий код для этого
for (var i = 0; i < messages.length; i++) {
var address = '';
var name = '';
var from = messages[i].getFrom()
var to = messages[i].getTo();
Logger.log(from);
Logger.log(to);
if (messages[i].isInInbox()) {
Logger.log('inbox'); // (*)
if (/<(.*?)>/g.test(from)) {
Logger.log(/<(.*?)>/g.test(from));
Logger.log('true');
address = /<(.*?)>/.exec(from)[1];
} else {
Logger.log(/<(.*?)>/g.test(from)); // (**)
Logger.log('false');
address = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/g.exec(from)[0];
}
name = /^(.*?)@/.exec(address);
} else {
Logger.log('sent');
if (/<(.*?)>/g.test(to)) {
Logger.log(/<(.*?)>/g.test(to));
Logger.log('true');
address = /<(.*?)>/.exec(to)[1];
} else {
Logger.log(/<(.*?)>/g.test(to));
Logger.log('false');
address = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/g.exec(to)[0];
}
name = /^(.*?)@/.exec(address);
}
}
Где сообщения - это массив объектов GmailMessage. Дело в том, что в одном из сообщений «Входящие» адрес «от» оценивается как истинное для регулярного выражения /<(.*?)>/g
, но, тем не менее, входит в оператор else. Чтобы выразить это более понятным образом, вывод Logger выглядит следующим образом:
[19-10-14 13:52:14:750 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:750 PDT] john@doe.com <---- selected address
[19-10-14 13:52:14:751 PDT] sent
[19-10-14 13:52:14:751 PDT] false <---- it's a "simple string", not enclosed by <>
[19-10-14 13:52:14:752 PDT] false
[19-10-14 13:52:14:753 PDT] John Doe <john@doe.com> <---- selected address
[19-10-14 13:52:14:754 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:755 PDT] inbox
[19-10-14 13:52:14:755 PDT] true <---- enclosed by <>
[19-10-14 13:52:14:755 PDT] true
[19-10-14 13:52:14:757 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:757 PDT] John Doe <john@doe.com> <---- selected address
[19-10-14 13:52:14:757 PDT] sent
[19-10-14 13:52:14:758 PDT] true <---- enclosed by <>
[19-10-14 13:52:14:758 PDT] true
[19-10-14 13:52:14:760 PDT] John Doe <john@doe.com> <---- selected address
[19-10-14 13:52:14:760 PDT] "Foo Bar" <foo@bar.com>
[19-10-14 13:52:14:761 PDT] inbox
[19-10-14 13:52:14:761 PDT] true <---- enclosed by <>
[19-10-14 13:52:14:761 PDT] false <---- it's entering to the else statement nonetheless
Любой ключ к пониманию того, почему происходит это странное поведение? Я очень старался выяснить, что не так с этим кодом, но я действительно не знаю, что это могло быть.
Редактировать : я сделал еще несколько тестов и странным образом выражение /<(.*?)>/g.exec(from)
равно null
, если я помещу его ниже Logger.log('inbox')
(*) и равно [<john@doe.com>, john@doe.com]
внутри оператора else (**). Может ли кто-нибудь объяснить это поведение?