30 Days of Python - Day 9 - Send Email & Read Inbox - Python TUTORIAL

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hey there welcome to day nine in this one we are gonna be sending and receiving email using Gmail now the reason we're using Gmail is cuz it's free and also it's fairly easy to set up doing these things now if you don't have a gmail account let's go ahead and do that now go to gmail.com or mail.google.com and log in you should see something like this next you're gonna want to navigate over to your account settings and you're gonna want to go into security and then down on the bottom of security or not the bottom not quite the bottom but you're gonna want to look for less secure app access and you're gonna want to turn this on that's absolutely critical to making this work correctly if you are using your personal account realize that this allows your account to be a little bit vulnerable which is why I recommend just creating a random account in my case I'm using a hungry PI at gmail.com it's not a real account so if you email it not gonna answer the next thing is we want to allow CAPTCHA to this URL right here display unlock CAPTCHA just go ahead and do that and make sure that your account access and is enabled every once in a while you might have to reopen this URL up to allow your Python program to actually login into gmail on your behalf now I will say just in general if you're gonna be using this in a production application you're gonna want to use something more like SendGrid SendGrid is a transactional email service that allows you to send thousands upon thousands if not millions of emails at a time Gmail will start to block that once you get to a certain threshold Gmail will be like nah you can't do that anymore so those are a couple things that we just needed to get out of the way before we get started so now let's go into vs code and we're gonna copy our date 8 folder here and of course I'm gonna rename it to day 9 alright so let's go ahead and create a new module in day 9 and I'm gonna call this send mail pi as in send email and inside here I'll go ahead and define a new function called send mail now yes the function that we're using the module name is identical so this one is going to take our text as in our you know email body it's going to take in a subject so subjects equalling to hello world as in our email subject and then we want to say who we're sending it to so let's just say two emails and I set it equal to an empty list now one of the things that we want to make sure is that this will always be a list so to do this we can say if is instance is instance will check if any give an object or variable is a certain type so I can say two emails is a list or it's a typing out list is a built in class to Python so this is basically saying hey if this is a list then we'll go ahead and say this is all good now a way to sort of raise an error is just to say assert and then get rid of the colon and pass and this will just basically run an error if this is not a list so I can even by default have this in as none you'll see this from time to time to make sure that you know any argument that you're passing is of a certain type so in this case I want it to be a list of emails because there's gonna be multiple people that I might end up sending it to even if it's a one person so it's still gonna be a list of one single person so what we want to do is actually log in to the SMTP server now the SMTP server in our case is going to be Gmail and before you go any further I want to make sure that you are aware that this is just a word break here I just turned on word breaks you can go into preferences into settings and look for a word break or a rather starting out word break but word wrap and you could turn it on or off if I turn it off the code actually just goes off to the side that's that's all that's happening there I don't have some new weird syntax I didn't talk about so anyways let's go back in here and we want to log in to Gmail and actually send a message so what we need to do is say user equals two and password equals two so our username is going to be the actual email that we log in to Gmail with now this isn't always true some SMTP servers or some email servers actually give you a username that's different from the email you're actually sending from so in my case I'm going to be using hungry pie at gmail.com so real email I just don't actually use it so it will send emails but I never check them as the point and I'll put it in my password here let's get it started 20:20 okay so these are my username and password and what I need to do is login to my sm TP server so smtp is the way you can actually send email you might be familiar with this already so we need to use pythons built-in features to do this and luckily for us there's a library called SMTP Lib and we can use this to create our SMTP server now there's two ways to write this like you'll actually see this a couple ways so first of all let's declare a variable in this case I'm calling it server and we're gonna put it equal to SMTP Lib dot SMTP and then we're gonna pass a few arguments in there and then after that we will just do server dot quit okay so what this does is this opens up the server and this quits out that process sometimes what you might see is with smtp Lib SMTP as server and then some code in here which is essentially doing what this is doing right so it's opening up this so it says with this treat it as server so then in here you could write all of the related server things like server login right so I just wanted to mention that because that is something that you'll see from time to time now in my case I'm gonna leave it in as this because I want to know exactly what's going on with all this so I definitely want to make sure that I quit it though I want to quit that of that SMTP you know connection that we have so let's go ahead and do server th ello this is a configuration that we just want to run by default as well as server dot start TLS we want to have a secure connection here and then finally we'll do server login and we'll login the email that we want to use so in our case I'm going to go ahead and pass in one more argument down here which is going to be the from email now I'm also going to set a default of hungry pie at gmail.com and now again the reason I'm changing from email and username is that those are mutually exclusive so I'm gonna go ahead and login with username and password and then we're gonna go ahead and do server dot send mail and we'll do from email so from email being the argument that we're passing in that function and then the two emails as in the list of emails that we want to send and then we need to send an actual MSG string which I'll leave in as MSG underscore STR so of course we haven't actually created the message string and just yet but what this is essentially doing is it's gonna allow me to just call this function and it will send everything that I need to send but all it does so far is actually log in and all that so I want to test this out let's go ahead and jump into the terminal I'm just going to jump into Python 3 and copy and paste in a few things here just to make sure everything is working as intended so we'll do the SMTP server we'll start eh ello in this case I have to run to connect first so I need to add a couple items in here and that says host equals to smtp.gmail.com and the port is going to be equal to five four seven so these are standard ways of connecting to any SMTP server so this is the host that's doing it in this case of course it's Gmail but if you were using something like send grid I believe this is actually the host for it it might be same grid net' but if you use a you know a different service you just need to change what the host is and what port it is typically when you want a secure email which is what we're doing you want to use five four seven that's that's pretty store rather five eight seven sorry not five four seven that's pretty standard as far as actually connecting to it okay so now that we've got that let's reinitialize this server here and we'll do the eh ll now saying that SMTP is at our service so we can actually use it all we need to do is start TLS and it's ready to start TLS next we need to log in with our username and password and I get accepted now of course if you have the invalid password or you didn't allow less secure apps then you will probably run into an error right here that's what I'm going line by line at testing all these and of course send mail this is not going to work because I don't have all of the features for its setup I'm not even gonna worry about that right now the final thing I'll do is actually quit this out just like that okay so now it's quit and if I try to log in again it's showing me that it's disconnected right so I have to reconnect it by reinitializing it like we did here and again if we did this with call here it would do something very very similar to what we just did but it would automatically quit on its own after we exit this little block here okay so now let's go ahead and create the from email to emails and message string portion of this now the from email is actually just an email right here but I can format this just a little bit more and call this like hungry pie and put brackets around it just like that this gives you a name in there if you will so like if you're used to using Gmail and you see let's go into all mail when you see stuff like Google or an actual listed out name right that is where that comes from ok that's where this portion comes from cool so we can actually pass that in the next is the two emails well two emails is a list of emails that should be fine and then finally the message string so ms g-- str equals to something now if you notice we didn't actually use subject and the reason for this is because we didn't actually formulate an email message we can use a string potentially but more likely you won't be able to use a string to actually send a valid email anywhere you have to do a lot of default things that emails have so to do this we need to import a few items that are built into Python so we'll go ahead and do from email dot meme dot text import meme text look at that it completes it for me so from email dot meme multi-part import meme multi-part there we go so the reason I'm using multi-part is so I can attach both a plain text email and an HTML email or I can also attach files which is something we're not gonna cover it just gets a little bit too advanced there so what we're gonna do now is we're gonna say msg equals to this multi-part me multi-part I'm gonna put parentheses at it we're gonna call it initialize it and I'm gonna put a string in here called alternative and in here I'll go ahead and do msg from notice the capital there we're gonna use that from email again and now I'm going to do msg and 2 again capital and this is going to be that list there so two emails but we don't want it to just be a list we want to be a comma separated list right so what does a comma separated values string look like well let's go back into the terminal I'm going to exit out of this recent session and go into Python 3 again and now we'll go ahead and say my list equals to ABC one two three notice these are all strings here and then I can use this empty string join my list and hit enter what it does is it takes every item in here and turns it into one long string or whatever it is that I'm putting in this joins so if I press up here and put a comma there this is now comma separated values of a list now a cool thing about that is I can do the opposite of that so let's go ahead and say my items equals to this join call alright so I can print out my items and it gives me that I can do the opposite of that by doing my items that's split and we split on a comma right so there is commas in there so it's going to split on the comma and that's going to bring us back to that list which is pretty cool so what we need to do on our emails is actually joining in a similar fashion but of course you can also add additional things into this string so if you wanted to you know do something like that it will join each one like that so just keep that in mind when it comes to actually using this or if you needed to do a dash that's how you do that right so whatever string you put in there is going to go basically in in place of what the comma is and if we do a comma in a space it just turns it into one nice long string which is how we actually want to do this okay cool so now we do that comma and string and they will join those two emails so now we have the two portion of this message next we need to MSG and subject and we're going to set that equal to our argument of subject from up here okay now what I need to do is actually attach the text or the body text that I'm passing through in here so the first thing in part the part about this is we'll just go ahead and say txt part equals to meme text like we did when we imported here and then we want to pass in our text right here and you might need to change the encoding here depending on your language let me know in the comments if you want to know how to do that but the idea is that we use plain text here and then this we will go ahead and attach so msg attached to the multi-part item and then with that I'll copy this then paste right underneath and we'll call this HTML part and this time instead of playing we would use HTML and I'll go ahead and do h1 this is working ok so initially I'm not actually going to use the HTML part I'll leave that out for just a moment while we test this finally the MSG underscore string is really just this original message and then dot as string just like that okay so we're now ready to actually send this message we're ready to run send email so let's go ahead and try this out I'm going to jump into my terminal I'm going to exit out of that Python shell that we had and I'm gonna CD into day nine and we're gonna go ahead and run the interactive shell of Python 3 of send underscore mail hi okay so now I should be able to send mail and I want to add a to let's see we said we called it two emails I need to actually have two emails and in this case I'll just say hungry pie at gmail.com just like that I left everything else the default the text will just say email body the subject hello world and so on and I'm gonna go ahead and hit enter and it loaded seems like it worked I'm gonna jump into Gmail and just take a look and sure enough there it is of course I'm sending it for myself but notice that the you know the from email message is correct the email body is coming through so that's good all right so let's try that again this time I'm going to go ahead and attach the HTML message which we had right here so I'm gonna go ahead and exit out of this go back in press up a couple times send it again and back into my emails and now I've got some HTML message coming through in there as well pretty cool so this means then I should have one more argument in here and we'll call it HTML equals to none and then I'll just basically say if hTML is not equal to none then I'll go ahead and pass it in and add it like that so the past HTML arguments if it's not equal to none we're gonna go ahead and attach that as our string and Gmail and many other mail services will actually use the HTML version and not the plain text version even if it actually has the plain text version cool and of course I can change my text and my subject and my from email and finally of course my to email all right so a word a note is the username and password this is not a secure way to do this there are other ways called environment variables which is not something we're going to cover right now but you should be aware of it that you might want to actually store these things in and going further using something like send grid will give you different kinds of ways of authenticating to send email but now that we have this send mail function let's go back into our send pie and in this case I actually want to use send mail in descent right like we actually did have something like that so I'm gonna go again and say from send underscore mail import send mail right so our send mail module that's the name there and then our function was called also send mail okay so we have our formatted message with somebody's right so sendmail Walgren we're gonna replace a lot of these things down here and I'm gonna go ahead and say send mail the txt is going to be the MSG that we format it up here right and I don't have HTML for this so I don't need to worry about that the two email well we should probably have send have a two email and I'm gonna set this equal to none notice that I'm not putting a big list here but rather just one single email and two emails is going to be a list with only two email in there so I need to of course assert that two email is not equal to none like we don't want it to be none all right we want to be some value in there of course I could do other checks in there like if it's a valid email address and all that I'm not gonna worry about that at this point but I will try and actually send it this message and we'll do it using all of this now of course the two email needs to be in there as well so we put name in the first position let's go ahead and put email in the second position so if the length of sis Arg V is greater than two then email equals to to and then to email equals to that email put a comma there okay and with that verbose print statement I'll go ahead and add in the two email here all right so now I should have a better formatted message to what's coming through and send mail does not have HTML coming through in here so I can declare it just to make sure that I have HTML equal to none because I'm not passing in the HTML now we can save that and I'm gonna go ahead and exit out of this shell here now it's important that we're in the correct directory so make sure you do cat and you can see that send mails in there so I'll go ahead and do Python 3 and it's gonna be send hi Justin and then finally hungry pie at gmail.com I hit enter and I get none back that's okay we'll see why in a second let's go back into our email here and what do you know there it is we actually are able to send a message and of course I can do it again and again and again as many times as I need now the reason I'm getting this nun back it has to do with send mail like it's not actually returning any sort of response as we see here right and we also might run into an issue with the actual email let's say for instance I put the wrong password in and I try to run it I'm going to get this SMP SMTP authentication error so this is where we want to use something called a try block we're gonna use try in here and then we'll go ahead and say accept pass and I'll say sent equals to true and sent equals to full ok and then down here we'll go ahead and return sent whether or not it will sit so say true or false value of what this response is so I saved that and remember outside of that try block if I didn't have that try block in here this is what we saw now with that try block in here we see false right so it's basically just ignoring the fact that it was not sent and if I put 20/20 in here going back and run it again now it says true so it's actually sent pretty cool so that's actually sending emails it's very useful and I do not expect you to remember how to do all of these things all you need to remember really is messages are unique email messages are unique they're not just a plain text of string right now a plain string text you have to add additional things to it such as to from and subject and then we can attach an email and we just need to connect into the server and send the message there and then finally quit that email server so that's sending messages now what we need to do is actually open up our inbox and take a look at some of those messages it's gonna be similar we're gonna be using our authentication we're gonna be importing some things and it's meant to be more of a long-term reference than it is to be something that you need to memorize hey there this section is a little challenging I do encourage all of you to go through it because what we've done up into this point has prepared you to make this feel a little bit easier it's still gonna be challenging and it's still a little bit of a stretch but I do hope that you go through it and use the reference code when you get stuck so you don't have to type and copy and keep up with everything that I'm doing you can literally copy all of the reference code just to make it happen if you need to but the idea here is that we do something brand-new that we've never done before that might be a little bit harder so let's go ahead and do it now that we have a way to send email I'm gonna show you a way to check your inbox now I don't expect you to remember how to do all these things and I'm not gonna go into that much detail because we start to lose the purpose of just checking this inbox anyway the main reason for this is just to understand that we can do it and we have reference to do it the purpose of day9 was really to get that send email function out there but as a bonus I wanted to show you also how to to open up your inbox so let's go ahead and jump in day 9 and I'm gonna make a new file in here called inbox pi and in here we want to import something called IMAP Lib now you might be familiar that IMAP is a way to actually open up your inbox where SMTP SMTP is a way to send a message from your mail server so IMAP is not able to send messages like SMTP and SMTP is not able to open messages like IMAP so we're going to import IMAP and we're gonna also import email and then I want to grab my host and that's gonna be imap.gmail.com of course or whatever your imap hope host is and then I want to grab my username and password again I'm just gonna go ahead and copy and paste from send mail here okay and now I just need to log in to this mail server I'm just gonna call it mail and IMAP dot mmm for loop IMAP for underscore SSL we're gonna initialize that with the host that we had here and then we'll go ahead and do mail dot login with the username and password that we had and then we're gonna go ahead and say mail dot select to the inbox this is our default inbox that we're gonna be grabbing here there are other ways to select different kinds of inboxes but for the vast majority of you this is gonna be the easiest way to do it so what we want to do is actually search in here for unseen messages you can get all of the messages or you can just grab the unseen ones so I'm gonna use an underscore here as a placeholder for a variable which I'll show you in just a second so we do search data equals to mail dot search and we're gonna say none and quote on-scene all-capital okay so so what the heck is going on here well if we look into the Python shell is it a good thing to chest check out we can say something like ABC and another is equal to 1 2 3 comma something like that right so this is called unpacking in two different variables you can also say another equals to 1 2 3 and like that but now if we look into another it's a different data type that we haven't talked about but it's very similar to a list except you can't really change it it's called the tupple or tuple spelled like that and if you want to unpack it you can just say ABC x equals to another and that's a easy way to unpack it now oftentimes you'll see if you only want one piece of that you can use an underscore with a comma just as a placeholder for that value like you're not actually gonna end up using that value so you'll see underscores like this all the time so again I'm not actually using that value but I wanted to unpack the results from this itself and like most programs that we end up writing you can feel free to copy and paste this into the shell or use the interactive shell and actually go through each one to see what exactly is going on again this is meant to be a reference just to really quickly see what are our recent inbox items if we are so interested so now what I'm going to do is I want to actually look for what's inside of this search data like there's actually results with this search or there's potentially results so I want to actually grab what those results are let's actually see what that looks like so printout the search data so I did mention that you could do this on your own but we're gonna just try this one out as an example okay so when I print out search data this is what I get back okay so this might start to get a little complicated because if I print out search data is 0 it says B and four or five six what does that do for me well if I actually do split what that does then is it turns each one of those items into a list item if you remember a little bit ago we talked about switch but we did it with comma in this case if you don't actually put anything in there it will just split that data based off the spaces by default so now it's split data so I can actually iterate through this and find the message that's related to that one of the words I can say for num in the search data dot or rather search data 0 because remember came back as a list Oh kind of a weird list but a list them nonetheless so we get the first item in that list and then we split it okay again here's the list that comes back then when we get that first item that's what it looks like then we split it it turns into its own list and then we can actually use these for something so each one of these things actually references the email message that we're looking for so I'm going to go ahead and that again an underscore and data equals to mail dot fetch and then the number that we are iterating through and then we also need to pass in this argument here of an a string with parentheses and our FC 8 to 2 so this will allow us to actually grab the correct message or the message that's in there and again we can print out what that data is so let's go ahead and print that out I should have that search data still in there it looks like I do so I come in here and this is actually printing out a jumbled version of the actual item that we're looking for this is the actual messages that are in here as you see you can you can kind of tell what's going on you can kind of not so that of course means we need to parse this data a little bit more but if we search through that again what we see is some interesting things about it so this this last one right here notice that it's a list right so there's actually a list item in here so I can go ahead and say 0 and we can print what that out that is now and now it's showing me yet another item in here so it's showing me a couple this time and we can expand that tupple so I could just go ahead and say a and B equals 2 again the data itself and this time we go to print out a and B just to separate them a little bit and get rid of these print statements here and run it through and we've got this separated thing out it's a little bit harder to tell so let's just go ahead and print out because I know that's the one that I want so again I'm gonna go ahead and copy and paste this in here and B is now the string that only and abusing but it's notice that there's a B in front of it like as in bytes so I want to turn that into a string itself so I use an underscore and then I'll go ahead and say msg string equals to the string of B so this is turning that original bytes into a string here and now what we want to do is you parse this out so again I can print out what that is some message string and message string let's go ahead and copy this and paste it in here and there we go we've got our message string here and now I don't it looks like it's still actually treating these as bytes so it's not actually changing that because doing a string like this doesn't necessarily change it so I'm gonna I'm gonna leave it in just as B and so we want to break this down into saying email message equals to e mail dot message from bytes and we'll go ahead and pass in the bytes there the B and I'll go ahead and print out email message and let's see if that gives us the correct value here it looks like it does notice that this is now starting to look a lot more like an email as you may expect okay so that's pretty cool and that's actually coming from the inbox but we can go a little bit further with parsing this data and so I can do something called for part in email message dot walk with the parentheses and then if parts get content type equals to text plain no worries if you don't have to do this yet we'll talk about it I'm gonna go ahead and just say body equals to parts get payload and decode eat going to true and we'll go ahead and print out that button okay we can also say or parts get content type equaling to the text slash HTML probably did plain or HTML this will print out both of them or at least it should so let's go ahead and comment out that print again we'll run through this data again and oops we said half this is a typo that should say part and one more time let's run it and there we go so this is actually giving me the actual data that's in that content as you notice it's the ones that we sent just a little bit ago so that's pretty cool I mean I now have a way to see what this body data is and it's actually coming through in a way that's that's somewhat useful now it's still coming through with the bytes so without decoding anything let's try message from string in here without changing anything else and let's see if this actually works for us so I'll run that through and now I'm getting an error saying that that it can't be bytes it has to be a string so we have to use bytes or we can decode those things right there but I'm not going to go that far in this and what the only next part I'm going to do is actually go ahead and say for header in subject to and from and date I'll go ahead and print out using some formatting here and then dot format some string substitution format it is of course header and then email message header so getting the actual value of whatever that header is so again we save that and go ahead and copy this whole thing and refresh that and now I've got my subject to from and then the actual text that came back from it as bytes and that's actually not that hard to change we would just do body dot decode because it is bytes and we can run this yet again come back in here and there we go we now have our subject two and so on so I'm gonna do one more thing and that is getting the content type I'm going to go ahead and copy this for the HTML portion and I'll say if content type is that then I'll go ahead and say HTML body is equal to that value and then I'll get rid of that or statement there and we can actually use this in as L if and now what I'm to do is just create a dictionary for this message so I'll go ahead and say the message or the data or let's say email data equals to an empty dictionary here and we're going to set this into empty dictionary inside of all this data so I'll go ahead and say email data header equals to the actual value from the email message and then email data body equals to that body decode and then same thing with the HTML body and HTML body HTML body decode okay and I'm gonna get rid of these print statements and then I'll go ahead and make a list up here I'll go ahead and call this my messages he goes through this list here and then at the end of that loop statement like after these two for loops come through I'm gonna just do my message dot append email data and then finally I'll wrap this whole thing into a function called get inbox and it's gonna be all of this stuff right here and all it's going to do is return my message or rather my messages but it's gonna return that list of my message which would be really my inbox and again we'll do that main call if name underscore underscore equals to main will go ahead and say my inbox equals to get inbox and then we'll just print out my inbox we'll save that I'm going to exit out of the terminal here clear it out and we'll run Python - I in bucks that PI and it should actually do that look up for me it's giving me nothing so it looks like it didn't actually find any messages that were unread so let's go ahead and hit exit I'm gonna go ahead and send a few messages to myself and there we go man let's run that inbox call again and I used Python when I should have used Python 3 Python 3 - I inbox dump I oops I'm inside of Python my mistake so Python 3 in Beck's inbox that PI and there we go so we actually have some some or a single message coming through in here and naturally if I look in my inbox is an one single unread message right so IMAP is doing that for me so if I try to get the inbox now I'll probably get none right because they all have been seen now if I left let's go ahead and exit out of Python and clear this out press up a few times I'll send a few more messages and then finally Python inbox pi and again I messed up it should be Python 3 in Box top pie and there we go so this is giving me one of those messages back it's not necessarily giving me all of them or perhaps it is let's see oh yeah it does look like it actually is giving me all them here's one of them here's the other one and as we see here - subject and subject ok so that is how we do it and notice that it actually is saying that those are seen now so every time I send myself a message let's just try this one more time by going up so I sent a message to myself right so we refresh in here inside of Gmail I had that message and now if I press up a couple more times again and look at the Inbox it's grabbing that message i refresh in here and it is marking it as read so it's like like as if we did see it which is pretty cool so that's how IMAP works so you're actually able to grab that message take a look at it read it if you need to and then now when I go in here I have no unread messages right so there's obviously a disadvantage of this is like a wall if I'm looking at these messages and I don't want them to be looked at or treated as read then of course I need to use a different method so there's no doubt in my mind that this was a little bit of a stretch for you sending email also might have been a little bit of a stretch but certainly in the inbox itself is a little bit uncomfortable because of all of these kind of breaking things apart looking for certain indexes splitting things and I get it like that I totally realize that but the point of this was to give you a reference on how to open up an inbox something that you could use right now but also to show you that the more advanced stuff that you'll be learning is not that far away from what you know already in the example of this first three lines here now this is something you haven't seen yet you haven't seen a class and running functions from a class which is what we did right here but they're still functions and they still work in a similar fashion than what we've seen with either an empty function or one like formatting PI and then of course we loop through some data here we split up some data we got some stuff from the index and then we did some other methods that you know really you'd have to look up in the documentation to really understand how to do this that's what I did before I actually started recording this I went and made sure that all of these pieces actually worked and then I used that reference itself right so here it is here's the reference that I was going off of to make sure that I could go through all this with you and explain as much of it as as possible but I certainly am NOT gonna remember this oft on my head why would I it doesn't make sense to but the point is that now we have a reference to use something real and we have a little taste of what a little bit more of a challenging problem would look like with the skills that we already have in my hope for you is actually that you got more questions and felt a little bit more confused than you ever have in this series because once you have those questions and that confusion that's when you feel really really good once you start to have a really understand those various things so thanks so much for watching day 9 I realize this one was a lot longer but we packed in a lot for you that is a very practical something that you can do right now so by all means feel free to send mail email to hungry pi at gmail.com you can blow that thing up as much as you want naturally this password is gonna change by the time you see this video so don't try it but definitely check out your own email and consider using your send mail fairly often in your various projects what's cool about this too is that you can absolutely loop through a number of items we don't have to do Stu one-off so you can you could send a hundred emails this way as response to messages of any kind so thanks again for watching and see you next time
Info
Channel: CodingEntrepreneurs
Views: 50,097
Rating: 4.9019794 out of 5
Keywords: djangourlshortcfe2018, install django with pip, virtualenv, Django Web Framework (Software), Mac OS (Operating System), Python (Software), web application development, installing django on mac, pip, django, beginners tutorial, trydjango2017, install python, python3.8, django3.0, python django, web frameworks, install python windows, windows python, mac python, install python mac, install python linux, pipenv, virtual environments, 30daysofpython, beginner python, python tutorial
Id: 6DD4IOHhNYo
Channel Id: undefined
Length: 45min 56sec (2756 seconds)
Published: Sat Mar 21 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.