Ik heb eigenlijk geprobeerd een programma te schrijven dat e-mails naar een lijst met gebruikers stuurt. Ik heb het onderstaande programma uitgevoerd en het vertelt me dat TypeError: ‘dict’ object niet kan worden opgeroepen. Ik kan niet begrijpen wat hier mis is en hoe ik het kan oplossen. Ik weet dat het een lange code is, maar elke vorm van hulp zou op prijs worden gesteld. Ik heb misschien wat domme fouten gemaakt, maar ik kan er niet bij.
import datetime
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
host = "smtp.gmail.com"
port = 587
username = "testmail3018"
password = "******" #not disclosing the password
from_email = username
to_mail_list = ["[email protected]",
"[email protected]"]#to_email always have to be a list
#not using this list anymore in this programme
class MessageUser():
User_Details = []
Messages = []
Email_Message = []
base_message = """Hi {name}!
Thank you for the purchase on {date}.
We hope you are exicted about using it. Just as a
reminder the purcase total was ${total}.
Have a great time!
from Pritom_Mazhi
"""
def add_user(self, name, amount, email=None):
name = name[0].upper() + name[1:].lower() #Capitalizing the first
letter of all names - formatted name
amount = "%.2f" %(amount) #formatted amount
detail = {
"name" : name,
"amount" : amount,
}
today = datetime.date.today()
date_text =
'{tday.day}/{tday.month}/{tday.year}'.format(tday=today)
#formatted date
detail["date"] = date_text
if email is not None:
detail["email"] = email
self.User_Details.append(detail)
def get_details(self):
return self.User_Details
def make_message(self):
if len(self.User_Details) > 0:
for detail in self.get_details(): #for detail in
self.User_Details
name = detail["name"]
amount = detail["amount"]
date = detail["date"]
#email = detail["email"]
message = self.base_message
formatted_message = message.format(
name = name,
total = amount,
date = date
)
user_email = detail.get("email")
if user_email:
user_data = {
"email" : user_email,
"message" : formatted_message
}
self.Email_Message.append(user_data)
else:
self.Messages.append(formatted_message)
return self.Messages
else:
return []
def send_email(self):
self.make_message()
if len(self.Email_Message) > 0:
for item in self.Email_Message:
user_email = item("email")
user_message = item("message")
try:
gmail_connection = smtplib.SMTP(host, port)
gmail_connection.ehlo()
gmail_connection.starttls()
gmail_connection.login(username, password)
the_message = MIMEMultipart("alternative")
the_message["Subject"] = "hi there! trying to send
some billing messages or messages like that"
the_message["From"] = from_email
the_message["To"] = user_email
part1 = MIMEText(user_message, 'plain')
the_message.attach(part1)
gmail_connection.sendmail(from_email, [user_email],
the_message.as_string())
#to_email always have to be a list
gmail_connection.quit()
except smtplib.SMTPException:
print("error sending mails or messages")
#return False - could be used here instead of using
below but while iterating this wouldn't be good
return True
return False
obj = MessageUser()
obj.add_user("Pritom", 123.32, email='[email protected]')
obj.add_user("jon Snow", 94.23, email='[email protected]')
obj.add_user("Sean", 93.23, email='[email protected]')
obj.add_user("Emilee", 193.23, email='[email protected]')
obj.add_user("Marie", 13.23, email='[email protected]')
obj.get_details()
obj.send_email()
de uitvoer staat in bijgevoegde screenshot.
de terminal geeft de volgende fout weer:
Hertraceren (meest recente oproep als laatste)
Bestand “day_12.py”, regel 118, in
obj.send_email()
Bestand “day_12.py”, regel 78, in send_email
user_email = item(“e-mail”)
TypeError: ‘dict’-object kan niet worden opgeroepen
Antwoord 1, autoriteit 100%
in python heb je twee manieren om toegang te krijgen tot waarden in een dictaat:
dict['key']
dict.get('key')
dict('key')
werkt niet.