2014-04-11 30 views
14

Tôi đang cố gắng gửi email qua nodemailer mà không cần SMTP. Vì vậy, tôi đã làm điều đó:Nodemailer gửi email mà không cần gửi smtp

var mail = require("nodemailer").mail; 

mail({ 
    from: "Fred Foo ✔ <[email protected]>", // sender address 
    to: "******@gmail.com", // list of receivers 
    subject: "Hello ✔", // Subject line 
    text: "Hello world ✔", // plaintext body 
    html: "<b>Hello world ✔</b>" // html body 
}); 

Nhưng khi tôi chạy tôi nhận được rằng:

> node sendmail.js 
Queued message #1 from [email protected], to [email protected] 
Retrieved message #1 from the queue, reolving gmail.com 
gmail.com resolved to gmail-smtp-in.l.google.com for #1 
Connecting to gmail-smtp-in.l.google.com:25 for message #1 
Failed processing message #1 
Message #1 requeued for 15 minutes 
Closing connection to the server 

Error: read ECONNRESET 
    at errnoException (net.js:901:11) 
    at TCP.onread (net.js:556:19) 

tôi trên cửa sổ 7 32.

EDIT Đây dường như là một cửa sổ lỗi liên quan cho nó hoạt động trên linux

EDIT # 2

Trên vỏ git, nếu tôi nhập telnet smtp.gmail 587 nó bị chặn ở đây:

220 mx.google.com ESMTP f7...y.24 -gsmtp 
+0

Đảm bảo bạn đã cho phép kết nối qua các cổng kết nối với gmail smtp, đầu tiên kiểm tra telnet smtp.gmail.com 587 –

+0

tôi đang ở trên cửa sổ để lệnh 'telnet' không hoạt động. – Vinz243

+0

Aw người dùng Windows: D, bạn cũng có thể kích hoạt nó http://social.technet.microsoft.com/wiki/contents/articles/910.windows-7-enabling-telnet-client.aspx. Hoặc sử dụng một số ứng dụng khách khác như Putty. –

Trả lời

4

lẽ nó là cửa sổ hoặc tường lửa chống virus ngăn chặn truy cập gửi đi. cố gắng bật thông báo gỡ lỗi của trình gỡ thư.

Cho phép gỡ lỗi

var nodemailer = require("nodemailer"), 
    transport = nodemailer.createTransport('direct', { 
    debug: true, //this!!! 
    }); 

transport.sendMail({ 
    from: "Fred Foo ✔ <[email protected]>", // sender address 
    to: "******@gmail.com", // list of receivers 
    subject: "Hello ✔", // Subject line 
    text: "Hello world ✔", // plaintext body 
    html: "<b>Hello world ✔</b>" // html body 
}, console.error); 
+0

Tôi đã tắt tường lửa cửa sổ và nó không thay đổi gì cả. Làm cách nào để bạn bật gỡ lỗi? – Vinz243

+0

vui lòng xem chỉnh sửa – Vinz243

11

Từ ví dụ đầu ra của bạn có vẻ như để kết nối với sai cổng 25, cổng gmail smtp được mở là 465 cho SSL và khác 587 TLS.

Trình gửi thư điện tử phát hiện cấu hình chính xác dựa trên tên miền email, trong ví dụ của bạn, bạn chưa đặt đối tượng transporter để nó sử dụng cổng mặc định 25 được định cấu hình. Để thay đổi cổng chỉ định trong các tùy chọn loại.

Dưới đây là ví dụ nhỏ mà nên làm việc với gmail:

var nodemailer = require('nodemailer'); 

// Create a SMTP transport object 
var transport = nodemailer.createTransport("SMTP", { 
     service: 'Gmail', 
     auth: { 
      user: "[email protected]", 
      pass: "Nodemailer123" 
     } 
    }); 

console.log('SMTP Configured'); 

// Message object 
var message = { 

    // sender info 
    from: 'Sender Name <[email protected]>', 

    // Comma separated list of recipients 
    to: '"Receiver Name" <[email protected]>', 

    // Subject of the message 
    subject: 'Nodemailer is unicode friendly ✔', 

    // plaintext body 
    text: 'Hello to myself!', 

    // HTML body 
    html:'<p><b>Hello</b> to myself <img src="cid:[email protected]"/></p>'+ 
     '<p>Here\'s a nyan cat for you as an embedded attachment:<br/></p>' 
}; 

console.log('Sending Mail'); 
transport.sendMail(message, function(error){ 
    if(error){ 
     console.log('Error occured'); 
     console.log(error.message); 
     return; 
    } 
    console.log('Message sent successfully!'); 

    // if you don't want to use this transport object anymore, uncomment following line 
    //transport.close(); // close the connection pool 
}); 
+0

