2015-02-23 72 views
0

全部。在嘗試使用python的email包與smtplib一起發送電子郵件時遇到了一些問題。我已經設置了一個發送電子郵件的功能,它運行良好,除了電子郵件總是沒有主題。我對python並不陌生,但對於像這樣的與互聯網相關的東西,我是新手。我已經在本論壇中的幾個答案以及documentation中的示例中設置了以下內容。用python發送郵件 - 郵件丟失主題

import smtplib 
from os.path import basename 
from email import encoders 
from email.mime.application import MIMEApplication 
from email.mime.base import MIMEBase 
from email.mime.audio import MIMEAudio 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email.utils import COMMASPACE, formatdate 
def send_mail(send_from, send_to, subject, text, files=None, server="smtp.gmail.com"): 
    import mimetypes 
    assert isinstance(send_to, list) 
    msg = MIMEMultipart(From=send_from, To=COMMASPACE.join(send_to), Date=formatdate(localtime=True), Subject=subject) 
    msg.attach(MIMEText(text)) 
    for f in files or []: 
      print f 
      ctype,encoding=mimetypes.guess_type(f) 
      if ctype is None or encoding is not None: 
        ctype = 'application/octet-stream' 
      maintype, subtype = ctype.split('/', 1) 
      if maintype == 'text': 
        fp = open(f) 
        msg = MIMEText(fp.read(), _subtype=subtype) 
        fp.close() 
      elif maintype == 'image': 
        fp = open(f, 'rb') 
        msg = MIMEImage(fp.read(), _subtype=subtype) 
        fp.close() 
      elif maintype == 'audio': 
        fp = open(f, 'rb') 
        msg = MIMEAudio(fp.read(), _subtype=subtype) 
        fp.close() 
      else: 
        fp = open(f, 'rb') 
        msg = MIMEBase(maintype, subtype) 
        msg.set_payload(fp.read()) 
        fp.close() 
        encoders.encode_base64(msg) 
      msg.add_header('Content-Disposition', 'attachment', filename=basename(f)) 
    smtp = smtplib.SMTP(server) 
    smtp.starttls() 
    usrname=send_from 
    pwd=raw_input("Type your password:") 
    smtp.login(usrname,pwd) 
    smtp.sendmail(send_from, send_to, msg.as_string()) 
    smtp.close() 

調用函數send_mail('[email protected]',['[email protected]'],'This is the subject','Hello, World!')會導致電子郵件正確發送但沒有主題。

帶或不帶文件的輸出是相同的。另外,閱讀文檔也沒有幫助我。

我很感激任何幫助。

回答

1

不是傳遞主題作爲參數傳遞給MimeMultipart的,儘量的值賦給消息:

msg['Subject'] = subject

很好的例子,在docs:https://docs.python.org/3/library/email-examples.html

+0

我已經試過了,在沒有工作第一。對不起,我忘了在郵件中提到。但是,既然你說過,我又試了一次,結果奏效了。我意識到不同之處在於我只是將代碼行添加到代碼中,因此我在第一次調用MIMEMultipart時設置了主題,然後再次執行了msg ['Subject'] = subject',並且它沒有沒有工作。然而,從我的'MIMEMultipart'調用中刪除'Subject = subject'選項,然後添加你的行,確實有效。你知道爲什麼會發生嗎? – TomCho 2015-02-24 11:57:48

+0

MIMEMultipart子類爲Message類。該類有一個稱爲[keys](https://docs.python.org/3/library/email.message.html#email.message.Message.keys)的方法,當被調用時,它顯示消息的標題。我相信主題必須添加爲郵件的標題,您可以通過將主題的值分配給「主題」鍵進行添加,如上所示。 – 2015-02-24 15:20:49