无法使用Python SMTP发送电子邮件

3
我正在使用Python开发一个应用程序,需要通过电子邮件发送文件。我编写了发送邮件的程序,但不知道出了什么问题。下面是我的代码,请有经验的人帮助我修改smtp库中可能缺失的内容。同时请问一下在smtp中的主机是什么?我使用smtp.gmail.com。 还请告知如何通过邮件发送一个csv文件。感谢您的帮助!
#!/usr/bin/python

import smtplib

sender = 'someone@yahoo.com'
receivers = ['someone@yahoo.com']

message = """From: From Person <someone@yahoo.com>
To: To Person <someone@yahoo.com>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('smtp.gmail.com')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except:
   print "Error: unable to send email"

请提供错误详细信息。 - Nilesh
Tichodroma, Lafada:socket.error: [Errno 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者已建立的连接失败,因为连接的主机没有响应。 - Sujit Shakya
1个回答

4

你没有登录。也有一些可能导致你无法通过的原因,包括ISP阻止、如果无法获取您的反向DNS,Gmail会拒收邮件等。

try:
   smtpObj = smtplib.SMTP('smtp.gmail.com', 587) # or 465
   smtpObj.ehlo()
   smtpObj.starttls()
   smtpObj.login(account, password)
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except:
   print "Error: unable to send email"

我刚刚注意到您要求附加文件的请求。由于现在需要处理编码,这改变了一些事情。但我认为这仍然不是很难跟进。

import os
import email
import email.encoders
import email.mime.text
import smtplib

# message/email details
my_email = 'myemail@gmail.com'
my_passw = 'asecret!'
recipients = ['jack@gmail.com', 'jill@gmail.com']
subject = 'This is an email'
message = 'This is the body of the email.'
file_name = 'C:\\temp\\test.txt'

# build the message
msg = email.MIMEMultipart.MIMEMultipart()
msg['From'] = my_email
msg['To'] = ', '.join(recipients)
msg['Date'] = email.Utils.formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(email.MIMEText.MIMEText(message))

# build the attachment
att = email.MIMEBase.MIMEBase('application', 'octet-stream')
att.set_payload(open(file_name, 'rb').read())
email.Encoders.encode_base64(att)
att.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file_name))
msg.attach(att)

# send the message
srv = smtplib.SMTP('smtp.gmail.com', 587)
srv.ehlo()
srv.starttls()
srv.login(my_email, my_passw)
srv.sendmail(my_email, recipients, msg.as_string())

谢谢您的帮助!我尝试了这个方法,但是出现了一个错误,说用户名和密码不被接受。我对登录(账户、密码)有一点困惑。那个账户指的是什么?是发件人的邮箱账户还是其他什么东西? - Sujit Shakya
账户是您想要发送电子邮件的 Gmail 账户(myemail@gmail.com),而密码则为该账户的密码。我刚刚注意到您请求了附件。我会尽快更新我的答案并附上附件。 - Omnikrys
非常感谢!您能尽快发布更新吗...(: - Sujit Shakya
哦,你要知道,如果这是一个免费账户并且发送了相当数量的电子邮件,Gmail 可能会阻止它的发送。这真的很痛苦,没有任何真正的逻辑,但我已经看到足够多的次数,不再使用 Gmail 进行除测试之外的任何事情。通过 Gmail 的付费账户则没有这个问题,并且非常可靠。 - Omnikrys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接