在python Tkinter中发送电子邮件时可以更改地址

如何解决在python Tkinter中发送电子邮件时可以更改地址

我是Python的初学者,在Stackoverflow类开发人员的帮助下,我设法构建了以下内容。

这是一个随机的会议主持人选择器。您基本上是选择一个论坛并选择一种工程师,然后它将随机选择一名工程师主持会议。

问题:我需要有关电子邮件部分的帮助。选择此人的姓名后,如何发送电子邮件?它需要能够使用下拉列表中的电子邮件更新toaddr。电子邮件正文还必须说“嗨[名称],您是下一个[选择论坛]的主持人,而当前,它说”嗨。!label3,您是下一个“无”的会议主席”

Secure

解决方法

对于电子邮件,您可以执行以下操作:

  • 创建名称词典>电子邮件。假设所有名称都是唯一的
  • 设置工程师文本时,请存储工程师电子邮件
  • 发送电子邮件时,请使用存储的电子邮件地址并拆分名称以获得名字
  • 对于论坛名称,只需创建一个名称数组,然后使用f变量选择索引

这是更新的代码。请注意,我根据名称创建了一个虚假电子邮件列表。您将需要手动创建此列表。

from tkinter import *
import random
import datetime
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

root = Tk()
root.title('Random User Entry')
root.geometry("550x600")
root.configure(borderwidth="1")
root.configure(relief="sunken")
root.configure(cursor="arrow")
root.configure(highlightbackground="white")
root.configure(highlightcolor="black")

# f = forum,e = engineers
f = IntVar()
e = IntVar()

# Forums
networkcore = ['Tom Reeves','Joe Soap','John Smith','David Jones','Michael Johnson','Chris Lee']
security = ['Raven Kyle','Billy Joel','James Gonzalez','Maria Lopez','Justin Bright','Ali Baba']
unifiedcomms = ['Mary White','Mike Brown','Mark Williams','Paul Rodriguez','Daniel Garcia']
designreview = ["Dave Brazel","Gwendolyn Vogue","Nikole Eaves","Gaye Mccune","Maricela Chance","Bret Hazelip"]
automation = ["Renna Geeter","Ken Stotz","Nenita Penaflor","Delena Lumpkins","Jacqui Noles","Chau Wardla"]
cloud = ["Nina Perea","Lila Frederickson","Brooks Baskette","Esperanza Slavin","Elisa Duplantis"]

# un = username | eng = engineer
junior_eng_un = ['Raven Kyle','Ali Baba','Tom Reeves','Mary White','Mark,Williams','Daniel Garcia',"Dave Brazel","Bret Hazelip"]

senior_eng_un = ['David Jones','Chris Lee',"Nina Perea","Elisa Duplantis"]


# generate fake email dictionary,assumes all names are unique
emaillist = {}  # will be dictionary of names >  name:email
for lst in [networkcore,security,unifiedcomms,designreview,automation,cloud]:  # all names
    for nm in lst:
        emaillist[nm] = '.'.join(nm.split()) + '@gmail.com'  # map name to email

host_email = ""  # for email reminder


def tick():
    datenow = datetime.datetime.now()
    time_string = datenow.strftime("%d-%m-%Y %H:%M:%S:%p")
    clock.config(text=time_string)
    clock.after(200,tick)


clock = Label(root,font=("times",12,"bold"),fg="black",bg="lightgrey")
clock.grid(row=9,column=1,pady=3,padx=20,sticky=NW)
tick()


def update_engineer_list():
    global engineers
    forum = f.get()
    engineer_group = e.get()
    if forum and engineer_group:
        # both forum and engineer group are selected
        forum_engineers = networkcore if forum == 1 else security if forum == 2 else unifiedcomms if forum == 3 \
            else designreview if forum == 4 else automation if forum == 5 else cloud
        # get available engineers for the selected forum
        if engineer_group == 1:  # Junior
            engineers = [engineer for engineer in junior_eng_un if engineer in forum_engineers]
        elif engineer_group == 2:  # Senior
            engineers = [engineer for engineer in senior_eng_un if engineer in forum_engineers]
        elif engineer_group == 3:  # all
            engineers = forum_engineers
        # update engineer list
        engineer_list.config(state=NORMAL)
        engineer_list.delete(1.0,END)
        engineer_list.insert(END,"\n".join(sorted(engineers)))
        engineer_list.config(state=DISABLED)
        # clear host engineer
        host_engineer["text"] = "Busy Randomising!!"


