25

这是我的脚本:

#!/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。我已经在两个网络主机上尝试过这个,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')
4

9 回答 9

10

这里有些自我推销,但我觉得有道理。

从字面上看,您只需要此代码即可完全按照您的编写:

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

如果您在主目录中添加带有“my@gmail.com”的 .yagmail,那么您可以这样做:yagmail.SMTP(),但现在这毫无意义。

警告:如果您认真对待发送大量消息,最好设置 OAuth2,yagmail 可以提供帮助。

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

第一次运行时,它将引导您完成获取 OAuth2 凭据的过程并将它们存储在文件中,这样下次您就不需要对它做任何事情了。您是否怀疑有人找到了您的凭据?他们的权限有限,但您最好通过 gmail 使他们的凭据无效。

对于包/安装,请查看gitreadthedocs,可用于 Python 2 和 3。

于 2015-04-18T17:18:18.523 回答
8

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

from email.MIMEText import MIMEText

msg = MIMEText('body')
msg['Subject'] = 'subject'
msg['From'] = "..."
msg['Reply-to'] = "..."
msg['To'] = "..."
于 2009-04-23T06:33:55.470 回答
7

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

  1. 您正在使用与“发件人”地址进行身份验证时相同的地址。如果我没记错的话,过去的情况是,您可以在 from 字段中放置您想要的任何内容,但出于安全目的,许多 SMTP 主机站点(包括 google)现在将其限制为已通过它们验证的地址。

  2. 允许“不太安全的应用”(阅读:我们不从中产生收入的应用)访问您的帐户。为此,请登录您的帐户并在此处导航: https ://www.google.com/settings/security/lesssecureapps

  3. 将端口 587 与 tls 一起使用。不太清楚为什么,但我永远无法让端口 465 玩得很好。

希望这可以帮助其他人。

于 2015-03-11T15:28:33.833 回答
6

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

于 2009-04-22T16:57:05.340 回答
4

省去一些头痛并使用它:

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

Python SMTPHandler 与 GMail

不锈钢

于 2011-06-02T17:07:34.547 回答
1

您需要检查 GMail 中的“已发送”文件夹,因为从您的帐户发送到您的帐户的邮件很可能会出现在该文件夹中。

于 2009-08-17T12:12:20.283 回答
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!!-')
于 2014-06-23T05:18:00.297 回答
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

于 2018-08-15T17:49:30.947 回答
0

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

于 2021-02-07T01:36:49.010 回答