smtplib和gmail - python脚本问题

时间:2009-04-22 16:52:17

标签: python smtp gmail 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()

我只是想从我的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')

9 个答案:

答案 0 :(得分:8)

您是否尝试构建有效消息?

from email.MIMEText import MIMEText

msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."

答案 1 :(得分:7)

我不知道OP是否仍然关心这个答案,但我发现自己正在努力解决类似的问题,希望其他人可能会觉得这很有用。事实证明,谷歌改变了他们允许使用SMTP服务器的方式。你需要检查几件事:

  1. 您使用的用户身份相同的地址是&#39;来自&#39;地址。如果我没有弄错的话,你可以在from字段中放置你想要的任何内容,但出于安全考虑,许多SMTP主机站点(包括谷歌)现在将此限制为已经通过身份验证的地址。 / p>

  2. 允许您使用“安全性较低的应用”访问您的帐户&#39; (阅读:我们不会从中获取收入的应用)。要执行此操作,请登录您的帐户并在此处导航: https://www.google.com/settings/security/lesssecureapps

  3. 使用端口587和tls。不太确定为什么,但我永远不会让端口465发挥得很好。

  4. 希望这有助于其他人。

答案 2 :(得分:6)

我认为GMail SMTP服务器对您连接的IP地址执行反向DNS查找,如果找不到域,则拒绝连接。这是为了避免垃圾邮件发送者将其SMTP服务器用作开放中继。

答案 3 :(得分:6)

这里有一些自我推销,但我觉得有效。

你真的只需要这段代码来完成你所写的内容:

import yagmail
yag = yagmail.SMTP('myname@gmail.com')
yag.send('somename@somewhere.com', subject = None, contents = 'Hello')

或者一个班轮:

yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.')

有什么好处的,我建议使用密钥环存储您的密码,这样您就不会有人在您的脚本中看到您的密码的风险。

您可以在解释器中运行一次来​​设置它:

import yagmail
yagmail.register("my@gmail.com", "mypassword")

然后退出。然后你可以使用:

import yagmail
yagmail.SMTP("my@gmail.com") # without password

如果您使用&#34; my@gmail.com"添加.yagmail;在你的家庭目录中,你可以这样做:yagmail.SMTP(),但现在这一点毫无意义。

警告:如果您认真发送大量邮件,最好设置OAuth2,yagmail可以帮助解决这个问题。

yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json")

第一次运行时,它会引导您完成获取OAuth2凭据并将其存储在文件中的过程,以便下次您不需要对其执行任何操作。 你怀疑有人找到你的凭据吗?他们的权限有限,但您最好通过gmail使其凭据无效。

对于软件包/安装,请查看适用于Python 2和3的gitreadthedocs

答案 4 :(得分:4)

答案 5 :(得分:2)

您需要检查GMail中的“已发送”文件夹,因为这可能会显示从您的帐户发送到您帐户的邮件。

答案 6 :(得分:1)

我转到了上面提到的链接,并且有3个不同的地址要发送给我,但我收到了三封电子邮件到同一地址,那是#3地址。

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

import logging
import logging.handlers

class TlsSMTPHandler(logging.handlers.SMTPHandler):
def emit(self, record):
    """
    Emit a record.

    Format the record and send it to the specified addressees.
    """
    try:
        import smtplib
        import string # for tls add this line
        try:
            from email.utils import formatdate
        except ImportError:
            formatdate = self.date_time
        port = self.mailport
        if not port:
            port = smtplib.SMTP_PORT
        smtp = smtplib.SMTP(self.mailhost, port)
        msg = self.format(record)
        msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
                        self.fromaddr,
                        string.join(self.toaddrs, ","),
                        self.getSubject(record),
                        formatdate(), msg)
        if self.username:
            smtp.ehlo() # for tls add this line
            smtp.starttls() # for tls add this line
            smtp.ehlo() # for tls add this line
            smtp.login(self.username, self.password)
        smtp.sendmail(self.fromaddr, self.toaddrs, msg)
        smtp.quit()
    except (KeyboardInterrupt, SystemExit):
        raise
    except:
        self.handleError(record)

logger = logging.getLogger()

gm = TlsSMTPHandler(("smtp.gmail.com", 587), 'myusername@gmail.com', ['address1@gmail.com', 'address2@gmail.com', 'address3@gmail.com'], 'unable to find Error!', ('myusername@gmail.com', 'mypassword'))
gm.setLevel(logging.ERROR)

logger.addHandler(gm)

try:
    1/0
except:
    logger.exception('It NO work for me!!-')

答案 7 :(得分:0)

可行

'''
Created on 2017/11/27

@author: devuser
'''

import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = 'receiver2@test.net'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


if __name__ == '__main__':

    to_addr = TO_ADDRESS
    subject = SUBJECT
    body = BODY

    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
    send(FROM_ADDRESS, to_addr, msg)

https://qiita.com/okhrn/items/630a87ce1a44778bbeb1

答案 8 :(得分:0)

我遇到了同样的问题,但在尝试了上述所有建议后,关闭 VPN 有所帮助。