Класс EmailMessage в google app engine не работает? - PullRequest
0 голосов
/ 26 июня 2018

Документ движка приложения Google не обновляется?

Он работает нормально (отправьте электронное письмо с вложением), когда я делаю это:

message = mail.EmailMessage( sender=EMAIL_SENDER, 
subject=subject,body=theBody,to=['test@gmail.com'],attachments=[(attachname, 
new_blob.archivoBlob)])
message.send()

Но когда я использую message.attach,он говорит EmailMessage объект не имеет атрибута attach

message.attach("certificate.pdf", new_file, "application/pdf")
or
message.Attachment("certificate.pdf", new_file, "application/pdf")

оба говорят: EmailMessage объект не имеет атрибута attach/attachment

В документации есть примеры " Приложение ».

Пожалуйста, помогите!

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Атрибуты класса EmailMessage назначаются динамически, например: *:

class EmailMessage(_EmailMessageBase):

    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

Поэтому, если attachments не передается конструктору в качестве аргумента ключевого слова,экземпляр не имеет атрибута attachments, и вы получите AttributeError, если попытаетесь сослаться на него.

Как заметил Джофр в своем ответе, вы все равно можете напрямую присвоить attachments:

message.attachments = [attachment1]

после создания атрибута attachments, вы также можете добавить к нему:

message.attachments.append(attachment2)

* Это упрощенная версия;в реальном классе присваивание выполняется отдельным методом, но по существу таким же образом.

0 голосов
/ 26 июня 2018

Я исправил проблему с функцией send_mail, одна из ошибок не заключалась в указании «.pdf» для имени файла, вместо этого я только назвал его «сертификат»

Также, если вы указали какие-либо обработчики в приложении.yaml для прямого доступа к URL, убедитесь, что для application_readable установлено значение true, чтобы файл был доступен в приложении:

- url: /certificate.((pdf)|(PDF))
  static_files: pages/pdf/certificate.PDF
  upload: pages/pdf/certificate.PDF
  application_readable: true

 additional_pdf = open(os.path.dirname(__file__) + '/../pages/pdf/certificate.pdf').read()

 mail.send_mail(sender=EMAIL_SENDER,
                  to=['mmyemail@gmail.com'],
                  subject=subject,
                  body=theBody,
                  attachments=[(attachname, blob.archivoBlob),("certificate.pdf",additional_pdf)])
0 голосов
/ 26 июня 2018

Насколько я вижу в документах, есть класс google.appengine.api.mail.Attachment, но класс google.appengine.api.mail.EmailMessage не имеет никакого метода attach().

Класс google.appengine.api.mail.EmailMessage имеет свойство attachment, и поэтому оно работает, когда вы инициализируете письмо с attachments=[(foo,bar),(foo,bar)].Вы на самом деле создаете новые экземпляры google.appengine.api.mail.Attachment (используя кортежи, как объяснено в в документации ), добавляете их в массив и используете этот массив в качестве свойства attachmentsпри инициализации электронной почты.

Обратите внимание, что в документах, когда они пишут attachment = mail.Attachment('foo.jpg', 'data'), mail является ссылкой на импортированный google.appengine.api.mail, а не на экземпляр объекта почты.

Возвращаясь к вашему примеру (обратите внимание, что я не разработчик Python и я не пробовал его, я просто просматриваю документы и делаю предположения), вместо

message.attach("certificate.pdf", new_file, "application/pdf")

вам следуетвероятно, пойдем дальше по пути

attachment1 = mail.Attachment("certificate.pdf", new_file, "application/pdf")
attachment2 = mail.Attachment("another_certificate.pdf", new_file, "application/pdf")
message.attachments = [attachment1, attachment2]

Прошло много лет с тех пор, как я играл с python, но не стесняйтесь исследовать эти идеи и редактировать мой ответ на случай, если я что-то не так (или опубликовать свой собственный ответ).

...