def choose_host():
    global host_email
    # extract the engineer list from the engineer selection box
    engineers = engineer_list.get(1.0,"end-1c").split("\n")
    # then select one of them randomly
    host_engineer["text"] = random.choice(engineers)
    if host_engineer["text"] in emaillist:
        host_email = emaillist[host_engineer["text"]]  # for email reminder
    else:
        print("No email for '"+host_engineer["text"]+"'")


def clear_fields():
    engineer_list.config(state=NORMAL)
    engineer_list.delete(1.0,END)
    host_engineer["text"] = ""
    return()


def list_email_addr():
    email_label = Label(root,text=clicked.get(),font="Helvetica 10 bold",fg="blue")
    email_label.grid(row=6,padx=12,sticky=NW)


email_options = ['Click Select Email Address:',"Maria.Lopez@gmail.com",'Raven.Kyle@gmail.com','Billy.Joel@gmail.com','James.Gonzalez@gmail.com' ]
clicked = StringVar()
clicked.set(email_options[0])
email_label_drop = OptionMenu(root,clicked,*email_options)
email_label_drop.grid(row=6,sticky=NW)

def email_reminder():
    # get forum name
    flist = ['Networking Forum','Security Forum','Unified Comms Forum','Design Review Forum','Automation Forum','Cloud Forum']
    fname = flist[f.get()-1]
    
    # Need to actual from and to address
    fromaddr = "abc@abc.com"
    toaddr = host_email
    msg = MIMEMultipart()
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = "Meeting Host Reminder "
    body = "Hi " + str(host_engineer["text"].split()[0]) + ",You are the meeting chair for the next " + fname
    msg.attach(MIMEText(body,'plain'))
    text = msg.as_string()
    print('Email msg:\n',text)
    # Need to actual domain
    server = smtplib.SMTP('smtpmail.domain.com',25)
    server.sendmail(fromaddr,toaddr,text)
    server.quit()
    return ()


topLabel = Label(root,text="Random Meeting Host Selector",font="Helvetica 20")
topLabel.grid(row=0,columnspan=2,pady=5,padx=20)

fb2 = Radiobutton(root,text="Security Forum",font="Helvetica 12",variable=f,value=2,command=update_engineer_list)
fb2.grid(row=1,column=0,padx=10,sticky=W)
fb1 = Radiobutton(root,text="Networking Forum",value=1,command=update_engineer_list)
fb1.grid(row=2,sticky=W)
fb3 = Radiobutton(root,text="Unified Comms Forum",value=3,command=update_engineer_list)
fb3.grid(row=3,sticky=W)
fb4 = Radiobutton(root,text="Design Review Forum",value=4,command=update_engineer_list)
fb4.grid(row=4,sticky=W)
fb5 = Radiobutton(root,text="Automation Forum",value=5,command=update_engineer_list)
fb5.grid(row=5,sticky=W)
fb6 = Radiobutton(root,text="Cloud Forum",value=6,command=update_engineer_list)
fb6.grid(row=6,sticky=W)

eb1 = Radiobutton(root,text="Junior Engineers",variable=e,command=update_engineer_list)
eb1.grid(row=1,sticky=W)
eb2 = Radiobutton(root,text="Senior Engineers",command=update_engineer_list)
eb2.grid(row=2,sticky=W)
eb3 = Radiobutton(root,text="All Engineers",command=update_engineer_list)
eb3.grid(row=3,sticky=W)

hostButton = Button(root,text="Select Next Meeting Host!",fg="blue",command=choose_host)
hostButton.grid(row=7,padx=40,sticky=NW)

