Express Nodemailer в nuxt serverMiddleware - Ошибка: spawn /usr/sbin/sendmail ENOENT

Я пытаюсь отправить простой запрос POST на контактную форму на статическом сайте, созданном поверх NuxtJs.

Я пытаюсь использовать express и nodemailer в serverMiddlewareNuxt.

вот код от api/contact.js

const express = require('express')
const nodemailer = require('nodemailer')
const validator = require('validator')
const xssFilters = require('xss-filters')

const app = express()
app.use(express.json())

const rejectFunctions = new Map([
  ['name', a => a.trim().length < 4],
  ['email', v => !validator.isEmail(v)],
  ['message', v => v.trim().length < 10]
])

const validateAndSanitize = (key, value) => {
  return (
    rejectFunctions.has(key) &&
    !rejectFunctions.get(key)(value) &&
    xssFilters.inHTMLData(value)
  )
}

const sendMail = (name, email, msg) => {
  const transporter = nodemailer.createTransport({
    sendmail: true,
    newline: 'unix',
    path: '/usr/sbin/sendmail'
  })
  transporter.sendMail(
    {
      from: email,
      to: '[email protected]',
      subject: 'New Contact Form',
      text: msg
    }
  )
}

app.post('/', (req, res) => {

  const attributes = ['name', 'email', 'message']
  const sanitizedAttributes = attributes.map(attr =>
    validateAndSanitize(attr, req.body[attr])
  )

  const someInvalid = sanitizedAttributes.some(r => !r)

  if (someInvalid) {
    return res
      .status(422)
      .json({ error: 'Error : at least one fiel is invalid' })
  }

  sendMail(...sanitizedAttributes)

  res.status(200).json({ message: 'OH YEAH' })
})

export default {
  path: '/api/contact',
  handler: app
}

Все работает, как задумано, до функции sendMail, где я получаю эту ошибку:

(node:10266) UnhandledPromiseRejectionWarning: Error: spawn /usr/sbin/sendmail ENOENT
    at Process.ChildProcess._handle.onexit (internal/child_process.js:246:19)
    at onErrorNT (internal/child_process.js:427:16)
    at processTicksAndRejections (internal/process/next_tick.js:76:17)
(node:10266) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 6)

Любая идея, что я делаю неправильно?

Доступен ли двоичный файл/программа sendmail по настроенному пути? О чем сообщает ls -l /usr/sbin/sendmail?

AnFi 16.03.2019 13:07

Вы когда-нибудь добились прогресса в этом? Похоже, вы использовали это прохождение? blog.lichter.io/posts/emails-through-nuxtjs — точно такая же ошибка.

Teddy Michels 07.01.2020 00:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
897
1

Ответы 1

Ошибка

Error: spawn /usr/sbin/sendmail ENOENT

предполагает, что nodemailer искал sendmail в /usr/sbin/, но не нашел его (это расположение по умолчанию и может быть настроено в опции path для createTransport). Во-первых, убедитесь, что он не существует (как предложил AnFi), запустив

ls -l /usr/sbin/sendmail

Если вы получите

ls: cannot access '/usr/bin/sendmail': No such file or directory

затем установите sendmail, запустив

sudo apt-get install sendmail

Затем попробуйте ls -l /usr/sbin/sendmail и снова отправить электронное письмо.

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