Как вы прочтете в документации Sendgrid :
EventGhog SendGrid будет уведомлять URL-адрес по вашему выбору через HTTP POST с информацией о событиях, которые происходят, когда SendGrid обрабатывает ваш электронная почта
Чтобы реализовать конечную точку HTTP в своем проекте Firebase, вы реализуете Облачная функция HTTPS , которая будет вызываться веб-крючком Sendgrid через запрос POST HTTPS.
Каждый вызов из веб-крючка Sendgrid будет касаться определенного c события , и вы сможете в своей облачной функции получить значение события (processed
, delivered
, et c ...).
Теперь вам необходимо в облачной функции связать указанное событие c с указанным c электронным письмом, которое ранее было отправлено через вашу облачную функцию. Для этого вы должны использовать пользовательских аргументов .
Точнее, вы добавили бы к вашему msg
объекту (который вы передаете методу send()
) уникальный идентификатор. Классическим значением является идентификатор документа Firestore, например event.params.officeId
, но может быть любой другой уникальный идентификатор, который вы генерируете в своей облачной функции.
Пример реализации
в вашей облачной функции при отправке электронного письма, передайте officeId
в объекте custom_args
, как показано ниже:
exports.sentMail = functions.firestore
.document("/Offices/{officeId}")
.onCreate((documentSnapshot,event) => {
const documentData = documentSnapshot.data();
const officeId = event.params.officeId;
const msg = {
to: "amarjeetkumars34@gmail.com",
from: "singhamarjeet045@gmail.com",
text: "hello from this side",
templateId: "d-8ecfa59aa9d2434eb8b7d47d58b4f2cf",
substitutionWrappers: ["{{", "}}"],
substitutions: {
name: documentData.name
},
custom_args: {
"officeId": officeId
}
};
return sgMail.send(msg)
.then(() => {
console.log("payment mail sent success"));
return null;
})
.catch(err => {
console.log(err)
return null;
});
});
Обратите внимание, что вы получаете данные недавно созданного документа (тот, который вызывает функцию облака) до documentSnapshot.data()
: вам не нужно запрашивать тот же документ в вашей облачной функции.
Затем создайте простую HTTPS облачную функцию , как показано ниже:
exports.sendgridWebhook = functions.https.onRequest((req, res) => {
const body = req.body; //body is an array of JavaScript objects
const promises = [];
body.forEach(elem => {
const event = elem.event;
const eventTimestamp = elem.timestamp;
const officeId = elem.officeId;
const updateObj = {};
updateObj[event] = true;
updateObj[event + 'Timestamp'] = eventTimestamp;
promises.push(admin.firestore().collection('Offices').doc(officeId).update(updateObj));
});
return Promise.all(promises)
.then(() => {
return res.status(200).end();
})
})
Разверните его и захватите его URL, как показано в терминале: он должен быть похож на https://us-central1-<your-project-id>.cloudfunctions.net/sendgridWebhook
.
Обратите внимание, что здесь я использую admin.firestore().collection('Offices')...
. Вы можете использовать const db = newProject.firestore(); ... db.collection('Offices')...
Также обратите внимание, что тело запроса HTTPS POST, отправленного веб-крючком Sendgrid, содержит массив объектов JavaScript, поэтому мы будем использовать Promise.all()
для обрабатывать эти различные объекты, т.е. записывать в документ Firestore различные officeId
события.
Затем вам нужно настроить Webhook на платформе Sendgrid, в разделе «Настройки почты / Уведомление о событиях», как объяснено в do c и как показано ниже.