# engineer list for selection
engineer_list = Text(root,width=30,height=20,bg="lightblue",relief=SUNKEN,state=DISABLED)
engineer_list.grid(row=7,pady=1,sticky=E)

# host engineer chosen
host_engineer = Label(root,width=20,height=2,bg="lightgreen",font="Helvetica 14 bold",bd=2,relief=SUNKEN)
host_engineer.grid(row=7,pady=33,sticky=N)

emailButton = Button(root,text="Click to Send Email Reminder",command=email_reminder)
emailButton.grid(row=5,padx=14,sticky=NW)

clearButton = Button(root,text="Clear Selections!",font="Helvetica 10",fg="red",command=clear_fields)
clearButton.grid(row=4,pady=2,sticky=NW)

root.mainloop()
,

我试图尽可能少地更改您的程序。为了回答有关主机名标签字段的问题的第一部分,tkinter使用字典结构来存储小部件的属性。因此,您需要使用host_engineer ['text']来检索标签小部件上的文本。

由于您说过您是Python的新手,所以我真的建议您阅读有关列表和字典的内容。字典非常有用,但是在遍历字典时要小心,不能保证顺序!

由于这个原因,我添加了一个“论坛名称”列表,用作每个论坛中用户词典的键。这将我带到您的问题的第二部分。由于列表的顺序是固定的,因此允许我们在用户界面上创建单选按钮时使用列表,从而可以使用所选单选按钮的值作为索引来查找所选论坛名称。然后,该名称可以用作forum_users词典中的键。

可以对工程组进行相同的更改,但是正如我所说的,我试图保留尽可能多的代码。

from tkinter import *
import random
import datetime
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

root = Tk()
root.title('Random User Entry')
root.geometry("550x600")
root.configure(borderwidth="1")
root.configure(relief="sunken")
root.configure(cursor="arrow")
root.configure(highlightbackground="white")
root.configure(highlightcolor="black")

# f = forum,e = engineers
f = IntVar()
e = IntVar()

# list of forum names in the order to be displayed
forum_names = ["Security Forum","Networking Forum","Unified Comms Forum","Design Review Forum","Automation Forum","Cloud Forum"]

# Forums
forum_users = {}
forum_users["Networking Forum"] = ['Tom Reeves','Chris Lee']
forum_users["Security Forum"] = ['Raven Kyle','Ali Baba']
forum_users["Unified Comms Forum"] = ['Mary White','Daniel Garcia']
forum_users["Design Review Forum"] = ["Dave Brazel","Bret Hazelip"]
forum_users["Automation Forum"] = ["Renna Geeter","Chau Wardla"]
forum_users["Cloud Forum"] = ["Nina Perea","Elisa Duplantis"]


# un = username | eng = engineer
junior_eng_un = ['Raven Kyle',"Elisa Duplantis"]


def tick():
    datenow = datetime.datetime.now()
    time_string = datenow.strftime("%d-%m-%Y %H:%M:%S:%p")
    clock.config(text=time_string)
    clock.after(200,tick)


    clock = Label(root,bg="lightgrey")
    clock.grid(row=9,sticky=NW)
    tick()


def update_engineer_list():
    forum_row = f.get()
    engineer_group = e.get()

    # both forum and engineer group are selected
    if forum and engineer_group:
    
        #get forum users
        forum_engineers = forum_users[forum_names[forum_row-1]]

        # get available engineers for the selected forum
        if engineer_group == 1:  # Junior
            engineers = [engineer for engineer in junior_eng_un if engineer in forum_engineers]
        elif engineer_group == 2:  # Senior
            engineers = [engineer for engineer in senior_eng_un if engineer in forum_engineers]
        elif engineer_group == 3:  # all
            engineers = forum_engineers
        # update engineer list
        engineer_list.config(state=NORMAL)
        engineer_list.delete(1.0,"\n".join(sorted(engineers)))
        engineer_list.config(state=DISABLED)
        # clear host engineer
        host_engineer["text"] = "Busy Randomising!!"


