2010-03-16 5 views
0

Utilisation du dernier instantané d'Indy tiburon sur D2010. Un projet très simple comme:Indy IdSMTP et pièces jointes dans Thunderbird

var 
    stream: TFileStream; (s is TidSMTP and m is TidMessage) 
begin 
    s.Connect; 
    Stream := TFileStream.Create('c:\Test.zip', fmOpenRead or fmShareExclusive); 
    try 
    with TIdAttachmentMemory.Create(m.MessageParts, Stream) do 
    begin 
     ContentType := 'application/x-zip-compressed'; 
     Name := ExtractFilePath('C:\'); //' 
     FileName := 'Test.zip'; 
    end; 
    finally 
    FreeAndNil(Stream); 
    end; 
    s.Send(m); 
    s.Disconnect(); 
end; 

Tout fonctionne bien dans Outlook, La chauve-souris !, OE, Yahoo, etc ... mais dans Thunderbird l'attachement n'apparaît pas. En regardant la source du message dans Thunderbird, la pièce jointe est là. La seule différence que je peux trouver entre les messages envoyer par indy et d'autres clients est que les messages Indy ont cet ordre:

Content-Type: multipart/mixed; boundary="Z\=_7oeC98yIhktvxiwiDTVyhv9R9gwkwT1" 
MIME-Version: 1.0 

alors que tous les autres clients ont l'ordre:

MIME-Version: 1.0 
Content-Type: multipart/mixed; boundary="Z\=_7oeC98yIhktvxiwiDTVyhv9R9gwkwT1" 

Je ne sais pas si est la source du problème, mais si oui: est-ce un bug sur Thunderbird ou est-ce un problème avec indy qui "malforme" les en-têtes des messages? Cette commande est-elle un problème? Cela compte-t-il de toute façon?

+0

êtes-vous en mesure de mettre le message complet avec des en-têtes quelque part (comme un pastebin)? – glob

Répondre

1

La dernière version (comme aujourd'hui) d'Indy a un problème dans les en-têtes:

Le problème semble être autour de la ligne dans l'en-tête de courrier avec:

Content-Type: multipart/mixed; boundary = « oIROJ8Yu4KsL8BbjOo0fc \ = _ O7oAqLVq97i »

Le « = » à l'intérieur de l'identifiant limite est préfixé avec un « \ » (probablement pour échapper), mais dans le corps du courrier de la frontière ressemble à ceci:

--oIROJ8Yu4KsL8BbjOo0fc = _O7oAqLVq97i

Si vous regardez la source d'Indy, dans le fichier idGlobalProtocols, appelle ReplaceHeaderSubItem QuoteString, qui est celui qui ajoute la barre oblique inverse. Vous pouvez modifier la logique avec soin et recompiler Indy.

+0

THANKKKKKKKSSSS. C'EST!!!! – Lobuno

+0

Cela a déjà été corrigé dans le dernier instantané. –

+0

@Remy, je le rencontre toujours dans la révision 4308 du tronc Indy10. Pourriez-vous indiquer dans quelle révision il a été corrigé? – andrius

0

RFC 1521 stipule explicitement:

messages composés conformément à ce document MUST comprennent un tel champ d'en-tête , avec le texte textuellement ce qui suit:

MIME-Version: 1.0

Et notez qu'il est un champ d'en-tête:

champs d'en-tête sont des lignes composées d'un nom de domaine , suivi de deux points (« : »), suivie par un corps de champ, et terminée par CRLF. (rfc 2822)

Ainsi si Indy ne définit pas comme un champ d'en-tête, il est un bug Indy, à mon humble avis sa syntaxe est invalide, il ne peut pas être dans la ligne de type de contenu (peut-être juste un manque CRLF?) - et TB suit juste le RFC mot pour mot, tandis que les autres connaissent le RFC ne sont souvent pas suivis complètement et traitent le document anyay.

+0

Je ne sais pas pourquoi Stack overflow a désordonné la disposition mais Indy inclut le CRLF: Une ligne: Type de contenu: multipart/mixed; boundary = "Z \ = _ 7oeC98yIhktvxiwiDTVyhv9R9gwkwT1" Ligne suivante: MIME-Version: 1.0 Mais dans cet ordre alors que les autres programmes l'ont dans l'autre sens. Cela pourrait-il être la cause du problème? – Lobuno

+0

Bienvenue dans Stack Overflow, Lobuno. Ce que vous avez posté était correct, mais mal formaté. Rruz a essayé de le formater, mais n'a pas eu la ligne droite. Stack Overflow n'est pas à blâmer. S'il vous plaît regardez l'aperçu avant de poster la prochaine fois. Si vous remarquez une erreur plus tard, modifiez le pour corriger, comme Rruz et moi l'avons fait. –

+0

Mmh, j'ai été trompé :). Eh bien, il est logique que le champ d'en-tête MIME-version précède le type de contenu, car il renvoie la version MIME et ce qui suit pourrait en dépendre (bien que jusqu'à présent, il n'en était pas besoin). Le RFC introduit la version MIME avant Content-type, bien que AFAIK ne spécifie pas la commande. Il se pourrait que TB soit assez strict dans son analyse. Essayez d'exporter le message, changez la position de l'en-tête et rouvrez-le. S'il montre la pièce jointe, c'est l'analyseur TB, bien qu'Indy devrait aussi changer l'ordre. –

0

Vous devriez essayer quelque chose comme ceci: (Note: Le code ne vous montre pas comment envoyer le message, mais comment le créer, il y a un autre service qui envoie les emails).

Msg := TIdMessage.Create(nil); 
try 
    {create the message} 
    Msg.Subject := Subject; 
    with Msg.Recipients.Add do 
    begin 
    Text := EMailAddress; 
    end; 
    Msg.From.Address := From; 
    Msg.From.Name := Copy(From, 1, pos('@', From) - 1); 
    with Msg.ReplyTo.Add do 
    begin 
    Text := From; 
    end; 
    with TIdMessageBuilderHtml.Create do 
    try 
    {plain text} 
    PlainText.Text := 'body text' 
    {html body} 
    Html.Text := '<html><body><p>' + 'body text' + '</p></body></html>'; 
    {attachments} 
    for i := 0 to AttachFiles.Count - 1 do 
     Attachments.Add(AttachFiles.Strings[i]); 
    FillMessage(Msg); 
    finally 
    Free; 
    end; 
    {save the message for sending} 
    Msg.NoEncode := False; 
    Msg.NoDecode := False; 
    Msg.SaveToFile(locfilename + TempExt); 
finally 
    Msg.Free; 
end; 

Réponse à Rob commentaire de Kennedy ci-dessous: J'affiché ce code parce que pour moi, ce code fonctionne avec tous les clients de messagerie principaux. Le code est explicite, crée le message avec pièces jointes, l'enregistre. J'ai posté une solution qui fonctionne. Je n'ai pas le temps (je suis au travail) de comparer les en-têtes ou la source de message du code original le et celui posté par moi pour voir pourquoi le mien fonctionne. L'affiche originale est libre de le faire et de rendre compte.

+0

Pouvez-vous décrire ce qui rend ce code correct et l'autre code incorrect? Quelle partie de ce code est ce qui en fait "quelque chose comme ça"? Ne publiez pas seulement du code pour copier et coller aveuglément. Aidez-nous à apprendre. –

Questions connexes