Невозможно отправить вложение в формате PDF с более чем двумя фотографиями с помощью sendgrid


У меня есть одна странная проблема. Я создал API, который позволяет вам: загружать фотографии на сервер, затем сохранять данные в базу данных, создавать PDF-файл с этими данными и фотографиями, а затем отправлять электронное письмо с этим вложением в формате PDF. У меня это работало хорошо, пока я загружал/отправлял только две фотографии. Я смог открыть этот сгенерированный PDF-файл с помощью Finder, а также смог открыть его из полученного электронного письма.
Затем я загрузил больше файлов и после отправки запроса API получил электронное письмо с этим pdf-файлом, но не смог его открыть. Выдает ошибку, что Finder не смог открыть этот файл. Когда я проверил вручную внутри папки сервера, он работал хорошо.

Таким образом, должна быть проблема при отправке этого электронного письма. От 0 до 2 фото работает хорошо, больше 2 не работает. Но когда я открываю этот pdf-файл на сервере, он хорошо работает даже с 8 фотографиями.

Отправка изображения этого вложения в формате PDF.

Невозможно отправить вложение в формате PDF с более чем двумя фотографиями с помощью sendgrid

Вот код, который я использую для создания pdf с картинками:

const photosToPdf = [];
let positionX = 30;
let positionY = 240;

 for(let j=0;j<uploadsPath.length;j++){
    photosToPdf.push(uploadsFileNames[j]);
 }
    
 photosToPdf.forEach(img => {
    if (positionX == 570){
       positionX = 30
       positionY = positionY + 160 
    }
    doc.image(`uploads/${img}`, positionX, positionY, {width: 80});
    positionX = positionX + 90
});

А вот код, который генерирует электронную почту:

function highPriorityEmail(){
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let filePath = path.join(__dirname, `../../${problemName}_${creationDate}.pdf`);
      let attachment = fs.readFileSync(filePath).toString("base64");
      let fileName = `${problemName}_${creationDate}.pdf`

      if (problemPriority == "vysoká") {
        global.msg = {
          //to: ['[email protected]', '[email protected]'], // Change to your recipient
          //to: "[email protected]", // Change to your recipient
          to: "[email protected]", // Change to your recipient
          from: "[email protected]", // Change to your verified sender
          subject: "Vytvorenie nového nedostatku: " + problemName,
          html: `
                        Dobrý deň, <br>
                        <br>
                        dňa ${creationDate} bol vykonaný dozor koordinátora ${koordinatorName}. <br> 
                        Boli zistené nedostatky s vysokou prioritou, ktoré sú priložené v prílohe tohoto emailu.
                        <br>
                    `,
          attachments: [
              {
                  content: attachment,
                  filename: fileName,
                  contentType:'application/pdf'
              },
          ],
        };
        

        // sgMail.sendMultiple(msg) to prevent seeing
        sgMail
          .send(msg)
          .then(() => {
            console.info("Email sent");
          })
          .catch((error) => {
            console.error(error);
          });

        Case.update(
          { wasSended: 1 },
          { returning: true, where: { caseName: problemName } }
        );
      }
      resolve();
    }, 1000)
  });
};

Я использую:
pdfkit-таблица
и sendgrid/почта

Спасибо за помощь

Насколько велик вложенный файл PDF, если у вас больше двух фотографий?

philnash 21.03.2022 01:03

С 8 фотографиями он занимает 5,8 МБ.

Marek 21.03.2022 16:01

Я не уверен, что происходит тогда. Не могли бы вы прислать мне пример в формате pdf на мою электронную почту [email protected], и я попытаюсь воспроизвести.

philnash 21.03.2022 23:24

Я отправил вам два электронных письма, одно с 2 фотографиями, вы сможете его открыть, а второе с 8 фотографиями, и оно будет повреждено.

Marek 22.03.2022 10:50

Чтобы воспроизвести, мне понадобится PDF-файл до того, как вы отправили его по электронной почте, с того момента, когда вы сможете его открыть. Можете ли вы сгенерировать PDF и отправить мне оригинал, пожалуйста?

philnash 22.03.2022 11:12

Ой, извини. Я отправил вам только pdf с 8 фотографиями на ваш адрес электронной почты

Marek 22.03.2022 11:19

Вы прислали мне сломанный PDF. Если проблема в том, когда он отправляется через API, мне нужен рабочий PDF-файл с 8 фотографиями.

philnash 22.03.2022 12:11

Давайте продолжить обсуждение в чате.

Marek 22.03.2022 12:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я думаю, мы получили ответ здесь.

Проблема в строке

        global.msg = {

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

        const msg = {

Еще одна вещь, на которую следует обратить внимание, но свойство типа содержимого объекта вложений должно быть type, а не contentType (хотя в моем тестировании это ничего не изменило).

          attachments: [
              {
                  content: attachment,
                  filename: fileName,
                  type:'application/pdf'
              },
          ],

Другие вопросы по теме