Python无法向Gmail发送电子邮件

4

我有一个Python脚本用于发送电子邮件。 我用它来向我的电子邮件和手机发送警报。 但是由于某些原因,当发送到Gmail帐户时,电子邮件无法收到。 我的代码与其他示例之间的最大区别在于我不能使用smtp.gmail.com。 这是我的电子邮件/文本函数:

import smtplib

sender = 'xxxx@company.com'
smtpObj = smtplib.SMTP('smtp.company.com')

def text_func ( subject,text_message ):
    text_receivers = ['##########@vtext.com',
        'xxxxxxxx@company.com',
        'xxxxxxxx@gmail.com'
    ]
    text_message = """Subject: %s

    %s
    """ % (subject, text_message)

    smtpObj.sendmail(sender, text_receivers, text_message)

以上代码可以向我的手机和工作邮箱发送短信,但无法发送到Gmail。我检查过并确保该电子邮件未出现在垃圾邮件文件夹中。谷歌似乎完全阻止了它。有什么想法吗?

5个回答

1

由于我对smtplib的短信方面没有太多经验,因此这可能不正确,但看起来您需要启动TLS连接。我建议将您的脚本更改为以下内容:

import smtplib

sender = 'xxxx@company.com'
smtpObj = smtplib.SMTP('smtp.company.com')
smtpObj.starttls()

def text_func ( subject,text_message ):
    text_receivers = ['##########@vtext.com',
        'xxxxxxxx@company.com',
        'xxxxxxxx@gmail.com'
    ]
    text_message = """Subject: %s\n\n%s""" % (subject, text_message)

smtpObj.sendmail(sender, text_receivers, text_message)

当我添加那行代码时,它会抛出一个错误。我现在正在尝试解决这个问题。raise SMTPException("STARTTLS extension not supported by server.")smtplib.SMTPException: 服务器不支持 STARTTLS 扩展。 - Rachel
@Rachel 我以前也遇到过这个问题,只要不断尝试不同的方法就行了。 - miike3459

1
我也曾遇到同样的问题。当我从网页邮箱中查看收件箱时,发现这封电子邮件被 Gmail 拒绝了。 屏幕截图 通过将“From”标题添加到电子邮件中解决了该问题。
import smtplib, ssl
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

sender_email = "test@example.com"
receiver_email = "example@gmail.com"
password = "pass1234"
host = "example.com"
port = 465
message = MIMEMultipart("alternative")
message["Subject"] = "Email Subject"
message["From"] = sender_email
message["To"] = receiver_email
text = "This is the email Body"
message.attach(MIMEText(text, "plain"))
context = ssl.create_default_context()
with smtplib.SMTP_SSL(host, port, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(
        sender_email, receiver_email, message.as_string()
    )

没错,它对我起作用了。 我正在使用一个面板托管,并且无法使用我的脚本发送电子邮件,但现在它可以正常工作了。 - Mohammed Breky

0

您可能需要更改Gmail设置,以允许较不安全的应用程序进入您的帐户。请参见以下来自Google账户专家Nick的链接。

https://support.google.com/accounts/answer/6010255?hl=en

选项2:更改您的设置以允许较不安全的应用程序进入您的帐户。我们不建议选择此选项,因为这可能会使某些人更容易地侵入您的帐户。如果您仍想要允许访问,请按照以下步骤操作:前往您的 Google 帐户中“较不安全的应用程序”部分。启用“允许较不安全的应用程序”。如果您找不到此设置,则可能是您的管理员已关闭了较不安全的应用程序帐户访问权限。

1
好的想法,但这并没有解决它。 - Rachel

0

步骤1:

允许不安全的应用程序访问您的帐户

发送电子邮件:

import smtplib

gmail_user = 'you@gmail.com'  
gmail_password = 'P@ssword!'

sent_from = gmail_user  
to = ['me@gmail.com', 'bill@gmail.com']  
subject = 'OMG Super Important Message'  
body = 'Hey, what's up?\n\n- You'

email_text = """\  
From: %s  
To: %s  
Subject: %s

%s
""" % (sent_from, ", ".join(to), subject, body)

try:  
    server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
    server.ehlo()
    server.login(gmail_user, gmail_password)
    server.sendmail(sent_from, to, email_text)
    server.close()

    print 'Email sent!'
except:  
    print 'Something went wrong...'

我不想从gmail账户发送邮件,只想发送到gmail账户。而且我不能使用smtp.gmail.com,因为它是从我们公司的内部smtp网关发出的。 - Rachel

0

找到了解决方案。

import smtplib
from email.mime.text import MIMEText

sender = 'xxxx@company.com'
smtpObj = smtplib.SMTP('smtp.company.com')

def text_func ( subject,text_message ):
    text_receivers = ['##########@vtext.com',
        'xxxxxxxx@company.com',
        'xxxxxxxx@gmail.com'
    ]

    cont = '''\
       <html>
         <head></head>
         <body>
           <p>{0}</p>
         </body>
       </html>
       '''.format(text_message)

    msgTo = ""
    for person in text_receivers:
        msgTo += "{0} ".format(person)

    msg = MIMEText(cont, 'html')

    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = msgTo

    smtpObj.sendmail(sender, text_receivers, msg.as_string())

5
你应该解释解决方案,而不仅仅是发布代码。 - Amon

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