10

我只想用python发送一封带有附件的电子邮件

import smtplib, os
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders

def send_mail(send_from, send_to, subject, text, files=[], server="localhost"):
    assert type(send_to)==list
    assert type(files)==list

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = COMMASPACE.join(send_to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach( MIMEText(text) )

    for f in files:
        part = MIMEBase('application', "octet-stream")
        part.set_payload( open(f,"rb").read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f))
        msg.attach(part)

    smtp = smtplib.SMTP('smtp.gmail.com:587')
    smtp.login('fu@gmail.com','fu')
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

ATTACHMENTS = ['/tmp/2013-11-04-test.csv']
send_from=['fu@gmail.com']
send_to=['fu@gmail.com']
subject='adfadfadf'
text = 'adfadfadf'
send_mail(send_from, send_to, subject, text, files=ATTACHMENTS)

我如何进行身份验证?我必须提供用户名和密码。如何?

Traceback (most recent call last):
  File "/home/ubuntu/workspace/miliza-devops/classes/utilities.py", line 133, in <module>
    send_mail(send_from, send_to, subject, text, files=ATTACHMENTS)
  File "/home/ubuntu/workspace/miliza-devops/classes/utilities.py", line 124, in send_mail
    smtp.login('fu@gmail.com','fu')
  File "/usr/lib/python2.7/smtplib.py", line 576, in login
    raise SMTPException("SMTP AUTH extension not supported by server.")
smtplib.SMTPException: SMTP AUTH extension not supported by server.
4

2 回答 2

28

您需要starttls()在登录前致电:

smtp = smtplib.SMTP('smtp.gmail.com:587')
smtp.starttls()
smtp.login('fu@gmail.com', 'fu')

此外,您send_from应该是 a str,而不是 a list

send_from='fu@gmail.com'

请注意,隐式smtp.starttls()调用:smtp.ehlo()

如果此会话之前没有 EHLO 或 HELO 命令,则此方法首先尝试 ESMTP EHLO。https://docs.python.org/2/library/smtplib.html#smtplib.SMTP.starttls

于 2013-11-04T14:19:43.500 回答
2

在 gmail 上,您还必须提供一个smtp.ehlo()beforesmtp.starttls() 这也是How to send an email with Gmail as provider using Python? 的副本?

于 2015-12-30T07:31:34.180 回答