All language subtitles for 009 Building a Complex Email Handler_Downloadly.ir_en

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:00,790 --> 00:00:02,400 With the file upload part 2 00:00:02,400 --> 00:00:03,960 of the section finished, 3 00:00:03,960 --> 00:00:07,300 let's now turn our attention to sending emails. 4 00:00:07,300 --> 00:00:09,610 And we actually already sent email before, 5 00:00:09,610 --> 00:00:13,170 for the password reset, but in the next couple of lectures 6 00:00:13,170 --> 00:00:16,050 we're gonna take that to a whole new level. 7 00:00:16,050 --> 00:00:18,760 And what we're gonna do is to build email templates 8 00:00:18,760 --> 00:00:21,350 with pug and sending real emails 9 00:00:21,350 --> 00:00:23,270 using the SendGrid service. 10 00:00:23,270 --> 00:00:25,220 And now in this first lecture, 11 00:00:25,220 --> 00:00:27,630 we're gonna build a more robust email handler 12 00:00:27,630 --> 00:00:29,313 than the one that we had before. 13 00:00:30,870 --> 00:00:34,030 So, let's open up our utilities folder, 14 00:00:34,030 --> 00:00:38,510 and then in here, remember, we already have an email file. 15 00:00:38,510 --> 00:00:40,100 But right now what we have here 16 00:00:40,100 --> 00:00:43,660 is just a very simple email sending handler, 17 00:00:43,660 --> 00:00:46,810 which is not able to take in a lot of options. 18 00:00:46,810 --> 00:00:48,120 And so now we're going to build 19 00:00:48,120 --> 00:00:50,190 a much more robust solution here. 20 00:00:50,190 --> 00:00:51,450 All right? 21 00:00:51,450 --> 00:00:53,833 So what I'm gonna do is to create a class, 22 00:00:55,360 --> 00:00:57,503 and that class is gonna be called email. 23 00:00:58,750 --> 00:01:01,690 So module.exports, 24 00:01:01,690 --> 00:01:03,950 and so also this class is what we're going 25 00:01:03,950 --> 00:01:07,103 to be exporting from this file. 26 00:01:09,580 --> 00:01:13,340 And then as always, a class needs a constructor function, 27 00:01:13,340 --> 00:01:16,170 which is basically the function that is gonna be running 28 00:01:16,170 --> 00:01:19,300 when a new object is created through this class. 29 00:01:19,300 --> 00:01:20,910 Now let's actually take a look 30 00:01:20,910 --> 00:01:23,393 at how we would use this class in practice. 31 00:01:24,960 --> 00:01:26,770 And so the idea, basically, 32 00:01:26,770 --> 00:01:28,840 whenever we want to send a new email, 33 00:01:28,840 --> 00:01:32,960 is to import this email class and then use it like this. 34 00:01:32,960 --> 00:01:34,713 So creating a new email, 35 00:01:35,970 --> 00:01:38,490 and then into it, we want to paste a user, 36 00:01:38,490 --> 00:01:41,150 and so that user will then contain the email address, 37 00:01:41,150 --> 00:01:44,563 and also the name in case we want to personalize the email. 38 00:01:45,800 --> 00:01:47,580 And also a URL. 39 00:01:47,580 --> 00:01:49,120 And a good example for this one 40 00:01:49,120 --> 00:01:53,200 is for example, the reset URL for resetting the password. 41 00:01:53,200 --> 00:01:54,033 Okay? 42 00:01:54,033 --> 00:01:56,660 So, a new email object, and then on there 43 00:01:56,660 --> 00:01:59,000 we want to call the method that is actually going 44 00:01:59,000 --> 00:02:00,570 to send the email. 45 00:02:00,570 --> 00:02:02,843 So, let's say sendWelcome. 46 00:02:04,180 --> 00:02:07,410 And so that one is gonna be sent 47 00:02:07,410 --> 00:02:10,910 whenever a new user signs up for our application. 48 00:02:10,910 --> 00:02:11,743 All right? 49 00:02:11,743 --> 00:02:14,630 We will then also have send password reset. 50 00:02:14,630 --> 00:02:16,480 And the way we will set all this up 51 00:02:16,480 --> 00:02:18,950 will make it really easy to then keep adding 52 00:02:18,950 --> 00:02:21,490 new and new methods similar to this one 53 00:02:21,490 --> 00:02:24,450 to send different emails for different scenarios. 54 00:02:24,450 --> 00:02:25,370 All right? 55 00:02:25,370 --> 00:02:28,400 Anyway, since we paste the user and the URL 56 00:02:28,400 --> 00:02:31,670 into a new email, well, our constructor then needs 57 00:02:31,670 --> 00:02:33,633 to take these in as arguments. 58 00:02:34,720 --> 00:02:36,560 So user and URL. 59 00:02:36,560 --> 00:02:40,340 And so what happens in this constructor is that this.to 60 00:02:43,020 --> 00:02:47,130 will be equal to the user.email 61 00:02:49,926 --> 00:02:53,210 Then we also want to define the first name of the user, 62 00:02:53,210 --> 00:02:56,433 again in order to basically personalize the email. 63 00:02:59,903 --> 00:03:03,170 And so that's user.name and let's split it 64 00:03:03,170 --> 00:03:08,170 and take only the first element in the resulting array. 65 00:03:09,530 --> 00:03:11,210 So we did this one before, 66 00:03:11,210 --> 00:03:16,210 but then also this.url is equal to the incoming URL. 67 00:03:17,010 --> 00:03:22,010 Finally, let's also set this.from right here. 68 00:03:22,500 --> 00:03:24,450 so basically at the object level. 69 00:03:24,450 --> 00:03:26,970 And so each object created from this class 70 00:03:26,970 --> 00:03:28,830 will then get this property. 71 00:03:28,830 --> 00:03:32,720 And so this one will be similar to what we have here. 72 00:03:32,720 --> 00:03:35,020 So it's basically this from, 73 00:03:35,020 --> 00:03:36,760 so let's just copy it 74 00:03:36,760 --> 00:03:40,230 but it's nice to have it in a one central place like this. 75 00:03:40,230 --> 00:03:42,200 Now one thing that I really want to do, 76 00:03:42,200 --> 00:03:45,090 is to basically define this email address here 77 00:03:45,090 --> 00:03:46,770 as a configuration variable, 78 00:03:46,770 --> 00:03:48,740 and so an environment variable 79 00:03:48,740 --> 00:03:50,440 that we can very easily change 80 00:03:50,440 --> 00:03:54,073 by manipulating the config.env file. 81 00:03:55,774 --> 00:03:56,607 All right? 82 00:03:57,940 --> 00:04:00,100 So let's call this one EMAIL_FROM. 83 00:04:02,490 --> 00:04:06,530 And then we only want the email address itself. 84 00:04:06,530 --> 00:04:07,363 All right? 85 00:04:08,560 --> 00:04:10,840 So another case where it's very helpful 86 00:04:10,840 --> 00:04:12,353 to use environment variables. 87 00:04:13,260 --> 00:04:15,360 And now let's make this a template string. 88 00:04:18,399 --> 00:04:20,839 And of course plug that in here. 89 00:04:20,839 --> 00:04:23,153 So that's process.env.EMAIL_FROM. 90 00:04:28,540 --> 00:04:30,930 Next up, let's create a method here 91 00:04:30,930 --> 00:04:33,230 in order to create the transport. 92 00:04:33,230 --> 00:04:35,563 So similar to what we have here. 93 00:04:37,640 --> 00:04:39,347 So createTransport. 94 00:04:43,450 --> 00:04:46,280 And now here we actually want to have different transports 95 00:04:46,280 --> 00:04:48,890 whether we are in production or not. 96 00:04:48,890 --> 00:04:50,170 So when we're in production, 97 00:04:50,170 --> 00:04:52,470 we actually want to send real emails, 98 00:04:52,470 --> 00:04:55,540 and we will do that a bit later using SendGrid, 99 00:04:55,540 --> 00:04:57,890 but if we are not in production 100 00:04:57,890 --> 00:05:00,730 then we still want to use our Mailtrap application 101 00:05:00,730 --> 00:05:03,270 just like we did it before when we send emails. 102 00:05:03,270 --> 00:05:07,020 So instead of the email going to a real email address, 103 00:05:07,020 --> 00:05:10,730 it will get caught into our Mailtrap inbox so that 104 00:05:10,730 --> 00:05:12,260 we can actually take a look at it 105 00:05:12,260 --> 00:05:13,843 in our development process. 106 00:05:14,950 --> 00:05:18,343 So that transporter will be exactly the same as this one, 107 00:05:19,870 --> 00:05:24,220 so let's just copy it but first let's say 108 00:05:24,220 --> 00:05:25,277 if(process.env.NODE_ENV). 109 00:05:30,360 --> 00:05:32,360 So, remember, that's how we checked 110 00:05:32,360 --> 00:05:34,110 whether we're in production or not. 111 00:05:36,390 --> 00:05:38,230 And so if that is in production, 112 00:05:38,230 --> 00:05:39,620 and so if we're in production, 113 00:05:39,620 --> 00:05:43,830 then we want to create a transporter for SendGrid. 114 00:05:43,830 --> 00:05:45,890 So let's just put that here, 115 00:05:45,890 --> 00:05:47,613 and again we will do that later. 116 00:05:49,170 --> 00:05:51,410 For now let's just return something from here. 117 00:05:51,410 --> 00:05:53,133 Doesn't matter, lets say one. 118 00:05:54,680 --> 00:05:55,513 All right? 119 00:05:56,750 --> 00:05:58,840 And then basically otherwise 120 00:05:58,840 --> 00:06:02,493 we want to return this nodemailer.createTransport. 121 00:06:05,166 --> 00:06:05,999 Okay? 122 00:06:05,999 --> 00:06:06,840 So this Transport here 123 00:06:06,840 --> 00:06:11,293 will basically return a new nodemailer transport like this. 124 00:06:12,280 --> 00:06:14,660 Or, on the other hand when we're in production, 125 00:06:14,660 --> 00:06:17,333 then the one that's going to be here. 126 00:06:18,500 --> 00:06:19,333 Okay? 127 00:06:19,333 --> 00:06:21,020 So let's actually delete it from here. 128 00:06:23,930 --> 00:06:26,773 Also, we want to delete this one. 129 00:06:32,970 --> 00:06:35,480 And now let's create the send method. 130 00:06:35,480 --> 00:06:37,520 And so this is gonna be the method 131 00:06:37,520 --> 00:06:39,610 that will do the actual sending. 132 00:06:39,610 --> 00:06:40,443 Okay? 133 00:06:40,443 --> 00:06:43,650 And this one will receive a template and a subject. 134 00:06:43,650 --> 00:06:45,150 And you will understand a bit better 135 00:06:45,150 --> 00:06:48,003 why that is once this entire class is complete. 136 00:06:49,270 --> 00:06:50,103 Okay? 137 00:06:51,550 --> 00:06:53,513 So template and subject. 138 00:06:56,050 --> 00:06:58,553 So let's put a comment here of what this will do. 139 00:07:01,170 --> 00:07:03,600 And now before we actually write out this function, 140 00:07:03,600 --> 00:07:05,690 let me show you how we're gonna use it, 141 00:07:05,690 --> 00:07:08,753 and so why we need the template and the subject here. 142 00:07:10,890 --> 00:07:12,893 So, remember how we said up here 143 00:07:12,893 --> 00:07:16,890 that we're gonna have one method called sendWelcome, 144 00:07:16,890 --> 00:07:21,890 and also like a method for sending a reset password email. 145 00:07:21,900 --> 00:07:26,353 And so, let's now actually add that here, so sendWelcome. 146 00:07:28,460 --> 00:07:31,430 And this one doesn't receive any argument 147 00:07:31,430 --> 00:07:34,410 and all it really does is to call send 148 00:07:35,470 --> 00:07:37,030 with the template and the subject 149 00:07:37,030 --> 00:07:38,690 that we want for this email. 150 00:07:38,690 --> 00:07:39,523 Okay? 151 00:07:39,523 --> 00:07:41,800 And so again, this makes it really easy 152 00:07:41,800 --> 00:07:43,370 to then create different emails 153 00:07:43,370 --> 00:07:45,480 for all kinds of different situations. 154 00:07:45,480 --> 00:07:46,550 Okay? 155 00:07:46,550 --> 00:07:49,297 So we have this one route send function here 156 00:07:49,297 --> 00:07:51,790 and then all of these more specific ones, 157 00:07:51,790 --> 00:07:55,100 which will then in turn call the router send function 158 00:07:55,100 --> 00:07:57,150 which is doing the actual work. 159 00:07:57,150 --> 00:07:58,500 Okay? 160 00:07:58,500 --> 00:08:01,950 And actually here it is this.send 161 00:08:01,950 --> 00:08:03,970 because of course these methods here, 162 00:08:03,970 --> 00:08:06,600 they are going to be defined on the current object. 163 00:08:06,600 --> 00:08:07,643 And so that's this. 164 00:08:09,530 --> 00:08:12,113 Then here we paste in the template name. 165 00:08:14,280 --> 00:08:16,630 And so this template name that I put here, 166 00:08:16,630 --> 00:08:19,020 will in the future be a pug template 167 00:08:19,020 --> 00:08:20,280 that we're gonna create. 168 00:08:20,280 --> 00:08:22,320 So, actually in the next lecture, 169 00:08:22,320 --> 00:08:24,600 we're gonna be creating this pug template 170 00:08:24,600 --> 00:08:26,523 in order to send this welcome email. 171 00:08:27,710 --> 00:08:28,543 Okay? 172 00:08:28,543 --> 00:08:29,763 And then just the subject line. 173 00:08:31,250 --> 00:08:35,320 Let's say 'Welcome to the Natours Family!' 174 00:08:37,549 --> 00:08:40,919 And so, just like this, we do not need to worry 175 00:08:40,919 --> 00:08:43,210 about any of the implementation details 176 00:08:43,210 --> 00:08:45,260 when we're actually sending the email. 177 00:08:45,260 --> 00:08:47,290 So for example in the point of our code 178 00:08:47,290 --> 00:08:49,510 where we want to send the welcome email 179 00:08:49,510 --> 00:08:51,900 we do not have to worry about template names 180 00:08:51,900 --> 00:08:54,130 or about the subject lines. 181 00:08:54,130 --> 00:08:57,130 All we're gonna do is to say send welcome email 182 00:08:57,130 --> 00:08:58,260 and that's it. 183 00:08:58,260 --> 00:09:00,380 And then our class will take care 184 00:09:00,380 --> 00:09:03,563 of dealing with the implementation. 185 00:09:04,880 --> 00:09:05,780 All right? 186 00:09:05,780 --> 00:09:09,023 Anyway, let's now actually then build this send function. 187 00:09:10,180 --> 00:09:14,560 And so, what we're gonna do in this function, 188 00:09:14,560 --> 00:09:19,560 is to first render the HTML for the email 189 00:09:20,820 --> 00:09:22,663 based on a pug template. 190 00:09:25,650 --> 00:09:27,550 So basically the one that we're pasting 191 00:09:27,550 --> 00:09:29,823 into here with template. 192 00:09:31,750 --> 00:09:34,533 Then, define the email options, 193 00:09:36,570 --> 00:09:40,883 and so that's once more gonna be very similar to this one, 194 00:09:41,750 --> 00:09:43,530 and in fact let me go ahead 195 00:09:43,530 --> 00:09:46,453 and cut it from here and paste it here. 196 00:09:48,130 --> 00:09:49,000 Okay? 197 00:09:49,000 --> 00:09:51,600 Of course it's not going to be exactly the same, 198 00:09:51,600 --> 00:09:53,573 but we will leave that for a bit later. 199 00:09:54,500 --> 00:09:55,333 All right? 200 00:09:55,333 --> 00:09:56,323 And then finally, 201 00:09:58,690 --> 00:10:01,423 Create a transport and send email. 202 00:10:06,930 --> 00:10:07,880 Okay? 203 00:10:07,880 --> 00:10:10,530 And so that's, I'll leave that one for later as well. 204 00:10:13,120 --> 00:10:15,440 So, starting with point number one. 205 00:10:15,440 --> 00:10:18,670 And usually up until this point, we only ever use pug 206 00:10:18,670 --> 00:10:20,160 to create a template, 207 00:10:20,160 --> 00:10:22,370 and then we pass the name of the template 208 00:10:22,370 --> 00:10:24,780 into the render function on the response. 209 00:10:24,780 --> 00:10:25,870 Right. 210 00:10:25,870 --> 00:10:27,820 So we always just used it like this 211 00:10:29,890 --> 00:10:31,723 res.render, 212 00:10:31,723 --> 00:10:33,630 and then here the name of the template. 213 00:10:33,630 --> 00:10:34,810 Right? 214 00:10:34,810 --> 00:10:37,370 And what this render function does behind the scenes 215 00:10:37,370 --> 00:10:41,200 is to basically create the HTML based on the pug template 216 00:10:41,200 --> 00:10:43,450 and then send it to the client. 217 00:10:43,450 --> 00:10:46,840 Now in this case we do not really want to render, 218 00:10:46,840 --> 00:10:50,400 all we want to do is to basically create the HTML 219 00:10:50,400 --> 00:10:53,960 out of the template so that we can then send that HTML 220 00:10:53,960 --> 00:10:55,110 as the email. 221 00:10:55,110 --> 00:10:58,520 So basically defining it here as an HTML option 222 00:10:58,520 --> 00:11:00,070 into these mail options. 223 00:11:00,070 --> 00:11:00,960 Okay? 224 00:11:00,960 --> 00:11:04,900 So, remember how we can specify text and HTML. 225 00:11:04,900 --> 00:11:08,790 And mainly we are interested in sending an HTML email. 226 00:11:08,790 --> 00:11:11,340 And so that's why we're gonna have a pug template 227 00:11:11,340 --> 00:11:13,843 from which we will generate this HTML. 228 00:11:15,130 --> 00:11:16,120 Okay? 229 00:11:16,120 --> 00:11:18,720 So it's not gonna be working like this, 230 00:11:18,720 --> 00:11:20,770 but instead we actually need to require 231 00:11:20,770 --> 00:11:22,173 the pug package here. 232 00:11:24,560 --> 00:11:25,443 So, 233 00:11:27,200 --> 00:11:28,780 pug like this, 234 00:11:28,780 --> 00:11:31,120 and then we need to use 235 00:11:31,120 --> 00:11:32,600 pug.renderFile. 236 00:11:36,890 --> 00:11:37,723 Okay? 237 00:11:37,723 --> 00:11:39,490 And so this will take in the file 238 00:11:39,490 --> 00:11:42,450 and then render the pug code into real HTML. 239 00:11:42,450 --> 00:11:43,283 Okay? 240 00:11:43,283 --> 00:11:48,120 And so that we can then save into a variable HTML. 241 00:11:48,120 --> 00:11:48,953 All right? 242 00:11:49,870 --> 00:11:52,330 So, where is that file? 243 00:11:52,330 --> 00:11:55,173 Well, it is at dirname, 244 00:11:56,460 --> 00:11:58,500 so D-I-R name, 245 00:11:58,500 --> 00:12:00,120 which remember is the location 246 00:12:00,120 --> 00:12:01,960 of the currently running script, 247 00:12:01,960 --> 00:12:05,133 and so that is, right now, at this utilities folder. 248 00:12:06,570 --> 00:12:07,403 Okay? 249 00:12:07,403 --> 00:12:10,223 And so from there we need to move one step up, 250 00:12:12,010 --> 00:12:16,000 then go into views, and from there go into an emails folder 251 00:12:16,860 --> 00:12:18,950 that we're gonna also create in a second. 252 00:12:18,950 --> 00:12:19,783 And then in there 253 00:12:19,783 --> 00:12:22,103 is where we're gonna have the template file. 254 00:12:23,450 --> 00:12:24,283 So 255 00:12:25,340 --> 00:12:28,650 template}.pug. 256 00:12:28,650 --> 00:12:32,340 So for the welcome email, this template 257 00:12:32,340 --> 00:12:34,180 is gonna be called welcome. 258 00:12:34,180 --> 00:12:38,920 And so let's now actually create that here in the views, 259 00:12:38,920 --> 00:12:40,293 create a new folder, 260 00:12:42,910 --> 00:12:45,623 email, and then in there new file, 261 00:12:47,730 --> 00:12:48,677 welcome.pug. 262 00:12:49,784 --> 00:12:50,660 Okay? 263 00:12:50,660 --> 00:12:52,860 And we're not going to really be creating 264 00:12:52,860 --> 00:12:56,130 this template in this video but I just wanted to show you 265 00:12:56,130 --> 00:12:58,320 how all of this is gonna work. 266 00:12:58,320 --> 00:12:59,153 Okay? 267 00:12:59,153 --> 00:13:01,750 So this welcome will be paste here into template 268 00:13:01,750 --> 00:13:06,060 and then it will grab that file from the views folder. 269 00:13:06,060 --> 00:13:06,893 Right? 270 00:13:06,893 --> 00:13:08,710 So, that is the first step. 271 00:13:08,710 --> 00:13:11,043 Next up, let's define the email options. 272 00:13:11,980 --> 00:13:16,980 So, from is now this.from. 273 00:13:17,110 --> 00:13:17,943 Remember? 274 00:13:19,060 --> 00:13:20,183 So right here. 275 00:13:21,820 --> 00:13:23,710 Next up, we have 276 00:13:26,130 --> 00:13:30,200 this.to, and we also have the subject 277 00:13:30,200 --> 00:13:34,230 which is equal to the subject that's coming in right here, 278 00:13:34,230 --> 00:13:37,700 and so, yah, actually we don't even need to define this one 279 00:13:39,550 --> 00:13:41,383 and we have our HTML. 280 00:13:42,590 --> 00:13:45,670 So like this, or of course, 281 00:13:45,670 --> 00:13:49,213 that is not even necessary because it's the same name. 282 00:13:51,760 --> 00:13:55,427 Now, next up, we also want to include a text version of 283 00:13:55,427 --> 00:13:57,960 our email into the email. 284 00:13:57,960 --> 00:13:58,793 Okay? 285 00:13:58,793 --> 00:14:01,750 And that's actually really important because it's better 286 00:14:01,750 --> 00:14:05,560 for email delivery rates and also for spam folders. 287 00:14:05,560 --> 00:14:06,670 All right? 288 00:14:06,670 --> 00:14:11,130 And also some people just prefer plain simple text emails 289 00:14:11,130 --> 00:14:14,970 instead of having the more formatted HTML emails. 290 00:14:14,970 --> 00:14:15,900 All right? 291 00:14:15,900 --> 00:14:18,830 And so basically, we need a way of converting 292 00:14:18,830 --> 00:14:21,560 all the HTML to simple text. 293 00:14:21,560 --> 00:14:25,760 So stripping out all of the HTML leaving only the content. 294 00:14:25,760 --> 00:14:27,980 And for doing that, we are going to install 295 00:14:27,980 --> 00:14:29,193 yet another package, 296 00:14:31,640 --> 00:14:36,640 and so this one is called html-to-text. 297 00:14:40,640 --> 00:14:41,810 All right? 298 00:14:41,810 --> 00:14:43,133 Let's include that here, 299 00:14:46,161 --> 00:14:46,994 ToText. 300 00:14:50,520 --> 00:14:54,103 require('html-to-text'), like this. 301 00:14:56,150 --> 00:14:57,560 Okay? 302 00:14:57,560 --> 00:15:00,973 Now let's use that to convert our HTML. 303 00:15:03,260 --> 00:15:07,080 So we use htmlToText.fromString 304 00:15:09,877 --> 00:15:12,340 and then that string is stored in HTML. 305 00:15:13,300 --> 00:15:14,133 Right? 306 00:15:15,620 --> 00:15:18,230 So, these are our mail options, 307 00:15:18,230 --> 00:15:21,160 And actually I forgot something very, very important, 308 00:15:21,160 --> 00:15:24,130 here in this first step, so in this render file, 309 00:15:24,130 --> 00:15:27,200 because just like with response.render, 310 00:15:27,200 --> 00:15:30,010 we can also paste data into render file. 311 00:15:30,010 --> 00:15:32,160 And of course, that is very important 312 00:15:32,160 --> 00:15:35,390 if we want to actually do or email personalization 313 00:15:35,390 --> 00:15:38,283 with the name and also paste in the URL. 314 00:15:39,580 --> 00:15:42,590 And so let's do it just like we did normally 315 00:15:42,590 --> 00:15:44,053 in the render function. 316 00:15:46,290 --> 00:15:51,290 So that's firstName, send it to this.firstName, 317 00:15:53,733 --> 00:15:58,733 and the URL is this.url, 318 00:15:58,910 --> 00:16:01,300 and also let's paste in the subject 319 00:16:02,260 --> 00:16:04,623 and you will see a bit later why we need that. 320 00:16:06,690 --> 00:16:08,300 Okay? 321 00:16:08,300 --> 00:16:11,210 So, now let's finally create a transport 322 00:16:11,210 --> 00:16:13,680 using our create transport function, 323 00:16:13,680 --> 00:16:15,940 and then send the email. 324 00:16:15,940 --> 00:16:20,867 So, fair enough, that's this.createTransport. 325 00:16:23,670 --> 00:16:28,670 So, remember that this is just this method here, this one, 326 00:16:29,200 --> 00:16:30,960 and it has the exact same name 327 00:16:30,960 --> 00:16:33,980 as this function here coming from nodemailer. 328 00:16:33,980 --> 00:16:35,450 So that's a bit confusing, 329 00:16:35,450 --> 00:16:38,583 so let's call it newTransport here. 330 00:16:40,380 --> 00:16:43,847 Okay, and so here that's also newTransport, 331 00:16:45,370 --> 00:16:47,520 so that it's a bit less confusing. 332 00:16:47,520 --> 00:16:48,500 All right? 333 00:16:48,500 --> 00:16:50,783 Now let's remember how we did it here before. 334 00:16:51,620 --> 00:16:53,330 So we had our transporter, 335 00:16:53,330 --> 00:16:55,700 which we created separately in this case, 336 00:16:55,700 --> 00:17:00,360 and then onto that we chained sendMail with the options. 337 00:17:00,360 --> 00:17:04,373 So let's just grab that here, delete all the remaining code. 338 00:17:07,220 --> 00:17:09,319 So basically put that here as a reference. 339 00:17:10,280 --> 00:17:11,130 Okay? 340 00:17:11,130 --> 00:17:13,123 So this transporter is now this. 341 00:17:16,470 --> 00:17:17,700 All right? 342 00:17:17,700 --> 00:17:21,170 And so then on to that, we chain send email 343 00:17:21,170 --> 00:17:23,992 and then with the mail options that we defined up here. 344 00:17:25,010 --> 00:17:27,040 Then, we need to await all of this, 345 00:17:27,040 --> 00:17:30,220 because, of course, it's an asynchronous function. 346 00:17:30,220 --> 00:17:33,043 And so let's now mark this one here as async. 347 00:17:34,880 --> 00:17:35,730 Okay? 348 00:17:35,730 --> 00:17:40,083 And so now, we also need to await the function here. 349 00:17:41,490 --> 00:17:42,323 All right? 350 00:17:42,323 --> 00:17:46,120 Because this.send is now indeed an async function. 351 00:17:46,120 --> 00:17:49,800 And so here we await that so that this function only returns 352 00:17:49,800 --> 00:17:52,000 as soon as the email has actually been sent. 353 00:17:53,120 --> 00:17:56,533 And so, of course, mark this one as async as well. 354 00:17:58,130 --> 00:17:59,380 Awesome. 355 00:17:59,380 --> 00:18:02,920 That's actually it for this class. 356 00:18:02,920 --> 00:18:05,523 So we no longer need this example. 357 00:18:06,450 --> 00:18:07,283 Okay? 358 00:18:07,283 --> 00:18:09,740 And so in the next video, we will then actually go ahead 359 00:18:09,740 --> 00:18:13,570 and use this new class in order to send a welcome email. 360 00:18:13,570 --> 00:18:16,570 So, just very quickly recap what we did here. 361 00:18:16,570 --> 00:18:18,600 So we created a new email class 362 00:18:18,600 --> 00:18:20,730 from which we can create email objects 363 00:18:20,730 --> 00:18:23,610 that we can then use to send actual emails. 364 00:18:23,610 --> 00:18:28,010 And to create a new email object, we will paste in the user 365 00:18:28,010 --> 00:18:31,330 and also a URL that we want to be in that email. 366 00:18:31,330 --> 00:18:35,160 So then here we assign all that stuff to the current object, 367 00:18:35,160 --> 00:18:37,940 and also some other settings that we want to have available, 368 00:18:37,940 --> 00:18:41,890 such as the first name and the sender email. 369 00:18:41,890 --> 00:18:44,000 So basically to abstract this information 370 00:18:44,000 --> 00:18:45,990 away from the send function, 371 00:18:45,990 --> 00:18:48,550 and to have it all in one central place. 372 00:18:48,550 --> 00:18:51,360 Then we have here a new transport function 373 00:18:51,360 --> 00:18:54,290 which makes it really easy to create different transports 374 00:18:54,290 --> 00:18:55,940 for different environments. 375 00:18:55,940 --> 00:18:58,500 And so once more, abstracting that logic 376 00:18:58,500 --> 00:19:00,770 away from the actual send function 377 00:19:00,770 --> 00:19:04,093 which should only be concerned about sending the email. 378 00:19:05,120 --> 00:19:05,953 Okay? 379 00:19:05,953 --> 00:19:09,500 So then here is that send function which takes in a template 380 00:19:09,500 --> 00:19:14,240 and a subject, and based on that it creates the HTML 381 00:19:14,240 --> 00:19:17,370 from a pug template which will then be set 382 00:19:17,370 --> 00:19:19,830 into the email options, which will, 383 00:19:19,830 --> 00:19:23,150 at the end of the function, then finally be sent 384 00:19:23,150 --> 00:19:24,470 in this line of code. 385 00:19:24,470 --> 00:19:25,390 Okay? 386 00:19:25,390 --> 00:19:27,880 But it's not going to be this send function 387 00:19:27,880 --> 00:19:29,950 that we will use in our code. 388 00:19:29,950 --> 00:19:31,840 So instead, we're going to be creating 389 00:19:31,840 --> 00:19:34,183 one different function for each type of email 390 00:19:34,183 --> 00:19:35,417 that we want to send. 391 00:19:35,417 --> 00:19:39,380 And the first one that I created here is the sendWelcome. 392 00:19:39,380 --> 00:19:40,213 All right? 393 00:19:40,213 --> 00:19:43,440 And so for sendWelcome, we basically then preset 394 00:19:43,440 --> 00:19:45,420 the template name as welcome, 395 00:19:45,420 --> 00:19:48,480 and the subject as this string. 396 00:19:48,480 --> 00:19:49,313 Okay? 397 00:19:49,313 --> 00:19:52,723 So, I hope that made sense, and I see you in a second. 29639

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.