spe*_*wah 25 python gmail smtp smtplib
这是我的脚本:
#!/usr/bin/python
import smtplib
msg = 'Hello world.'
server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587
server.ehlo()
server.starttls()
server.ehlo()
server.login('myname@gmail.com','mypass')
server.sendmail('myname@gmail.com','somename@somewhere.com',msg)
server.close()
Run Code Online (Sandbox Code Playgroud)
我只是想从我的Gmail帐户发送电子邮件.由于gmail的要求,该脚本使用starttls.我在两个web主机上尝试了这个,1and1和webfaction.1and1给我一个'连接被拒绝'错误,webfaction报告没有错误,但只是不发送电子邮件.我看不出脚本有什么问题,所以我认为它可能与网络主机有关.任何想法和意见将不胜感激.
编辑:我打开了调试模式.从输出,它看起来像是成功发送了消息...我只是从来没有收到它.
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
STARTTLS
ENHANCEDSTATUSCODES
PIPELINING
send: 'STARTTLS\r\n'
reply: '220 2.0.0 Ready to start TLS\r\n'
reply: retcode (220); Msg: 2.0.0 Ready to start TLS
send: 'ehlo web65.webfaction.com\r\n'
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n'
reply: '250-SIZE 35651584\r\n'
reply: '250-8BITMIME\r\n'
reply: '250-AUTH LOGIN PLAIN\r\n'
reply: '250-ENHANCEDSTATUSCODES\r\n'
reply: '250 PIPELINING\r\n'
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84]
SIZE 35651584
8BITMIME
AUTH LOGIN PLAIN
ENHANCEDSTATUSCODES
PIPELINING
send: 'AUTH PLAIN *****\r\n'
reply: '235 2.7.0 Accepted\r\n'
reply: retcode (235); Msg: 2.7.0 Accepted
send: 'mail FROM:<myname@gmail.com> size=12\r\n'
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48
send: 'rcpt TO:<myname@gmail.com>\r\n'
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48
send: 'data\r\n'
reply: '354 Go ahead 4sm652580yxq.48\r\n'
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48
data: (354, 'Go ahead 4sm652580yxq.48')
send: 'Hello world.\r\n.\r\n'
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n'
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48')
Run Code Online (Sandbox Code Playgroud)
你试过构建一个有效的消息吗?
from email.MIMEText import MIMEText
msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
Run Code Online (Sandbox Code Playgroud)
我不知道OP是否仍然关心这个答案,但我发现自己在努力解决类似的问题,希望其他人可能会发现这个有用.事实证明,谷歌改变了他们允许使用SMTP服务器的方式.你需要检查几件事:
您使用的是与用于验证的"发件人"地址相同的地址.如果我没有弄错的话,过去你可以在from字段中放置你想要的任何内容,但出于安全考虑,许多SMTP主机站点(包括谷歌)现在将此限制为已经通过身份验证的地址.
允许您通过"不太安全的应用"访问您的帐户(请参阅:我们不会从中获取收入的应用).要执行此操作,请登录您的帐户并在此处导航:https: //www.google.com/settings/security/lesssecureapps
使用端口587和tls.不太确定为什么,但我永远不会得到端口465玩得很好.
希望这有助于其他人.
我认为GMail SMTP服务器对您连接的IP地址执行反向DNS查找,如果找不到域,则拒绝连接.这是为了避免垃圾邮件发送者将其SMTP服务器用作开放中继.
在这里有一些自我推销,但我觉得有效.
你真的只需要这段代码来完成你写的:
import yagmail
yag = yagmail.SMTP('myname@gmail.com')
yag.send('somename@somewhere.com', subject = None, contents = 'Hello')
Run Code Online (Sandbox Code Playgroud)
或者一个班轮:
yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.')
Run Code Online (Sandbox Code Playgroud)
有趣的是,我建议使用密钥环来存储您的密码,这样您就不会有人在您的脚本中看到您的密码的风险.
您可以在解释器中运行一次来设置它:
import yagmail
yagmail.register("my@gmail.com", "mypassword")
Run Code Online (Sandbox Code Playgroud)
并退出.然后你可以使用:
import yagmail
yagmail.SMTP("my@gmail.com") # without password
Run Code Online (Sandbox Code Playgroud)
如果你在你的家庭目录中添加带有"my@gmail.com"的.yagmail,那么你可以这样做:yagmail.SMTP(),但现在这是毫无意义的.
警告:如果你认真发送大量消息,最好设置OAuth2,yagmail可以帮助你.
yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json")
Run Code Online (Sandbox Code Playgroud)
第一次运行时,它将指导您完成获取OAuth2凭据并将其存储在文件中的过程,以便下次您不需要对其执行任何操作.你怀疑有人找到你的凭据吗?他们的权限有限,但您最好通过gmail使其凭据无效.
对于软件包/安装,请查看适用于Python 2和3的git或readthedocs.