2015-06-29 3 views
1

Я пытаюсь отправить вложение изображения, и оно проходит, но без данных. 0kb. Вот с помощью этого кода:Nodemailer Image Attachment Нет данных

var path = require('path'); 
var uploadDir = path.dirname(require.main.filename); 
// This actually produces a filepath that starts at my /Applications dir on my Mac, but ends in the right spot. 

var img = require("fs").readFileSync(uploadDir + '/uploads/' + params.newFileName); 
// file was upload was handled on the server by multer and renamed to something like this: fc5c5921bd0892f114cd7b6f0d39d9a3.gif 

attachments: [{ 
    filename: params.newFileName, 
    filePath: img 
}] 

Я пытался около сотни вариаций на тему на основе своих исследований в Интернете, и как я не получаю никакой привязанности вообще, результат описанный выше, или родовое прикрепление-1. бен. Мой newFileName парам в порядке. Файл существует в указанной директории. Явных ошибок нет. Я уверен, что бы некоторые рекомендации :)

обновления

Вот шаги, ведущие к шаткому вложенному файлу, от клиента к серверу.

Способ управления:

$scope.Upload = function() 
{ 
    var file = $scope.fileModel; 
    var uploadUrl = '/upload'; 

    if (formValid) 
    { 
     // Upload it 
     fileUpload.uploadFileToUrl(file, uploadUrl); 
    } 
}; 

сервис, который находится функцию загрузки (я не смог найти способ представить файл с остальной частью формы, поэтому загрузка обрабатывается отдельно, и я устанавливаю значение скрытого ввода имени файла multer-переименованы, который представляется с формой):

uploadFileToUrl: function(file, uploadUrl) 
{ 
    var fd = new FormData(); 
    fd.append('file', file); 
    $http.post(uploadUrl, fd, 
    { 
     transformRequest: angular.identity, 
     headers: { 
      'Content-Type': undefined 
     } 
    }) 

    .success(function (res) 
    { 
     toastr.success(res.successMessage, 'Success'); 
     $('#file-name').val(res.fileName) 
     $('#file-name').trigger('input'); 
    }) 

    .error(function() 
    { 
     toastr.error(res.errorMessage, 'Error'); 
    }); 
} 

данные формы обрабатываются на сервере двумя способами, первый из которых хранит параметры в сеансе, а затем отправляет пользователя в Paypal для завершения p ayment, а второй из которых получает доступ к этим переменным сессиям, а также создает и отправляет по электронной почте:

// NOTE: leaving out the paypal code as it is not relevant 
CompletePayment: function(req, res) 
{ 
    // Get the request params 
    var params = req.body; 

    // Store request params in session variables so we can send 
    // confirmation emails once payment has been completed 
    req.session.requestFormData = { 
     mediaType: params.mediaType, 
     name: params.name, 
     email: params.email, 
     dedication: params.dedication, 
     notes: params.notes, 
     socialMedia: params.socialMedia, 
     newFileName: params.newFileName 
    } 
} 

Наконец, метод, который строит и посылает сообщение - два на самом деле, главное сообщение, и подтверждение пользователя (очевидно, заменяя чувствительную информацию с заполнителями):

SendRequestEmail: function(req, res) 
{ 
    var params = req.session.requestFormData; 
    // I split the nodemailer SMTP transport off into a service 
    var transport = EmailService.SetupTransport(); 

    if (params) 
    { 
     var mailOptions = { 
      to: '[email protected]', 
      from: 'FromName <'+params.email+'>', 
      subject: 'Request from ' + params.name, 
      text: 'Someone has requested something! Get back to ' + params.name + ' right away!' + 
        '\n\nType: ' + params.mediaType + 
        '\nName: ' + params.name + 
        '\nEmail: ' + params.email + 
        '\nDedication: ' + params.dedication + 
        '\nNotes: ' + params.notes + 
        '\nCan We Post It: ' + params.socialMedia, 
      attachments: [{ 
       filename: params.newFileName, 
       // NOTE: I changed the path here to one that should work in production - deployed and got the same result 
       path: '/server/uploads/' 
      }] 
     }; 

     var confirmationMailOptions = { 
      // A much simpler version of above - no attachments, just text 
     } 

     // Send the request email 
     transport.sendMail(mailOptions, function(error, info) 
     { 
      if(error){ 
       res.send({ 
        nodemailerError: error, 
        errorMessage: 'Oops! Either the email address you entered doesn\'t exist, or the interwebs are misbehaving. Try again!' 
       }); 
      } 
      else 
      { 
       // If booking request was successful, send the confirmation to the user 
       transport.sendMail(confirmationMailOptions, function(error, info) 
       { 
        if (error) { 
         console.log(error); 
        } else { 
         res.send({ 
          successMessage: 'Confirmation message sent to: ' + params.email 
         }); 

         req.session.destroy(); 
        } 
       }); 
      } 
     }); 
    } 
    else 
    { 
     res.send({paramStatus: 'destroyed'}); 
    } 
} 
+0

имя свойства '' path' не filePath': https://github.com/andris9/Nodemailer#attachments – hassansin

+0

Я нашел людей, используя имена как собственность, так что я попробовал оба. Тот же результат. – MyCompassSpins

+0

Я также пытался использовать относительный путь к файлу вместо 'fs'. – MyCompassSpins

ответ

1

Я знал, что правильный путь к изображению, и @hassansin указал мне в правильном направлении относительно буфера (и andris9 прославленного nodemailer упоминается content: Buffer в версию этого вопроса я опубликовал на странице GitHub. Что привело меня к этой рабочей версии:

var path = require('path'); 
var uploadDir = path.dirname(require.main.filename); 
var img = require("fs").readFileSync(uploadDir + '/uploads/' + params.newFileName); 

attachments: [{ 
    filename: params.newFileName, 
    content: new Buffer(img) 
}]