Возникли проблемы с электронной почтой сборки Python - PullRequest
1 голос
/ 21 октября 2011

Я разработал систему электронной почты для своего клиента, используя библиотеку email.mime. Я работаю очень хорошо для некоторых почтовых клиентов. Например, на Gmail я вижу HTML-текст и файл вложения, но на Yahoo я получаю пустое письмо. Вот код:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
import email.charset

from email import Encoders
def buildEmail(from_email, to_email, subject, text_msg, html_msg, attach_pdf_file):
    """
    This function build a body for text/html message and if attachment file provide
    then it will attach it too with email.
    """

    # Create message container - the correct MIME type is multipart/alternative.

    msgRoot = MIMEMultipart('alternative')
    msgRoot['Subject'] = subject

    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    msgRoot.epilogue = ''


    # Record the MIME types of both parts - text/plain and text/html.
    text_part = MIMEText(text_msg, 'plain')
    msgRoot.attach(text_part)

    if html_msg is not None and html_msg != '':
        html_part = MIMEText(html_msg, 'html')
        msgRoot.attach(html_part)


    # Attach a file if provided
    if attach_file is not None and attach_file != '':
        fp = open(attach_pdf_file, 'rb')
        part = MIMEBase('application', 'pdf')
        part.set_payload( fp.read() )
        Encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment', filename="%s"%          os.path.basename(attach_pdf_file))
        msgRoot.attach(part)
        fp.close()


    s = smtplib.SMTP('localhost')
    s.sendmail(from_email, to_email, msgRoot.as_string())
    s.quit()

Есть идеи, где я ошибаюсь?

1 Ответ

0 голосов
/ 15 июля 2012

Я вижу несколько проблем с этим кодом, которые вообще не должны работать на Python 2.x.

1) Вы нигде не определяете attach_file, поэтому эта строка вызывает исключение:

if attach_file is not None and attach_file != '':

Вы имели в виду attach_pdf_file? Изменение attach_file на attach_pdf_file исправляет это исключение.

2) Возможно, вы просто исключили его из примера кода, но вы вызываете функцию из os.path, но вы никогда не import os нигде в вашем скрипте. Добавление, которое исправляет это исключение.

Как только эти проблемы будут исправлены, запуск сценария в моей системе с адресом from в качестве адреса gmail вызывает следующее исключение:

Traceback (most recent call last):
  File "/home/ra/Desktop/stack-overflow.py", line 50, in <module>
    "output.pdf")
  File "/home/ra/Desktop/stack-overflow.py", line 44, in buildEmail
    s = smtplib.SMTP('localhost')
  File "/usr/lib/python2.7/smtplib.py", line 249, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python2.7/smtplib.py", line 309, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/lib/python2.7/smtplib.py", line 284, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "/usr/lib/python2.7/socket.py", line 571, in create_connection
    raise err
error: [Errno 111] Connection refused

У меня нет SMTP-сервера, настроенного локально на этом компьютере, что объясняет, почему я получаю ошибку, которую я делаю. В вашем случае, если электронная почта отправляется должным образом, но только для некоторых поставщиков электронной почты, это может быть связано с тем, что поставщик электронной почты понимает, что, хотя адрес является Yahoo, SMTP-сервер не является и, таким образом, отказывается от Эл. адрес. Это всего лишь догадка, но это может объяснить это (если бы это было не так, любому было бы еще проще отправить электронное письмо «с» любого адреса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...