2013-04-30 4 views
0

Мы пытаемся отправить электронные письма с вложениями, но по некоторым причинам вложения не отображаются для людей, использующих Outlook.Вложения не отображаются в Outlook при отправке через python

Если они отправляют электронное письмо кому-либо, использующее gmail, оно отлично отображается в gmail.
Если пользователь gmail отправляет письмо пользователю Outlook, он отображается в Outlook (вероятно, потому, что gmail перестраивает сообщение).

Это код, который мы используем, чтобы отправить по электронной почте:

def send_email(headers={}, attachments=[], body={}): 
    ADDRESS_HEADERS = set(['from', 'to', 'cc', 'bcc', 'reply-to']) 
    msg = MIMEMultipart('alternative') 
    msg.preamble = "You need a MIME-aware email client to read this email.\n" 

    def add_headers(): 
     def encode_address(v): 
      (name, address) = parseaddr(v) 
      name = str(Header(unicode(name), 'utf-8')) 
      address = address.encode('ascii') 
      return formataddr((name, address)) 

     for key, value in headers.iteritems(): 
      if not isinstance(value, list): 
       value = [value] 
      if key.lower() in ADDRESS_HEADERS: 
       value = map(encode_address, value) 
      msg[key.title()] = u';'.join(value) 

    def set_body(): 
     msg.attach(MIMEText(body.get('text', ''), 'plain', _charset='utf-8')) 
     if 'html' in body: 
      msg.attach(MIMEText(body['html'], 'html', _charset='utf-8')) 

    def attach_file(attachment): 
     maintype, subtype = attachment['mimetype'].split("/", 1) 
     part = MIMEBase(maintype, subtype) 
     filename = attachment['filename'] 
     name = attachment.get('name', os.path.basename(filename)) 
     with open(filename, 'rb') as f: 
      part.set_payload(f.read()) 
     encoders.encode_base64(part) 
     part.add_header('Content-Disposition', 'attachment', filename=name) 
     msg.attach(part) 

    add_headers() 
    map(attach_file, attachments) 
    set_body() 
    composed = msg.as_string() 

    p = subprocess.Popen("sendmail -t", shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 
    (stdout, stderr) = p.communicate(composed) 
    if p.returncode != 0: 
     raise IOError(u'{}\n\n{}'.format(stdout, stderr).strip()) 

Это чрезвычайно трудно найти любую соответствующую информацию из-за фрагментации реализаций электронной почты.

В мы Прикрепление файлов являются Excel файлов с типом пантомимы application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

Я пытаюсь найти более подробную информацию о том, который используется прогноз версия.

ответ

1

Две вещи, которые вы можете попробовать. Во-первых, я имел более высокую надежность с MimeType установлен в стандартный мешок из-битов, независимо от типа вы действительно представляемого:

part = MIMEBase('application', "octet-stream")

Во-вторых, увидеть, если изменение заголовка вложения, как это помогает:

part.add_header('Content-Disposition', 'attachment; filename="%s"' % name) 

Настройка такого заголовка работает для нас, отправляя в Outlook. Это используется версия электронной почты «4.0.3». Я не знаю, какую версию вы используете. Как вы знаете, их множество.

+0

'part.add_header («Content-Disposition»,«присоединение», имя файла = имя)' должен быть эквивалент того, что вы написали. Я попробую обобщить тип mime. –

+0

У меня возникают проблемы при использовании 'part = MIMEBase ('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet')'. IMO 'part = MIMEBase ('application', 'octet-stream')' работает лучше всего с любым типом, а также – jes516

0

Это довольно просто при использовании win32com.client

После создания SendEmail объекта, это довольно просто.

import win32com.client 
outlook_obj = win32com.client.Dispatch ("Outlook Application") 
sendEmail_obj = outlook_obj.CreateItem(0x0) 

Создать список строк, каждая из строк является полный путь к файлу, который вы хотите прикрепить к текущему SendEmail объекта (т.е. «C: /User/SubFolder/Filename.pdf»).

После добавления соответствующих строк, таких как получателя Адрес электронной почты, Тема и тело, как так:

sendEmail_obj.To ("[email protected]") 
sendEmail_obj.Subject ("Subject Title String") 
sendEmail_obj.Body ("Dear Friend:\n \t I wanted to...") 

Ваш список вложений Путь строковых элементов должен каждый представляет полный путь файловой системы к элементу, который вы хотели бы прикреплять. Давайте назовем этот список строк пути нашим вложением_pathlist.

for CurrentAttachmentPath in attachment_pathlist : 
    sendEmail_obj.Attachments.Add (CurrentAttachmentPath) 

Это должно подготовить все вложения для проводов. И тогда все, что осталось ...

sendEmail_obj.Send() 
Смежные вопросы