How to classify a new email as spam/not spam?
I modified your code so the code runs as a block and is setup to predict new data:
import string

from nltk.corpus import stopwords
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix, accuracy_score
from sklearn.naive_bayes import MultinomialNB

#  Define training data
df = pd.DataFrame(data={'Email': [
&quot;Hi, I am Andrew and I want too buy VIAGRA&quot;,
&quot;Dear subscriber, your account will be closed&quot;,
&quot;Please click below to verify and access email restore&quot;,
&quot;Hi Anne, I miss you so much! Can’t wait to see you&quot;,
&quot;Dear Professor Johnson, I was unable to attend class today&quot;,
&quot;I am pleased to inform you that you have won our grand prize.&quot;,
&quot;I can’t help you with that cuz it’s too hard.&quot;,
&quot;I’m sorry to tell you but im sick and will not be able to come to class.&quot;,
&quot;Can I see an example before all are shipped or will that cost extra?&quot;,
&quot;I appreciate your assistance and look forward to hearing back from you.&quot;,], 
'Spam': [1, 1, 1, 0, 0, 1, 0, 0, 0, 0]})

def fun(text):    
    # Removing Punctuations
    remove_punc = [c for c in text if c not in string.punctuation]
    remove_punc = ''.join(remove_punc)

    # Removing StopWords
    cleaned = [w for w in remove_punc.split() if w.lower() not in stopwords.words('english')]

    return cleaned

# Create a vectorizer object to enable both fit_transform and just transform
vectorizer = CountVectorizer(analyzer=fun)
X = vectorizer.fit_transform(df['Email'])

X_train, X_test, y_train, y_test = train_test_split(X, df['Spam'], test_size = 0.25, random_state = 0)

classifier = MultinomialNB()
classifier.fit(X_train, y_train)

pred = classifier.predict(X_test)

print(classification_report(y_test ,pred ))
print('Confusion Matrix: \n', confusion_matrix(y_test,pred))
print()
print('Accuracy: ', accuracy_score(y_test,pred))

Here is how to predict on new data:
# Given a new email
new_email = &quot;Hi, my name is Christopher and I like VIAGRA&quot;

# Apply the same preprocessing steps and transformation
X_new = vectorizer.transform([fun(new_email)])

# Predict new email with already trained classifier
classifier.predict(X_new)