def choose_host():
    # extract the engineer list from the engineer selection box
    engineers = engineer_list.get(1.0,"end-1c").split("\n")
    # then select one of them randomly
    host_engineer["text"] = random.choice(engineers)


def clear_fields():
    engineer_list.config(state=NORMAL)
    engineer_list.delete(1.0,sticky=NW)


    email_options = ['Click Select Email Address:','James.Gonzalez@gmail.com' ]
    clicked = StringVar()
    clicked.set(email_options[0])
    email_label_drop = OptionMenu(root,*email_options)
    email_label_drop.grid(row=6,sticky=NW)


def email_reminder():
    # Need to actual from and to address
    fromaddr = "abc@abc.com"
    toaddr = "def@def.com"
    msg = MIMEMultipart()
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = "Meeting Host Reminder "
    body = "Hi " + str(host_engineer['text']) + ",You are the meeting chair for the next " + forum_names[f.get()-1] + " meeting."
    msg.attach(MIMEText(body,'plain'))
    # Need to actual domain
    #server = smtplib.SMTP('smtpmail.domain.com',25)
    text = msg.as_string()
    #server.sendmail(fromaddr,text)
    #server.quit()
    print(text)
    return ()


topLabel = Label(root,padx=20)

fblist = []
for row,forum in enumerate(forum_names):
    fbtemp = Radiobutton(root,text=forum,value=row+1,command=update_engineer_list)
    fbtemp.grid(row=row+1,sticky=W)
    fblist.append(fbtemp)

eb1 = Radiobutton(root,sticky=NW)

root.mainloop()

就电子邮件地址而言,您可以创建一个字典,该字典使用用户名作为键并将电子邮件地址存储为值。请记住,字典键必须是唯一的。

我实际上建议您宁愿创建一个小型类对象“用户”。然后,用户名,电子邮件地址,初中级或高级级,他们所属的论坛等可以是该类的属性。与您当前的代码相比,这将是一个很大的变化,但是从长远来看,它将变得更加容易和清晰。如果您有兴趣查看它的外观,请参见以下内容:

from tkinter import *
import random
import datetime
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

class User(object):
    """docstring for User"""
    def __init__(self,name,email,level,forums):
        super(User,self).__init__()
        self.name = name
        self.email = email
        self.level = level
        self.forums = forums

    def __str__(self):
        return self.name

# list of forum names in the order to be displayed
forum_names = ["Security Forum","Cloud Forum"]
group_names = ["Junior Engineers","Senior Engineers","All Engineers"]

#NOTE: A person must be junior OR senior!

Users = []

#Juniors
Users.append(User('Raven Kyle','rkyle@gmail.com','Junior',["Security Forum",]))
Users.append(User('Billy Joel','bjoel@gmail.com',]))
Users.append(User('James Gonzalez','jgon@gmail.com',]))
Users.append(User('Maria Lopez','mlopes@gmail.com',]))
Users.append(User('Justin Bright','jbright@gmail.com',]))
Users.append(User('Ali Baba','ababa@gmail.com',]))
Users.append(User('Tom Reeves','treave@gmail.com',["Networking Forum",]))
Users.append(User('Joe Soap','jsoep@gmail.com',]))
Users.append(User('John Smith 1','jsmith1@gmail.com',]))
Users.append(User('John Smith 2','jsmith2@gmail.com',["Unified Comms Forum",]))
Users.append(User('Mike Brown','mbrown@gmail.com',]))
Users.append(User('Mark,'mwill@gmail.com',]))
Users.append(User("Dave Brazel",'dbra@gmail.com',["Design Review Forum",]))
Users.append(User("Gwendolyn Vogue",'gvogue@gmail.com',]))
Users.append(User("Nikole Eaves",'neaves@gmail.com',]))
Users.append(User("Gaye Mccune",'gmcc@gmail.com',]))
Users.append(User("Maricela Chance",'mchance@gmail.com',]))
Users.append(User("Bret Hazelip",'bhaze@gmail.com',"Cloud Forum",]))

