Problème d'envoi de plusieurs parties mail à l'aide de ActionMailer
J'utilise le code suivant pour envoyer des e-mails dans les rails:
class InvoiceMailer < ActionMailer::Base
def invoice(invoice)
from CONFIG[:email]
recipients invoice.email
subject "Bevestiging Inschrijving #{invoice.course.name}"
content_type "multipart/alternative"
part "text/html" do |p|
p.body = render_message 'invoice_html', :invoice => invoice
end
part "text/plain" do |p|
p.body = render_message 'invoice_plain', :invoice => invoice
end
pdf = Prawn::Document.new(:page_size => 'A4')
PDFRenderer.render_invoice(pdf, invoice)
attachment :content_type => "application/pdf", :body => pdf.render, :filename => "factuur.pdf"
invoice.course.course_files.each do |file|
attachment :content_type => file.content_type, :body => File.read(file.full_path), :filename => file.filename
end
end
end
Il semble bien pour moi, et les e-mails s'affichent également comme elles le devraient dans le Gmail interface web. Dans le Courrier (le programme Apple), cependant, j'ai juste 1 de la pièce jointe (où il doit être 2) et il n'y a pas de texte. Je n'arrive pas à comprendre quelle en est la cause.
J'ai copié l'e-mail à partir des journaux:
Le courrier envoyé à [email protected] De: [email protected] Pour: [email protected] Sujet: Bevestiging Inschrijving Authentiek Spreken Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=mimepart_4a5b035ea0d4_769515bbca0ce9b412a --mimepart_4a5b035ea0d4_769515bbca0ce9b412a Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: Quoted-printable Content-Disposition: inlineCher monsieur
= --mimepart_4a5b035ea0d4_769515bbca0ce9b412a Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: Quoted-printable Content-Disposition: inline Cher monsieur * Foo= --mimepart_4a5b035ea0d4_769515bbca0ce9b412a Content-Type: application/pdf; nom=factuur.pdf Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=factuur.pdf JVBERi0xLjMK/////woxIDAgb2JqCjw8IC9DcmVhdG9yIChQcmf3bikkl1by b2R1Y2VyIChQcmF3bikKPj4KZW5kb2Jqcjigmcbvymokpdwgl0nvdw50idek ... ... ... MCBuIAp0cmFpbGVyCjw8IC9JbmZvIDEgmcbsci9taxplidexci9sb290idmg MCBSCj4+CnN0YXJ0eHJlZgo4Nzc1CiUlRU9GCg== --mimepart_4a5b035ea0d4_769515bbca0ce9b412a Content-Type: application/pdf; nom=Spelregels.pdf Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=Spelregels.pdf JVBERi0xLjQNJeLjz9MNCjYgMCBvYmoNpdwvtgluzwfyaxplzcaxl0wgmjex NjYvTyA4L0UgMTY5NTIvTiAxL1QgMjEwmdavscbbidg3niaxotjdpj4nzw5k ... ... ... MDIwNzQ4IDAwMDAwIG4NCnRyYWlsZXINcjw8l1npemugnj4+DQpzdGFydHhy ZWYNCjExNg0KJSVFT0YNCg== --mimepart_4a5b035ea0d4_769515bbca0ce9b412a--
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que le problème est que vous êtes à la définition de l'ensemble de l'e-mail comme multipart/alternative, ce qui suggère que chaque partie est juste un point de vue différent sur le même message.
- Je utiliser quelque chose comme ce qui suit pour envoyer mixte html/plaine des e-mails avec pièces jointes, et il semble fonctionner OK.
@jcoleman est correct, mais si vous ne voulez pas utiliser son bijou alors c'est peut-être une meilleure solution:
Ce code commence par créer le MIME suivants de la hiérarchie:
multipart/related
multipart/alternative
text/html
text/plain
image/png
Après l'appel à
mail
nous allons créer un nouveaumultipart/related
partie et d'ajouter les enfants de la partie existante (retrait, comme nous le go). Puis nous forcer laContent-Type
êtremultipart/mixed
et continuer d'ajouter des pièces jointes, avec la MIME hiérarchie:multipart/mixed
multipart/related
multipart/alternative
text/html
text/plain
image/png
application/pdf
Un clin d'œil à James sur cette question, comme il m'a aidé à obtenir notre courrier le droit de travailler.
Une légère raffinement à cela: d'Abord, nous utilisons le bloc des arguments dans les blocs pour ajouter des pièces (j'ai eu des problèmes quand je n'ai pas).
Aussi, si vous souhaitez utiliser des mises en page, vous devez utiliser #rendre directement. Voici un exemple de deux principes à l'œuvre. Comme indiqué ci-dessus, vous devez assurez-vous de garder la partie html dernier.
Cet exemple utilise une des options de hachage pour créer un générique de message multipart avec les pièces jointes et la mise en page, ce qui vous permettrait de l'utiliser comme ceci:
(Nous n'avons pas fait cela: c'est plus agréable d'avoir chaque expéditeur de remplir un grand nombre de ces détails pour vous, mais j'ai pensé que ce serait plus facile de comprendre le code).
Espère que ça aide. Le meilleur de la chance.
Ce qui concerne,
Dan
Rails 3, gère le courrier électronique différemment, et alors que le cas simple est facile, l'ajout de la bonne MIME hiérarchie pour multipart e-mail avec d'autres types de contenu et (inline) pièces jointes est plutôt compliqué (principalement parce que la hiérarchie nécessaire est donc complexe.)
Phil réponse ne semble pas fonctionner-mais les pièces jointes n'est pas visible sur l'iPhone (et peut-être d'autres appareils) depuis le MIME de la hiérarchie est toujours incorrecte.
Le MIME correct hiérarchie finit par ressembler à ceci:
multipart/mixed
multipart/alternative
multipart/related
text/html
image/png
(par exemple, pour une ligne d'attachement; pdf serait un autre bon exemple)text/plain
application/zip
(e.g pour une pièce jointe--pas inline)J'ai publié un joyau qui contribue à soutenir la hiérarchie correcte:
https://github.com/jcoleman/mail_alternatives_with_attachments
Généralement lors de l'utilisation de ActionMailer 3, vous pouvez créer un message avec le code suivant:
À l'aide de ce joyau de créer un e-mail avec à la fois des solutions de rechange et des pièces jointes vous utilisez le code suivant:
Note: Ma technique ci-dessous fonctionne dans certains cas. Toutefois, lorsqu'il est combiné avec des images en ligne, il sera la cause de l'attachement à pas sur l'iPhone Mail, et peut-être sur d'autres clients. Voir jcoleman la réponse ci-dessous pour une solution complète.
Il est intéressant de noter que les Rails s'occupe désormais de ce, à moins que de 3.1rc4. À partir de la ActionMailer guide:
L'astuce est d'ajouter la pièce jointe avant vous faites l'appel à
mail
—ajout de la pièce jointe après déclenche les trois alternatives problème mentionné dans la question.Rails 3, la Solution, multipart alternative e-mail (html et plaine) avec pièce jointe au format pdf, pas de pièces jointes en ligne
Auparavant j'ai eu des mails indiquant uniquement le fichier pdf en pièce jointe et ni brut, ni le html dans le corps lorsqu'ils ont été ouverts dans ios ou mail.application sur osx. Gmail n'a jamais été un problème.
J'ai utilisé la même solution que Corin, si je n'ai pas besoin de la ligne de pièce jointe. Qui m'a d'assez loin à l'exception d'un problème de messagerie.app /iOS mail a montré le texte en clair pas le html. C'était (enfin si transpiré) en raison de l'ordre dans lequel les pièces de rechange est venu à travers, html et texte (pourquoi cela devrait être le facteur décisif me bat, mais de toute façon).
J'ai donc dû faire une modification de plus, plutôt ridicule, mais ça marche. ajouter la .inverse! méthode.
j'ai donc
Rails 4 solution
Dans notre projet, nous envoyez des e-mails des clients qui comprennent un logo de l'entreprise (inline pièce jointe) et PDF (pièce jointe ordinaire). La solution de contournement que nous avions mis en place était similaire à celui fourni ici par @user1581404.
Cependant, après la mise à niveau du projet de Rails de 4 il nous fallait trouver une nouvelle solution, car vous n'êtes plus autorisé à ajouter des pièces jointes après l'appel de la
mail
commande.De nos mails ont une base mailer, nous avons corrigé ce problème en remplaçant le courrier méthode:
N. B. Rails 3.2 solution.
Tout comme ces multipart e-mails, il y a plusieurs parties à cette réponse, donc je vais disséquer en conséquence:
L'ordre de la plaine/format html dans @Corin "mixte" de l'approche est importante. J'ai trouvé le texte suivi par html m'a donné les fonctionnalités que j'avais besoin. YMMV
Paramètre Content-Disposition à zéro (à supprimer) fixe l'iPhone/iOS visualisation de la pièce jointe difficultés exprimées dans d'autres réponses. Cette solution a été testée en tant que travail d'Outlook pour Mac, Mac OS/X Mail et de Messagerie iOS. Je soupçonne que les autres clients de messagerie marcherait aussi bien.
À la différence des précédentes versions de Rails, la gestion des pièces jointes travaillé comme annoncé. Mon plus gros problèmes étaient généralement causés par la tentative de vieilles solutions de contournement que seulement aggravé les problèmes pour moi.
Espère que cela aide quelqu'un à éviter mes pièges et de culs-de-sacs.
Code de travail: