使用Python和Gmail SMTP服务器发送电子邮件不适用于附件

时间:2015-10-20 12:08:21

标签: python email smtp gmail

我正在尝试发送附带PDF的电子邮件。我已经定义了下一个函数:

def mail(to, subject, text, attach):
    gmail_user = "email@gmail.com"
    gmail_name = "name <email@gmail.com>"
    gmail_pwd = "password"

    msg = MIMEMultipart()

    msg['From'] = gmail_name
    msg['To'] = to
    msg['Subject'] = subject

    msg.attach(MIMEText(text))

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

    mailServer = smtplib.SMTP("smtp.gmail.com", 587)

    mailServer.ehlo()
    mailServer.starttls()
    mailServer.ehlo()
    mailServer.login(gmail_user, gmail_pwd)
    mailServer.sendmail(gmail_name, to, msg.as_string())
    mailServer.close()

问题是控制台显示以下错误

smtplib.SMTPServerDisconnected: Server not connected

但是,如果我只是替换&#39; msg.as_string&#39;与&#34;无论什么字符串&#34;它工作正常。所以我认为当我尝试附加PDF文件时会出现此问题。

你能帮我吗?

由于

3 个答案:

答案 0 :(得分:2)

您还可以使用专门用于编写HTML电子邮件的包,在线显示图片并轻松附加文件!

我所指的包是yagmail,我是开发人员/维护人员。

{
    "data": "group",
    "name": "root",
    "objects": {
        "BOOT": {
            "data": "group",
            "name": "ProjectData",
            "objects": {
                "ModInfo": {
                    "data": "group",
                    "name": "Modformat",
                    "objects": {
                        "TetaInfo": {
                            "data": "group",
                            "name": "Tetaformat",
                            "objects": {
                                "Cad": {
                                    "data": "text",
                                    "name": "Cadingo",
                                    "value": "CadValue6.0"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

这就是它的全部(3行对69行)!!

使用import yagmail yag = yagmail.SMTP(gmail_name, gmail_pwd) yag.send('xyz@gmail.com', 'Sample subject', contents = attach) 获取副本。

内容可以是您也可以添加文本的列表,但由于您没有文本,因此您只能将pip install yagmail文件名作为内容,真棒不是吗? 它读取文件,神奇地确定编码,并附加它:)

答案 1 :(得分:1)

我相信你应该改变这一点:part = MIMEBase('application', 'pdf') 检查How do I send an email with a .csv attachment using Python以了解如何尝试猜测文件类型 其他可能的问题:

  • 尝试添加标头,如下所示: attachment.add_header("Content-Disposition", "attachment", filename=fileToSend)
  • 你在这条线路上使用什么编码器? Encoders.encode_base64(part)。我认为您应该使用from email import encoders然后使用encoders.encode_base64(part)

答案 2 :(得分:1)

试试这个 -

import smtplib
import mimetypes
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


filePath = "fileName.pdf"

From = 'abc@gmail.com'
To = 'xyz@gmail.com'

msg = MIMEMultipart()
msg['From'] = From
msg['To'] = To
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = 'Sample subject'

msg.attach(MIMEText('Sample message'))

try:
    smtp = smtplib.SMTP('smtp.gmail.com:587')
    smtp.starttls()
    smtp.login('abc@gmail.com', '123456')
except:
    i = 1
else:
    i = 0

if i == 0:
    ctype, encoding = mimetypes.guess_type(filePath)
    if ctype is None or encoding is not None:
        # No guess could be made, or the file is encoded (compressed), so
        # use a generic bag-of-bits type.
        ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/', 1)
    if maintype == 'text':
        fp = open(filePath)
        # Note: we should handle calculating the charset
        part = MIMEText(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == 'image':
        fp = open(filePath, 'rb')
        part = MIMEImage(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == 'audio':
        fp = open(filePath, 'rb')
        part = MIMEAudio(fp.read(), _subtype=subtype)
        fp.close()
    else:
        fp = open(filePath, 'rb')
        part = MIMEBase(maintype, subtype)
        part.set_payload(fp.read())
        fp.close()
        # Encode the payload using Base64
        Encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % filePath)
    msg.attach(part)
    try:
        smtp.sendmail(From, To, msg.as_string())
    except:
        print "Mail not sent"
    else:
        print "Mail sent"
    smtp.close()
else:
    print "Connection failed"

改编自: https://docs.python.org/2/library/email-examples.html