#Seniors
Users.append(User('David Jones','dj@gmail.com','Senior',]))
Users.append(User('Michael Johnson','mjohnson@gmail.com',]))
Users.append(User('Chris Lee','clee@gmail.com',]))
Users.append(User('Mary White','mwhite@gmail.com',]))
Users.append(User('John Smith 3','js3@gmail.com',]))
Users.append(User('Paul Rodriguez','prod@gmail.com',]))
Users.append(User('Daniel Garcia','dgarcia@gmail.com',]))
Users.append(User("Nina Perea",'ninap@gmail.com',]))
Users.append(User("Lila Frederickson",'lilaf@gmail.com',["Cloud Forum",]))
Users.append(User("Brooks Baskette",'bbas@gmail.com',]))
Users.append(User("Esperanza Slavin",'eslavin@gmail.com',]))
Users.append(User("Elisa Duplantis",'edup@gmail.com',]))

#return all users that match the forum and level
def getForumUsers(forum,level):
    forum_users = []

    for user in Users:
        if forum in user.forums:
            if level.startswith('All') or level.startswith(user.level):
                forum_users.append(user)

    return forum_users

#find user object with given name
def findUser(name):
    for user in Users:
        if user.name == name:
            return user

#get the selected forum and level
def getForumAndLevel():
    f = selected_forum.get()
    g = selected_group.get()

    if f > 0 and g > 0:
        return forum_names[f-1],group_names[g-1]

    return None,None

def update_engineer_list():
    forum,level = getForumAndLevel()

    #check if both forum and group is selected
    if forum and level:
        # update engineer list
        engineer_list.config(state=NORMAL)
        engineer_list.delete(1.0,"\n".join(sorted(str(usr) for usr in getForumUsers(forum,level))))
        engineer_list.config(state=DISABLED)
        # clear host engineer
        host_engineer["text"] = "Busy Randomising!!"

def choose_host():
    # extract the engineer list from the engineer selection box
    engineers = engineer_list.get(1.0,"end-1c").split("\n")
    # then select one of them randomly
    host_engineer["text"] = random.choice(engineers)

def clear_fields():
    engineer_list.config(state=NORMAL)
    engineer_list.delete(1.0,END)
    host_engineer["text"] = ""
    return()

def email_reminder():
    #get the host and forum details
    host_user = findUser(host_engineer['text'])
    forum,level = getForumAndLevel()

    if forum and level and host_user:
        # Need to actual from and to address
        fromaddr = "meetinggenerator@abc.com"
        toaddr = host_user.email
        ccaddr =  ",".join(usr.email for usr in getForumUsers(forum,level) if usr != host_user)
        msg = MIMEMultipart()
        msg['From'] = fromaddr
        msg['To'] = toaddr
        msg['Cc'] = ccaddr
        msg['Subject'] = "Meeting Host Reminder "
        body = "Hi " + str(host_user) + ",You are the meeting chair for the next " + forum + " meeting."
        msg.attach(MIMEText(body,'plain'))
        # Need to actual domain
        #server = smtplib.SMTP('smtpmail.domain.com',25)
        text = msg.as_string()
        #server.sendmail(fromaddr,text)
        #server.quit()
        print(text)
        clear_fields()

root = Tk()
root.title('Random User Entry')
root.geometry("550x600")
root.configure(borderwidth="1")
root.configure(relief="sunken")
root.configure(cursor="arrow")
root.configure(highlightbackground="white")
root.configure(highlightcolor="black")

topLabel = Label(root,padx=20)

#tkinter requires that we keep a referance to all the widgets
widgetlist = []

selected_forum = IntVar()
selected_group = IntVar()

for count,forum in enumerate(forum_names):
    fb_temp = Radiobutton(root,variable=selected_forum,value=count+1,command=update_engineer_list)
    fb_temp.grid(row=count+1,sticky=W)
    widgetlist.append(fb_temp)

for count,group in enumerate(group_names):
    eb_temp = Radiobutton(root,text=group,variable=selected_group,command=update_engineer_list)
    eb_temp.grid(row=count+1,sticky=W)
    widgetlist.append(eb_temp)

hostButton = Button(root,sticky=NW)

root.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-