cảm ơn bạn đã làm việc ... Nhưng tôi không muốn đăng nhập. Và nếu tôi thay đổi nó từ SMTP để chỉ đạo nó nói với tôi rằng nó đã được thành công sended nhưng tôi không nhận được bất cứ điều gì ... – Vinz243

+1

Những gì bạn có nghĩa là do bạn không muốn đăng nhập? Máy chủ SMTP gmail yêu cầu nó, nếu bạn muốn gửi email mà không cần xác thực, bạn có thể thiết lập máy chủ SMTP của riêng bạn. –

+1

Tôi muốn sử dụng phương tiện di chuyển trực tiếp để tôi có thể đặt một địa chỉ giả như «no-reply @ vinz243.com' – Vinz243

0

Bạn cần phải có một máy chủ SMTP, một máy chủ email mà chuyển tiếp các email thay cho bạn. Vì vậy, hãy thiết lập máy chủ SMTP của riêng bạn như Haraka hoặc cung cấp bằng chứng xác thực cho Nodemailer để kết nối với một ví dụ. Gmail, MSN, Yahoo. Thậm chí tôi đã bắt đầu học NodeJs và đang cố gắng đưa tính năng gửi email vào dự án của tôi và đây cũng là vấn đề tương tự mà tôi gặp phải.

+1

Tôi muốn sử dụng Direct cho điều này lý do. BTW không cần phải có một email thích hợp để gửi thư. Đó là lý do tại sao bạn có thể gửi email cho ai đó bằng email của mình mặc dù bạn không biết thông tin đăng nhập của mình – Vinz243

+0

Nhưng sau đó dịch vụ nhận (SMTP server) chỉ đơn giản là từ chối thư của bạn hoặc spam nó. Nó hy vọng sẽ nhận được email từ một nguồn xác thực. – dv3

+0

Email không có thư trả lời không tồn tại – Vinz243

7

sử dụng nodemailer 0.7.1.
nếu bạn cài đặt trước đó nodemailer sau đó loại bỏ nó bằng cách

npm remove nodemailer 

bây giờ cài đặt nó bằng cách

npm install [email protected] 

đoạn mã sau gửi thư mà không cần đăng nhập, nhưng nó sẽ chỉ làm việc trong môi trường sản xuất, nó sẽ không làm việc tại địa phương

var mail = require("nodemailer").mail; 

mail({ 
    from: "Fred Foo ✔ <[email protected]>", // sender address 
    to: "[email protected], [email protected]", // list of receivers 
    subject: "Hello ✔", // Subject line 
    text: "Hello world ✔", // plaintext body 
    html: "<b>Hello world ✔</b>" // html body 
}); 
+1

có thực sự hoạt động nếu không có máy chủ SMTP không? –

+1

@JumarPolanco làm việc cho tôi – Kunok

+1

Tuyệt vời !, cảm ơn @Kunok –

3

Hình như các dòng điện nodemailer không có tùy chọn gửi thư mà không s mtp nữa. Tôi khuyên bạn nên xem thư viện sendmail mà không KHÔNG cần bất kỳ smtp/auth nào để gửi email. Nó cung cấp cho bạn kinh nghiệm tương tự để sử dụng sendmail trong linux.

const sendmail = require('sendmail')(); 

sendmail({ 
    from: '[email protected]', 
    to: '[email protected]', 
    subject: 'Hello World', 
    html: 'Hooray NodeJS!!!' 
}, function (err, reply) { 
    console.log(err && err.stack) 
    console.dir(reply) 
}) 

Bạn cũng có thể bật số silent để giảm chi tiết: const sendmail = require('sendmail')({silent: true});. Một điều cần lưu ý là người gửi không thể là những tên miền có DMARCpolicy như [email protected].

+0

làm cách nào để buộc sendmail gửi trực tiếp tới máy chủ trong địa chỉ? ví dụ. Tôi đã sử dụng trực tiếp bởi vì nếu không tôi nhận được lỗi "queryMx ENODATA" nhưng bây giờ với sendmail tôi thấy lỗi này một lần nữa. – Michael

+0

@Michael không chắc chắn về điều đó, bạn có thể muốn thực hiện 'dig' hoặc' nslookup' cho máy chủ mx của mình trước tiên. –

+0

à, tôi hiểu rồi. nhưng argh! đối số "err" không phải là thứ mà tôi có thể dễ dàng phân tích cú pháp để xác định xem lỗi có phải là 4xx hay không - tôi phải thử lại bản thân, đúng không? – Michael

Các vấn đề liên quan