Node.js 和 Nodemailer:我们可以将 PDF 文档附加到电子邮件中吗?

Posted

技术标签:

【中文标题】Node.js 和 Nodemailer:我们可以将 PDF 文档附加到电子邮件中吗?【英文标题】:Node.js and Nodemailer: Can we attached PDF documents to emails? 【发布时间】:2015-12-20 05:50:26 【问题描述】:

我想使用 nodemailer 和 node.js 附加 PDF 文档,但是,我找到的使用 nodemailer 附件的唯一示例是 .txt 文件 (here)。

有谁知道nodemailer是否支持PDF文档附件?

最初似乎可以附加 PDF,但通过电子邮件到达的 PDF 文件似乎已损坏(见图)。

代码:(改编自 Mahesh 的回答)

fs.readFile('/filePath/fileName.pdf', function (err, data) 
if (err) throw err;                                                  
var mailOptions = 
    from: 'Test <formEmail@gmail.com>', // sender address                                   
    to: 'toPersonName <toEmail@gmail.com>', // list of receivers                                 
    subject: 'Attachment', // Subject line                                                 
    text: 'Hello world attachment test', // plaintext body                                                 
    html: '<b>Hello world attachment test HTML</b>', // html body                                               
    attachments: [
        
            filename: 'fileName.pdf',                                         
            contentType: 'application/pdf'
        ]
;

// send mail with defined transport object                                                 
transporter.sendMail(mailOptions, function(error, info)
    if(error)
        return console.log(error);
    
    console.log('Message sent: ' + info.response);
);
console.log(data);
);

终端响应:

<Buffer 25 50 44 46 2d 31 2e 33 0a 25 c4 e5 f2 e5 eb a7 f3 a0 d0 c4 c6 0a 34 20 30 20 6f 62 6a 0a 3c 3c 20 2f 4c 65 6e 67 74 68 20 35 20 30 20 52 20 2f 46 69 ... >
Message sent: 250 2.0.0 OK 1443026036 hq8sm3016566pad.35 - gsmtp

【问题讨论】:

AFAIK 它支持所有非文本内容类型 【参考方案1】:

是的,你可以。您必须添加要附加的文件的路径。

transporter.sendMail(
  from: 'foo@bar.com',
  to: 'bar@foo.com',
  subject: 'An Attached File',
  text: 'Check out this attached pdf file',
  attachments: [
    filename: 'file.pdf',
    path: 'C:/Users/Username/Desktop/somefile.pdf',
    contentType: 'application/pdf'
  ],
  function(err, info) 
    if (err) 
      console.error(err);
     else 
      console.log(info);
    
  
);

【讨论】:

您如何考虑允许人们上传他们的 PDF 并附上? path 会是什么? 抱歉,没听懂。 在内存中生成 pdf 时(即没有文件),我无法正常工作。任何地方都没有示例(除了 base64 编码的图像)。 @Vishnu 和 Roko C. Buljax 天哪,非常感谢! .直到现在我都沉浸在 web-pack 配置的海洋中。天哪,谢谢你。【参考方案2】:

是的,您可以将 pdf 文档附加到电子邮件中,对于路径,您可以使用 path 并按照从当前文件到您要附加的 pdf 的路径。这对我有用。

// node-mailer.js
const nodemailer = require('nodemailer');
const path = require('path');
...
const mailOptions = 
    from: '',
    to: '',
    subject: '',
    text: '',
    html: '',
    attachments: [
        
            filename: 'file-name.pdf', // <= Here: made sure file name match
            path: path.join(__dirname, '../output/file-name.pdf'), // <= Here
            contentType: 'application/pdf'
        
    ]
;

transporter.sendMail(mailOptions, function(error, cb) 

);
我的文件结构/树:
├── package-lock.json
├── package.json
├── output
│   └── file-name.pdf
├── routes
│   └── node-mailer.js <= Current file
└── server.js

希望这可以帮助某人:) 快乐编码!

【讨论】:

【参考方案3】:

要记住两件事。

    提供pdf文件的完整地址。您可以使用__dirname(见下文)

    文件名和路径上的pdf名称应该完全相同。

    let info = await transporter.sendMail(
      from: '"Subject Foo Bar" <foo@bar.com>', // sender address
      to: `foo@bar.com, foofoo@bar.com`, // list of receivers
      subject: "Your's subject", // Subject line
      text: "Body of the email",
      attachments: [
        
          filename: "Trial_Agreement.pdf",
          path: __dirname + "/Trial_Agreement.pdf",
        ,
      ],
    );
    

【讨论】:

【参考方案4】:

是的,这很容易实现。我最近在一个需要相同类型的东西的项目上工作,对我来说效果很好。我在这里使用 Gmail 发送邮件。

导入 Nodemailer

const nodemailer = require('nodemailer');

发送邮件的主要功能

const sendEmailWithPromiseWithDynamicData = async () =>         
    let mailOptions = mailOptionsForDynamicMail()
    return new Promise((resolve, reject) => 
    createEmailTranspoter().sendMail(mailOptions, async(error, info) => 
                          
        if (error) 
        reject(error);
    
        resolve(info);
    );
  );

邮件选项功能

const mailOptionsForDynamicMail = async() =>             
            return 
                from: `"PROJECT NAME" <SENDER EMAIL ADDRESS>`, // sender address
                to: "RECEIVER EMAIL ADDRESS", // list of receivers
                subject: "Test Subject", // Subject line
                text: "Test Text", // plain text body
                html: generateEmailTemplateForDynamicMail(), // html body
                attachments: [
                       // utf-8 string as an attachment
                        filename: "YOUR ATTACHMENT FILE NAME", // file name, like 'test.pdf'
                        href: "LINK TO THE FILE" // link to the file, like http://example.com/invoices/test.pdf 
                    
                ]
            ;
        
    

创建邮件传输器

const createEmailTranspoter = () =>         
        return nodemailer.createTransport(
            host: 'smtp.gmail.com', //your smtp host name
            service: 'Gmail', // your service name
            port: 465,
            secure: true, // true for 465, false for other ports
            auth: 
                user: "SENDER MAIL",
                pass: "SENDER MAIL PASSWORD"
            ,
            tls: 
                rejectUnauthorized: true
            
        );
    
    

邮件 HTML 正文

const generateEmailTemplateForDynamicMail = async() => 
            return `
      <h4>This is a test mail</h4>
      <h5>Testing for email Attachments</h5>
      <br>
      <br>
      <br>
      <p></p>
      <p>Thanks</p>
      <p>Test person</p>
      `;

Nodemailer 文档链接: https://nodemailer.com/message/attachments/

谢谢

【讨论】:

以上是关于Node.js 和 Nodemailer:我们可以将 PDF 文档附加到电子邮件中吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js、node mailer 和 nodemailer-mailgun-transport 发送模板化电子邮件

Node.js Nodemailer 和 SES - 错误:未定义传输方法

使用 nodemailer 通过 Node.js 发送电子邮件不起作用

使用 Sendgrid/Nodemailer 将 Angular 表单数据发布到 Node.js

Node.js使用NodeMailer发送邮件

node.js使用Nodemailer发送邮件