3

我正在编写一些代码来通过Mailgun 电子邮件服务发送带有附件的电子邮件。他们在使用 CURL 的 API 文档中给出了以下示例,我需要弄清楚如何在 Node.js 中做同样的事情(最好使用请求库)。

curl -s -k --user api:key-3ax6xnjp29jd6fds4gc373sgvjxteol0 \
    https://api.mailgun.net/v2/samples.mailgun.org/messages \
    -F from='Excited User <me@samples.mailgun.org>' \
    -F to='obukhov.sergey.nickolayevich@yandex.ru' \
    -F cc='sergeyo@profista.com' \
    -F bcc='serobnic@mail.ru' \
    -F subject='Hello' \
    -F text='Testing some Mailgun awesomness!' \
    -F html='\<html\>HTML version of the body\<\html>' \
    -F attachment=@files/cartman.jpg \
    -F attachment=@files/cartman.png

我当前的代码(Coffescript)如下所示:

r = request(
  url: mailgun_uri
  method: 'POST'
  headers:
    'content-type': 'application/x-www-form-urlencoded'
  body: email
  (error, response, body) ->
    console.log response.statusCode
    console.log body
)
form = r.form()
for attachment in attachments
  form.append('attachment', fs.createReadStream(attachment.path))
4

1 回答 1

6

For the basic authorization part you have to set the right headers and send username and password base64 encoded. See this SO question for more information. You can use the headers option for this.

How to send a POST request with form fields is described in the request docs:

var r = request.post('http://service.com/upload')
var form = r.form()
form.append('from', 'Excited User <me@samples.mailgun.org>') // taken from your code
form.append('my_buffer', new Buffer([1, 2, 3]))
form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')) // for your cartman files
form.append('remote_file', request('http://google.com/doodle.png'))

There also some existing modules on npm that support mailgun, like

an example for nodemailer would be

var smtpTransport = nodemailer.createTransport("SMTP",{
    service: "Mailgun", // sets automatically host, port and connection security settings
    auth: {
        user: "api",
        pass: "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"
    }
});

var mailOptions = {
  from: "me@tr.ee",
  to: "me@tr.ee",
  subject: "Hello world!",
  text: "Plaintext body",
  attachments: [
    {   // file on disk as an attachment
        fileName: "text3.txt",
        filePath: "/path/to/file.txt" // stream this file
    },
    {   // stream as an attachment
        fileName: "text4.txt",
        streamSource: fs.createReadStream("file.txt")
    },
  ]
}

transport.sendMail(mailOptions, function(err, res) {
  if (err) console.log(err);
  console.log('done');
});

Haven't tested it because I don't have a mailgun account but it should work.

于 2012-12-06T10:25:49.527 回答