Почтальон в.xsjs

Есть ли способ отправить электронное письмо через Mailgun с HTML-страницей, содержание которой превышает ~2000 символов? У меня есть этот код, который отлично работает для коротких HTML, так как я считаю, что он отправляется в URL-адрес:

var obj = $.request.body.asString();    
var req = new $.web.WebRequest($.net.http.POST, "/messages");
        req.headers.set('Content-Type', encodeURIComponent("application/x-www-form-urlencoded"));

        req.parameters.set("domain", "mailgundomain.com");
        req.parameters.set("from", "me@mailgundomain.com");
        req.parameters.set("to", 'to@email.com');
        req.parameters.set("subject", "subject");
        req.parameters.set("html", obj); //email content

В приведенном выше коде я получаю файл и сохраняю его в переменную org, а затем отправляю его на почту. Что мне нужно, так это, вероятно, передать свой "слишком большой".html файл в тело, а затем показать его как содержимое письма. Как вы, наверное, видите, я совсем новичок в.xsjs, поэтому чем более подробный ответ, тем лучше. Если вам нужна дополнительная информация, не стесняйтесь спрашивать. Спасибо.

Edit1: я должен добавить, что когда я пытаюсь отправить файл большего размера, я получаю ответ "414 Request-URI Too Large".

1 ответ

Решение

РЕДАКТИРОВАТЬ

Это, кажется, правильный подход, совместно разработанный ОП и мной:

var obj = $.request.body.asString();    
var req = new $.web.WebRequest($.net.http.POST, "/messages");

// request headers
req.headers.set('Content-Type', "application/x-www-form-urlencoded");

// request URL parameters
req.parameters.set("domain", "mailgundomain.com");
req.parameters.set("from", "me@mailgundomain.com");
req.parameters.set("to", 'to@email.com');
req.parameters.set("subject", "subject");

// request body
req.setBody(encodeURIComponent(message));

$.web.WebRequest класс отправляет все, что вы установили в .parameters collection как параметр URL, даже если метод запроса POST. Это совершенно нормально, запросы POST могут иметь параметры URL. Однако, как вы заметили, URL -адреса ограничены по длине.

Тело запроса POST не ограничено по длине, но вы должны самостоятельно выполнить правильное кодирование содержимого. Тело application/x-www-form-urlencoded запрос типа следует тем же правилам, что и URL - key=value пары разделены & персонажи.

var obj = $.request.body.asString();    
var req = new $.web.WebRequest($.net.http.POST, "/messages");

req.headers.set('Content-Type', "application/x-www-form-urlencoded");

var message = {
    domain: "mailgundomain.com",
    from: "me@mailgundomain.com",
    to: "to@email.com",
    subject: "subject",
    html: obj
};

req.setBody(urlEncode(message));

где urlEncodedFormat() маленькая вспомогательная функция:

function urlEncode(obj) {
    return Object.keys(obj).map(function (key) {
        return encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]);
    }).join("&");
}

Превращение объектов в строку в кодировке URL - довольно распространенная операция. Вполне вероятно, что одна из используемых вами библиотек уже содержит функцию, которая делает это.

Хотя приведенная выше функция, вероятно, является правильной (возможны крайние значения с неопределенными или нулевыми значениями), предпочтительно не использовать свернутый вручную вариант. Потратьте некоторое время на поиск нужной функции в ваших библиотеках.

Может быть, WebRequest уже делает правильные вещи сам по себе, но у меня нет возможности проверить это. Попробуйте установить объект сообщения как тело напрямую:

req.setBody(message);
Другие вопросы по тегам