Почему электронные письма HTML отправляются планируемым классом APEX с пустыми телами? - PullRequest
5 голосов
/ 23 февраля 2012

У меня есть класс APEX, который используется для отправки электронного письма каждый день в 7 часов вечера:

.
global class ReportBroadcaster implements Schedulable {

    global ReportBroadcaster() {
    }

    global void execute(SchedulableContext sc) {
      send();
    }

    global void send() {
      PageReference page = new PageReference('/apex/nameofvfpage');
      page.setRedirect(true);
      Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
      email.setSubject('Example Subject');
      email.setHtmlBody(page.getContent().toString());
      email.setToAddresses(new String[]{'test@test.com'});
      Messaging.sendEmail(new Messaging.SingleEmailMessage[]{email});     
    }
}

Когда я выполняю метод send () через экземпляр ReportBroadcaster через анонимный APEX, он доставляется, как и ожидалось. Однако, когда я планирую урок, письмо доставляется с пустым телом. Если я переключаю тело письма на обычный текст, оно доставляется нормально (но это не работает для меня).

Как мне сделать эту работу?

UPDATE:

Вы не можете вызывать getContent () для экземпляров PageReference из запланированных методов APEX или @future (я не уверен, почему это так, но это так). Я думаю, что решение будет состоять в том, чтобы создать веб-сервис, который я буду вызывать из метода @future. Кажется невероятно взволнованным, но я не уверен, что еще я мог сделать.

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Вот как отправлять электронные письма в формате HTML с запланированного APEX:

  • Создайте класс, который реализует интерфейс Schedulable.
  • Пусть метод execute () вызывает метод @future.
  • Пусть метод @future вызовет метод с включенной веб-службой в классе, который отправляет электронное письмо.

Пока этот подход обходной, он работает.

Ответы [ 3 ]

5 голосов
/ 23 февраля 2012

getContent() метод не поддерживается в запланированном Apex. Смотрите последнюю строку этой страницы:

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_scheduler.htm

1 голос
/ 16 апреля 2014

Я также столкнулся с той же проблемой и смог найти обходной путь. Я задокументировал свое решение здесь и надеюсь, что оно поможет другим.

http://www.shivasoft.in/blog/salesforce/apex/send-email-with-generated-pdf-as-attachment-from-trigger/

С уважением, Джитендра Заа

1 голос
/ 23 февраля 2012

Я не знаю верхней части головы, почему это не работает (должно), но я могу предложить обходной путь.

Вы можете преобразовать свою страницу vforce в шаблон электронной почты vforce (или создать новый на основе старого, если вы также используете страницу в другом месте), а затем использовать этот шаблон в качестве источника для своей электронной почты. Ключевые моменты для проверки в документации: SingleEmailMessage.setTemplateId в apex docs и <messaging:*> компоненты в vforce docs.

...