ΠΠ°ΡΠΈ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΡΠ΅ ΠΏΠΈΡΡΠΌΠ° ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΡ Ρ ΠΎΡΠΈΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΠ°ΠΊ, ΠΌΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ: https://github.com/sendgrid/sendgrid-nodejs/blob/93763a74a85969382d59fcb3708d22051498f998/examples/helpers/mail/example.js
Π ΡΠ΄Π΅Π»Π°Π» ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:
const sendgrid: any = require('sendgrid')(process.env.sendgrid_key);
sendEmail(data: IEmailData): void {
const email: any = new sendgrid.Email();
email.addTo(data.emailTo);
for (let attachment in data.attachments)
this.addAttachment(email, attachment);
sendgrid.send(email, (error: any, json: string) => {
if (error)
console.log(error);
});
}
addAttachment(email: any, attachmentData: any): void {
const attachment = new sendgrid.Attachment();
attachment.setContent(attachmentData.content);
attachment.setType(attachmentData.type);
attachment.setFilename(attachmentData.filename);
attachment.setDisposition(attachmentData.disposition);
email.addAttachment(attachment);
}
ΠΠΎ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ sendEmail
Π½Π°ΠΌ ΡΠΎΠΎΠ±ΡΠ°ΡΡ sendgrid.Attachment is not a function
(ΠΏΠ΅ΡΠ²Π°Ρ ΡΡΡΠΎΠΊΠ° Π²ΡΠΎΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ).
Π― ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠ°Π» ΠΎΠ±ΡΠ΅ΠΊΡ sendgrid, ΠΈ ΠΎΠ½ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
{ api_key: 'SG.DaV0L',
api_user: null,
options:
{ uriParts:
{ protocol: 'https',
host: 'api.sendgrid.com',
port: '',
endpoint: '/api/mail.send.json' },
uri: 'https://api.sendgrid.com/api/mail.send.json' },
version: '1.9.2',
Email: [Function: Email],
smtpapi: [Function: smtpapi],
send: [Function] }
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ,
Π ΠΈΡΠ°ΡΠ΄.
Π Π°Π·ΠΎΠ±ΡΠ°Π»ΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°. ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π² github ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅Π²Π΅ΡΠ΅Π½. ΠΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ°ΠΊ:
addAttachment(email: any, attachmentData: any): void {
email.addFile(attachmentData);
}
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @RichardJECooke ,
Π Π°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Π΄Π°Π»ΡΡΠ΅ ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅. Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ, ΡΡΠΎ Π½Π°ΡΠ»ΠΈ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ!
ΠΡΠ»ΠΈ Π²Ρ Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π°ΠΌ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ [email protected], ΡΠΊΠ°Π·Π°Π² ΡΠ²ΠΎΠΉ ΠΏΠΎΡΡΠΎΠ²ΡΠΉ Π°Π΄ΡΠ΅Ρ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΡΠ±ΠΎΠ»ΠΊΠΈ, ΠΌΡ Π±ΡΠ΄Π΅ΠΌ
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ!
Π’Π΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ: https://github.com/sendgrid/sendgrid-nodejs/blob/master/USE_CASES.md#attachments
Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠΎ Π½ΠΎΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ°:
https://github.com/sendgrid/sendgrid-nodejs/blob/master/use-cases/attachments.md
ΠΡΠΈΠ²Π΅Ρ, Ρ Π·Π½Π°Ρ, ΡΡΠΎ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π±ΡΠ»Π° Π·Π°ΠΊΡΡΡΠ°, Π½ΠΎ ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Gmail.
Π― Π½Π°ΡΠ΅Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈΡΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Gmail Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈΠ·-Π·Π° Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ΠΈ Π½Π°Π»Π°Π³Π°ΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΡΡΠΎ Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ content_id ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ ΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π³Π° src.
ΠΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΡΠ΅ΡΠΊΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅Π²Π΅ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ. ΠΠΎΡ ΠΌΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄.
Π― ΠΊΠΎΠ΄ΠΈΡΡΡ JPG ΡΠ°ΠΊ:
let bitmap = fs.readFileSync(imageDir);
imageBase64URL = new Buffer(bitmap).toString('base64');
ΠΠ°ΡΠ΅ΠΌ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Ρ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ JPG Π² ΠΏΠΎΠ»Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π²Π½ΡΡΡΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ:
mailer.send({
to: '[email protected]',
from: '[email protected]',
subject: `You have been removed from ${house.name} by ${removerName}`,
html: result,
attachments: [
{
content: imageBase64URL,
filename: 'cluttr-logo.jpg',
contentId: 'cluttr-logo'
},
]
});
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Ρ Π²ΡΡΠ°Π²Π»ΡΡ ΡΠ²ΠΎΠΉ CID Π² ΡΠ²ΠΎΠΉ ΡΠ°ΠΉΠ» ejs ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
html
<img alt="Logo" src="cid:cluttr-logo" width="60"
height="60"
ΠΠ°Π΄Π΅ΡΡΡ, ΠΊΡΠΎ-ΡΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ, ΡΡΠΎ Ρ Π΄Π΅Π»Π°Ρ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ.
ΠΡΠΈΠ²Π΅Ρ @ lvh1g15 ,
Π― Π΄ΡΠΌΠ°Ρ, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ disposition: inline
, Π²ΠΎΡ ΡΠ°ΠΊ .
Π‘ Π½Π°ΠΈΠ»ΡΡΡΠΈΠΌΠΈ ΠΏΠΎΠΆΠ΅Π»Π°Π½ΠΈΡΠΌΠΈ,
ΠΠ»ΠΌΠ΅Ρ
@thinkingserious : ΠΡΠΈΠ²Π΅Ρ, Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ?
@thinkingserious Π΅ΡΡΡ Π»ΠΈ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ URL-Π°Π΄ΡΠ΅ΡΠ° ΠΊ ΠΌΠΎΠ΅ΠΌΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΌΡ ΠΏΠΈΡΡΠΌΡ, ΠΊΠ°ΠΊ Π΅ΡΠ΅ Ρ ΠΌΠΎΠ³Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ ΠΌΠΎΠ΅ΠΌΡ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΌΡ ΠΏΠΈΡΡΠΌΡ. Π½Π΅ ΡΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ±Ρ ΡΠ°Π±ΠΎΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Sendgrid.
Π‘ Π£Π²Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ,
ΠΠΎΡ
ΠΈΡ
@thinkingserious : ΠΡΠΈΠ²Π΅Ρ, Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΠΈ?
Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ v3 API, ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊΠ»ΡΡ attachments
. content
Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ Π² Base64
https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html
email = {
"from":{
"email":"[email protected]"
},
"personalizations":[
{
"to":[
{
"email" : "[email protected]"
}
],
"dynamic_template_data": {
}
}
],
"attachments": [
{
"content": "",
"filename" ""
}
]
"template_id":"someid"
}
Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠΎ Π½ΠΎΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ°:
https://github.com/sendgrid/sendgrid-nodejs/blob/master/use-cases/attachments.md
ΠΠΎΠ²Π°Ρ Π½ΠΎΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ°: https://github.com/sendgrid/sendgrid-nodejs/blob/master/docs/use-cases/attachments.md
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠΎ Π½ΠΎΠ²Π°Ρ ΡΡΡΠ»ΠΊΠ°:
https://github.com/sendgrid/sendgrid-nodejs/blob/master/use-cases/attachments.md