2013-03-04 4 views
12

Я пытаюсь добавить некоторые вложения в электронное письмо, которое отправляется с использованием apr mandrill через php-обертку. Я попробовал несколько разных вещей, чтобы попытаться успешно прикрепить файл, но безрезультатно. Я использую cakephp 2.x, но я не думаю, что это имеет какое-то особое значение в этом случае (возможно, это делает ?!). Я использую PHP оболочку, поддерживаемую Mandrill в https://bitbucket.org/mailchimp/mandrill-api-phpMandrill file file file file

Вот код:

$mandrill = new Mandrill(Configure::read('Site.mandrill_key')); 
    $params = array(
     'html' => ' 
      <p>Hi '.$user['User']['name'].',</p> 
      <p>tIt is that time of the year again.<br /> 
      <a href="http://my-site.com/members/renewal">Please login to the website members area and upload your renewal requirements</a>.</p> 
      <p>Kind regards.</p>', 
     "text" => null, 
     "from_email" => Configure::read('Site.email'), 
     "from_name" => Configure::read('Site.title'), 
     "subject" => "Renewal Pending", 
     "to" => array(array('email' => $user['User']['email'])), 
     "track_opens" => true, 
     "track_clicks" => true, 
     "auto_text" => true, 
     "attachments" => array(
      array(
       'path' => WWW_ROOT.'files/downloads/renewals', 
       'type' => "application/pdf", 
       'name' => 'document.pdf', 
      ) 
     ) 
    ); 

    $mandrill->messages->send($params, true); 

} 

Это показывает, что вложение было добавлено в сообщение электронной почты и является PDF, но фактическое PDF не было прилагается. Я также попытался, добавив путь непосредственно на файл, как в:

"attachments" => array(
      array(
       'type' => "application/pdf", 
       'name' => WWW_ROOT.'files/downloads/renewals/document.pdf', 
      ) 

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

Любая помощь будет принята с благодарностью.

+0

Почему этот помеченный cakephp тогда? вероятно, было бы разумно хотя бы связать то, что вы используете. никто из нас не имеет хрустальный шар;) – mark

+1

Я использую cakephp 2.x в качестве моей рамки, но я не думал, что это важно. Я думал, что это может быть полезно для будущих людей из трюков, пытающихся использовать мандрилл, чтобы найти эту ссылку. Я отредактирую свое сообщение и упомянул, что я использую cakephp. Если у вас есть опыт использования мандрилла с cakephp, я был бы признателен за ввод. – Manu

+0

Я имею в виду, как вы можете задать вопрос о классе (Mandrill), который никто никогда не видел? как я спрашиваю, как я могу исправить мой метод superAwesomeFooBar() моего класса AdvancedSomething, не упомянув также о месте исходного кода. Вы хотите дать ему шанс? :) – mark

ответ

23

Похоже, вы передаете параметр с именем path, но API-интерфейс Mandrill не принимает путь к файлу для вложений. Если вы используете вызов send или send-template, вложения должны быть ассоциативным массивом (хэш) с тремя ключами: типом, именем и контентом.

Параметр содержимого должен быть содержимым файла в виде кодированной в Base64 строки, поэтому вместо пути вы хотите получить содержимое файла, Base64 закодировать их, а затем передать их в параметре с именем content вместо path.

Вы можете увидеть полную информацию о параметрах, в том числе для вложений, в API документации Mandrill здесь: https://mandrillapp.com/api/docs/messages.html#method=send

+2

Спасибо Kaitlin. Извините за мое невежество. Я не знаком с использованием Mandrill, и я не использовал base64 что-либо или в этом случае вложенные файлы в электронные письма раньше. Пока я очень впечатлен Mandrill и ценю вашу быструю обратную связь! – Manu

+0

Да, спасибо за прыжок в stackoverflow с нами:) Это очень полезно. – Costa

23

OK. Так спасибо Кейтлин за ее вклад. РНР способ справиться с этим, чтобы получить файл, а затем base64_encode его:

$attachment = file_get_contents(WWW_ROOT.'files/downloads/file.pdf'); 
$attachment_encoded = base64_encode($attachment); 

, а затем в прикреплённой части массива Mandrill вы передаете:

"attachments" => array(
     array(
      'content' => $attachment_encoded, 
      'type' => "application/pdf", 
      'name' => 'file.pdf', 
     ) 

Так легко! Еще раз спасибо Кейтлин!

+0

Привет @Manu, а как его декодировать? Как сохранить декодированный base64? – CodeGuru

+0

Я не знаю, чего вы пытаетесь достичь, но этот поток рассказывает о том, как прикреплять и отправлять файлы с помощью apr mandrill. Когда вы получаете файл, вам не нужно ничего делать с файлом. Он доступен для загрузки, как и любое приложение электронной почты. – Manu

+0

Вы имеете в виду, что Mandrill предоставит нам ссылку для его загрузки? – CodeGuru