【问题标题】:Python emailer not workingPython电子邮件程序不起作用
【发布时间】:2015-09-11 17:23:49
【问题描述】:

我正在尝试编写一个 Python 类,该类将使用 Python 的 smtplib 库发送电子邮件。我让它可以与标准 Gmail 一起使用,但无法让配置与其他帐户一起使用。

Emailer 类配置和发送方法:

def configure(self,  serverLogin, serverPassword, fromAddr, toAddr, serverHost='mail.myserver.edu', serverPort=465):
    self.server=smtplib.SMTP(serverHost,serverPort) #set the server host/port - currently configured for gmail
    self.server.ehlo()
    self.server.starttls()
    self.server.ehlo()
    self.server.login(serverLogin, serverPassword)  #login to senders email
    self.fromAddr = fromAddr
    self.toAddr = toAddr

def send(self):
    msgText = email.MIMEText.MIMEText("\n".join(self.message))
    self.msg.attach(msgText) 
    print "Sending email to %s " % self.toAddr
    text = self.msg.as_string() #conver the message contents to string format
    self.server.sendmail(self.fromAddr, self.toAddr, text)  #send the email

Emailer 测试方法:

def test(self):
    message = "Like a boss"  #body message of the email
    attachment = ["/Desktop/testImage2"]    #list of attachments
    image = ["/Desktop/testImage2"]
    emailer = Emailer() 
    emailer.addAttachment(attachment)
    emailer.addToMessage(message,image)
    emailer.setSubject("Python Test")
    emailer.configure(serverLogin="loginname", serverPassword="password", fromAddr="myaddr@myserver.edu", toAddr=["otheraddr@gmail.com"])
    emailer.send()

我使用此信息在其他邮件客户端(如 Outlook)中成功设置了我的电子邮件帐户,当我使用 serverHost = 'smtp.gmail.com'serverPort = 587 时,这些类工作得很好。但是,当我使用我的非 Gmail 服务器信息在终端中运行 test() 类时,代码似乎挂在这个位上:

/Users/anaconda/lib/python2.7/smtplib.pyc in __init__(self, host, port, local_hostname, timeout)
254         self.esmtp_features = {}
255         if host:
--> 256             (code, msg) = self.connect(host, port)
257             if code != 220:
258                 raise SMTPConnectError(code, msg)

/Users/anaconda/lib/python2.7/smtplib.pyc in connect(self, host, port)
315             print>>stderr, 'connect:', (host, port)
316         self.sock = self._get_socket(host, port, self.timeout)
--> 317         (code, msg) = self.getreply()
318         if self.debuglevel > 0:
319             print>>stderr, "connect:", msg

/Users/anaconda/lib/python2.7/smtplib.pyc in getreply(self)
359         while 1:
360             try:
--> 361                 line = self.file.readline(_MAXLINE + 1)
362             except socket.error as e:
363                 self.close()

/Users/anaconda/lib/python2.7/socket.pyc in readline(self, size)
474             while True:
475                 try:
--> 476                     data = self._sock.recv(self._rbufsize)
477                 except error, e:
478                     if e.args[0] == EINTR:

KeyboardInterrupt:

谁能告诉我为什么卡在这里?

【问题讨论】:

  • 您收到的实际异常消息是什么?
  • 我没有收到消息,因为我每次都必须control+c 退出。它似乎陷入了无限循环。
  • 你能发布更多的Emailer类吗?特别是send() 函数?
  • 您在使用其他帐户时遇到问题是什么意思?除了gmail?其他邮件服务,如 yahoo、hotmail 等?
  • @1.618 编辑了问题以包含更多代码。

标签: python smtplib


【解决方案1】:

所以问题在于我需要使用SMTP_SSL 而不是只使用SMTP,因为我的服务器上的安全设置。

【讨论】:

    【解决方案2】:

    可能是连接问题。使用 telnet 检查访问并检查服务器应答。

    telnet smtp.gmail.com 587
    
    Trying 64.233.186.109...
    Connected to smtp.gmail.com.
    Escape character is '^]'.
    220 smtp.gmail.com ESMTP f103sm809119qkh.38 - gsmtp
    

    【讨论】:

    • 这适用于非 gmail 服务器吗?我使用的服务器是私人服务器,而不是通过电子邮件服务。
    • 啊,抱歉,但是,尝试在您的服务器 mail.myserver.edu 和该服务器的 465 端口中测试 telnet 连接。我正在改变我的答案。
    • 当我运行 telnet myserver.edu 465 时,我得到了 Connected to myserver.edu 响应。
    【解决方案3】:

    为您的服务器尝试 telnet 测试,描述的 python 错误是连接问题。以telnet mail.myserver.edu 465 为例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-31
      • 2020-11-11
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      相关资源
      最近更新 更多