【发布时间】:2019-03-16 22:28:42
【问题描述】:
不确定以前是否有人问过这个问题,但我找不到任何似乎可行的解决方案。
我在装有 Python 3.6.6 的 Windows 10 机器上运行它。
对于一项学校作业,我的任务是编写一个 Python 脚本,该脚本通过 SMTP 和套接字库连接到 Gmail 并发送示例消息。下面是我的完整代码,因为我不确定是什么导致了它的问题:
import socket, ssl, base64
# Initialize variables
msg = "\r\n I love computer networks!"
endmsg = "\r\n.\r\n"
username = '***' # My email address went here
password = '***' # I put my password here
# Choose a mail server (e.g. Google mail server) and call it mailserver
mailserver = "smtp.gmail.com"
port = 465
# Send and get response
def send_com(in_string, response_num):
# Only send content if provided, and if in string format, convert to bytes
if in_string != '':
if type(in_string) == str: in_string = in_string.encode()
ssl_clientSocket.send(in_string)
# Get response
recv = ssl_clientSocket.recv(1024).decode()
# If the first three numbers of the response from the server are not '250', we have a problem
if recv[:3] != response_num and response_num != '':
print (recv[:3] + ' reply not received from server.')
else:
print (recv)
# Create socket called clientSocket and establish a TCP connection with mailserver
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_clientSocket = ssl.wrap_socket(clientSocket)
ssl_clientSocket.connect((mailserver, port))
send_com('', '220') # SMTP server initialization
send_com('HELO Alice\r\n', '250') # Send HELO command and print server response.
send_com('AUTH LOGIN\r\n', '334') # Authenticate mail server
print ("Username: " + base64.b64encode(username.encode()).decode())
print ("Password: " + base64.b64encode(password.encode()).decode() + "\n")
send_com(base64.b64encode(username.encode()), '334') # Send username
send_com(base64.b64encode(password.encode()), '235') # Sned password
send_com('MAIL From: <' + username + '>\r\n', '250') # Send MAIL FROM command and print server response.
send_com('MAIL From: <' + username + '>\r\n', '250') # Send RCPT TO command and print server response.
send_com('DATA\r\n', '250') # Send DATA command and print server response.
send_com(msg, '') # Send message data.
send_com(endmsg, '') # Message ends with a single period.
send_com('QUIT\r\n', '221') # Send QUIT command and get server response.
#recv5 = ssl_clientSocket.recv(I1024).decode()
我知道它在将我的编码用户名发送到 Google 的服务器后挂起。上面的所有代码似乎都可以执行并返回适当的服务器响应,没有任何问题。但是,一旦它到达发送编码用户名的命令,程序就会挂起,直到我关闭终端。
【问题讨论】:
-
你为什么不用
smtplib? -
我会,但我的教授明确告诉我不要。