如何使用Python发送电子邮件?

如何使用Python发送电子邮件?,python,email,smtplib,Python,Email,Smtplib,我正在编写一个使用Python发送电子邮件的程序。我从各种论坛学到的是以下代码: #!/usr/bin/env python import smtplib sender = "sachinites@gmail.com" receivers = ["abhisheks@cse.iitb.ac.in"] yourname = "Abhishek Sagar" recvname = "receptionist" sub = "Testing email" body = "who cares" mess

我正在编写一个使用Python发送电子邮件的程序。我从各种论坛学到的是以下代码:

#!/usr/bin/env python
import smtplib
sender = "sachinites@gmail.com"
receivers = ["abhisheks@cse.iitb.ac.in"]
yourname = "Abhishek Sagar"
recvname = "receptionist"
sub = "Testing email"
body = "who cares"
message = "From: " + yourname + "\n" 
message = message + "To: " + recvname + "\n"
message = message + "Subject: " + sub + "\n" 
message = message + body
try:
    print "Sending email to " + recvname + "...",
    server = smtplib.SMTP('smtp.gmail.com:587')
    username = 'XYZ@gmail.com'  
    password = '*****'  
    server.ehlo()
    server.starttls()  
    server.login(username,password)  
    server.sendmail(sender, receivers, message)         
    server.quit()
    print "successfully sent!"
except  Exception:
    print "Error: unable to send email"
但它只是打印“错误:无法发送电子邮件”并在终端上退出。我该如何解决此问题

我将最后两行修改为

except Exception, error:
    print "Unable to send e-mail: '%s'." % str(error)
我收到以下错误消息:

Traceback (most recent call last):
  File "./2.py", line 45, in <module>
    smtpObj = smtplib.SMTP('localhost')
  File "/usr/lib/python2.6/smtplib.py", line 239, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python2.6/smtplib.py", line 295, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/lib/python2.6/smtplib.py", line 273, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "/usr/lib/python2.6/socket.py", line 514, in create_connection
    raise error, msg
socket.error: [Errno 111] Connection refused
回溯(最近一次呼叫最后一次):
文件“/2.py”,第45行,在
smtpObj=smtplib.SMTP('localhost')
文件“/usr/lib/python2.6/smtplib.py”,第239行,在__
(代码,消息)=自连接(主机,端口)
文件“/usr/lib/python2.6/smtplib.py”,第295行,在connect中
self.sock=self.\u获取\u套接字(主机、端口、self.timeout)
文件“/usr/lib/python2.6/smtplib.py”,第273行,在get套接字中
返回套接字。创建_连接((端口、主机),超时)
文件“/usr/lib/python2.6/socket.py”,第514行,在create_connection中
引发错误,msg
socket.error:[Errno 111]连接被拒绝

如果您打印错误消息,您可能会得到发生错误的全面描述。请尝试(不使用双关语)以下操作:

如果在阅读错误消息后,您仍然不理解错误,请使用错误消息更新您的问题,我们可以为您提供更多帮助


附加信息后更新

错误消息

socket.error:[Errno 111]连接被拒绝

表示远程端(例如GMail SMTP服务器)正在拒绝网络连接。如果您查看,似乎应该更改

server = smtplib.SMTP('smtp.gmail.com:587')
以下是我的看法

server = smtplib.SMTP(host='smtp.gmail.com', port=587)

根据错误消息,您使用本地主机作为SMTP服务器,然后连接被拒绝。您的本地主机没有运行SMTP服务器。我想,您需要确保您连接的SMTP服务器有效。

如果邮件头、负载包含非ascii字符,则应对其进行编码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from email.header    import Header
from email.mime.text import MIMEText
from getpass         import getpass
from smtplib         import SMTP_SSL


login, password = 'user@gmail.com', getpass('Gmail password:')
recipients = [login]

# create message
msg = MIMEText('message body…', 'plain', 'utf-8')
msg['Subject'] = Header('subject…', 'utf-8')
msg['From'] = login
msg['To'] = ", ".join(recipients)

# send it via gmail
s = SMTP_SSL('smtp.gmail.com', 465, timeout=10)
s.set_debuglevel(1)
try:
    s.login(login, password)
    s.sendmail(msg['From'], recipients, msg.as_string())
finally:
    s.quit()

我知道您是stackoverflow新手,欢迎!请确保您使用正确的格式设置您的帖子。这有助于我们更轻松地阅读您的问题,并增加您获得答案的机会。在执行您所说的操作后,我可能会遇到以下错误:向接待员发送电子邮件…无法发送电子邮件:“[Errno 110]连接超时。我在代理后面,所以我需要在代码中添加一些额外的内容。@AbhishekSagar:SMTP配置是一个复杂的主题。也许你可以尝试一个备用端口?请参阅GMail常见问题解答。是的,我安装了postfix,在搜索配置SMTP时放弃了这个想法!它真的很复杂x、 Gmail现在对什么设备可以登录帐户非常严格。如果像我一样,你在远程机器上使用这样的代码时遇到问题,你可以尝试登录Gmail帐户并检查“允许不太安全的应用”“选择权。还有一些工具可以授权特定的apps@jprockbelly:不要破坏安全。它甚至可以在具有两步验证的帐户上工作。只需为脚本生成应用程序密码。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from email.header    import Header
from email.mime.text import MIMEText
from getpass         import getpass
from smtplib         import SMTP_SSL


login, password = 'user@gmail.com', getpass('Gmail password:')
recipients = [login]

# create message
msg = MIMEText('message body…', 'plain', 'utf-8')
msg['Subject'] = Header('subject…', 'utf-8')
msg['From'] = login
msg['To'] = ", ".join(recipients)

# send it via gmail
s = SMTP_SSL('smtp.gmail.com', 465, timeout=10)
s.set_debuglevel(1)
try:
    s.login(login, password)
    s.sendmail(msg['From'], recipients, msg.as_string())
finally:
    s.quit()