none
Smtp e allegati RRS feed

  • Domanda

  • Ciao ho un piccolo problema e non rieco a capire il motivo.In pratica (come faccio per i destinatari) faccio scegliere all'utente di inviare più allegati .Quando aggiungo elementi in questo modo:

    public void AttAdd(string Attadd)
            {
                try
                {
                    msg.Attachments.Add(new Attachment(Attadd));
                }
                catch (FileLoadException)
                {
                    MessageBox.Show("Don't possible open this file","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }

    (naturalmente msg lo ho dichiarato come MailMessage all'inizio del sorgene in pratica in comune con tutti).Invece quando provo ad elminirare non ci riesco:

    public void AttRemove(string attdel2)
            {
                msg.Attachments.Remove(new Attachment(attdel2));
            }

    Quando ci provo esce: ArgumentNullException.Eppure mettendo anche un break point la variabile risulta corretta.

     


    mercoledì 27 luglio 2011 13:27

Risposte

  • Ho scritto una versione ad Extension Methods:
    public static class MailMessageExtensions
    {
    	private static IDictionary<MailMessage, Dictionary<string, Attachment>> messageAttachmentDictionary = 
    		new Dictionary<MailMessage, Dictionary<string, Attachment>>();
    	
    	public static void Destroy()
    	{
    		messageAttachmentDictionary.Clear();
    	}
    	
    	public static void AddAttachment(this MailMessage message, string fileName)
    	{
    		Dictionary<string, Attachment> attachmentDictionary;;
    		
    		if (!messageAttachmentDictionary.ContainsKey(message))
    		{
    			attachmentDictionary = new Dictionary<string, Attachment>();
    			messageAttachmentDictionary.Add(message, attachmentDictionary);
    		}
    		else
    		{
    			attachmentDictionary = messageAttachmentDictionary[message];
    		}
    		
    		var attachment = new Attachment(fileName);
    		attachmentDictionary.Add(fileName, attachment);
    		message.Attachments.Add(attachment);
    	}
    	
    	public static void RemoveAttachment(this MailMessage message, string fileName)
    	{
    		if (!messageAttachmentDictionary.ContainsKey(message))
    		{
    			throw new ArgumentException("The specified MailMessage has no attachments.");
    		}
    		
    		var attachment = messageAttachmentDictionary[message][fileName];
    		message.Attachments.Remove(attachment);
    	}	
    }
    

    La puoi usare così:
    var message = new MailMessage();
    message.AddAttachment(@"c:\file1.pdf");
    message.RemoveAttachment(@"c:\file1.pdf");
    

    Matteo Migliore

    Blog http://blogs.ugidotnet.org/matteomigliore
    Twitter http://twitter.com/matteomigliore
    CodePlex http://hyperionsdk.codeplex.com
    mercoledì 27 luglio 2011 14:35
  • sono riuscito grazie a tutti ;) facevo combobox selected item(cosa che con l'email funzionava visot che con il text non mi funzionava) invece con selected text tutto va bene ;) grazie ancora.
    mercoledì 27 luglio 2011 15:20

Tutte le risposte

  • Ciao Orlando Riccardo,

    Ciao ho un piccolo problema e non rieco a capire il motivo.In pratica (come faccio per i destinatari) faccio scegliere all'utente di inviare più allegati .Quando aggiungo elementi in questo modo:

    public void AttAdd(string Attadd)
            {
                try
                {
                    msg.Attachments.Add(new Attachment(Attadd));
                }
                catch (FileLoadException)
                {
                    MessageBox.Show("Don't possible open this file","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
                }
            }

    (naturalmente msg lo ho dichiarato come MailMessage all'inizio del sorgene in pratica in comune con tutti).Invece quando provo ad elminirare non ci riesco:

    public void AttRemove(string attdel2)
            {
                msg.Attachments.Remove(new Attachment(attdel2));
            }

    Quando ci provo esce: ArgumentNullException.Eppure mettendo anche un break point la variabile risulta corretta.

     



    se può esserti di aiuto ho scritto poco tempo fa questo esempio

    http://code.msdn.microsoft.com/Utilizzo-della-Classe-Mail-4ad3b287

     

    Ciao , se hai bisogno a disposizione.


    Carmelo La Monica  http://community.visual-basic.it/carmelolamonica/
    mercoledì 27 luglio 2011 13:48
  • Qui trovi un riferimento completo all'utilizzo del namespace System.Net.Mail in particolare la gestione degli allegati: http://www.systemnetmail.com/faq/3.4.1.aspx.

    Al metodo Remove devi passare la stessa istanza dell'attachment che hai aggiunto in precedenza, altrimenti non trova nulla, viene fatta una ricerca per reference.

    Dal nome del file non è possibile recuperare l'attachment.

    Puoi risolvere così:
    public class AttachmentManager
    {
    	IDictionary<string, Attachment> attachmentDictionary = 
    		new Dictionary<string, Attachment>();
    	
    	MailMessage message;
    	
    	public AttachmentManager(MailMessage message)
    	{
    		this.message = message;
    	}
    	
    	public void Add(string fileName)
    	{
    		var attachment = new Attachment(fileName);
    		attachmentDictionary.Add(fileName, attachment);
    		message.Attachments.Add(attachment);
    	}
    	
    	public void Remove(string fileName)
    	{
    		if (!attachmentDictionary.ContainsKey(fileName))
    		{
    			throw new ArgumentException("Cannot find an attachment with the specified file name.");
    		}
    		
    		var attachment = attachmentDictionary[fileName];
    		message.Attachments.Remove(attachment);
    	}	
    }
    

    Usandola così:
    var message = new MailMessage();
    var attachmentManager = new AttachmentManager(message);
    attachmentManager.Add(@"c:\file1.pdf");
    



    Matteo Migliore

    Blog http://blogs.ugidotnet.org/matteomigliore
    Twitter http://twitter.com/matteomigliore
    CodePlex http://hyperionsdk.codeplex.com
    mercoledì 27 luglio 2011 14:04
  • Ci passo le stesse variabili solo che il NOME delle variabili sono differenti per non creare ambiguita visot che il programma ha ben 6 form xd e queste usano quasi tutti alcune funzioni della form principale.Ora provo con il tuo esempio Matteo.
    mercoledì 27 luglio 2011 14:13
  • Fa lo stesso ertrore forse dipende dal fatto che quando aggiungo l'allegato uso un open file dialog e poi la sua variabile FileName per ricevere il percorso del file.Invece per rimuoverso uso una combobox in cui ci sono tutti gli allegati inseriti e poi uso la sua veribaile text per ricevere la stringa selezionata.
    mercoledì 27 luglio 2011 14:22
  • Ovviamente devi usare la classe anche per rimuovere gli allegati, sennò non funziona :).
    Matteo Migliore

    Blog http://blogs.ugidotnet.org/matteomigliore
    Twitter http://twitter.com/matteomigliore
    CodePlex http://hyperionsdk.codeplex.com
    mercoledì 27 luglio 2011 14:24
  • Ho scritto una versione ad Extension Methods:
    public static class MailMessageExtensions
    {
    	private static IDictionary<MailMessage, Dictionary<string, Attachment>> messageAttachmentDictionary = 
    		new Dictionary<MailMessage, Dictionary<string, Attachment>>();
    	
    	public static void Destroy()
    	{
    		messageAttachmentDictionary.Clear();
    	}
    	
    	public static void AddAttachment(this MailMessage message, string fileName)
    	{
    		Dictionary<string, Attachment> attachmentDictionary;;
    		
    		if (!messageAttachmentDictionary.ContainsKey(message))
    		{
    			attachmentDictionary = new Dictionary<string, Attachment>();
    			messageAttachmentDictionary.Add(message, attachmentDictionary);
    		}
    		else
    		{
    			attachmentDictionary = messageAttachmentDictionary[message];
    		}
    		
    		var attachment = new Attachment(fileName);
    		attachmentDictionary.Add(fileName, attachment);
    		message.Attachments.Add(attachment);
    	}
    	
    	public static void RemoveAttachment(this MailMessage message, string fileName)
    	{
    		if (!messageAttachmentDictionary.ContainsKey(message))
    		{
    			throw new ArgumentException("The specified MailMessage has no attachments.");
    		}
    		
    		var attachment = messageAttachmentDictionary[message][fileName];
    		message.Attachments.Remove(attachment);
    	}	
    }
    

    La puoi usare così:
    var message = new MailMessage();
    message.AddAttachment(@"c:\file1.pdf");
    message.RemoveAttachment(@"c:\file1.pdf");
    

    Matteo Migliore

    Blog http://blogs.ugidotnet.org/matteomigliore
    Twitter http://twitter.com/matteomigliore
    CodePlex http://hyperionsdk.codeplex.com
    mercoledì 27 luglio 2011 14:35
  • provata ma quando compilo escono due errori :

    Errore    1    Impossibile definire un nuovo metodo di estensione perché il tipo richiesto dal compilatore 'System.Runtime.CompilerServices.ExtensionAttribute' non è stato trovato. Manca un riferimento a System.Core.dll.    C:\Users\Orlando\documents\visual studio 2010\Projects\AnonnymouseEmail\AnonnymouseEmail\MailMessageExtensions.cs    19    42    AnonnymouseEmail

    Errore    2    Impossibile definire un nuovo metodo di estensione perché il tipo richiesto dal compilatore 'System.Runtime.CompilerServices.ExtensionAttribute' non è stato trovato. Manca un riferimento a System.Core.dll.    C:\Users\Orlando\documents\visual studio 2010\Projects\AnonnymouseEmail\AnonnymouseEmail\MailMessageExtensions.cs    38    45    AnonnymouseEmail


    mercoledì 27 luglio 2011 14:46
  • Come suggerisce l'errore, aggiungi la reference a System.Core al progetto in cui usa la classe che ho postato :).
    Matteo Migliore

    Blog http://blogs.ugidotnet.org/matteomigliore
    Twitter http://twitter.com/matteomigliore
    CodePlex http://hyperionsdk.codeplex.com
    mercoledì 27 luglio 2011 15:03
  • Non lo trovo ne in .net ne in COM e neanche se scrivo using System. l'intelesense non me lo da come consiglio.
    mercoledì 27 luglio 2011 15:13
  • forse perchè il progetto è in .net 3.0?
    Ok ho cambiato a 3.5 ma quando faccio remove mi fa lo stesso errore :( ma perchè?
    mercoledì 27 luglio 2011 15:14
  • sono riuscito grazie a tutti ;) facevo combobox selected item(cosa che con l'email funzionava visot che con il text non mi funzionava) invece con selected text tutto va bene ;) grazie ancora.
    mercoledì 27 luglio 2011 15:20
  • Ciao Orlando,

    Grazie di aver condiviso con la community la causa dell’errore.

    Per chiudere il thread puoi contrassegnare come risposta il post che ti ha aiutato di più a trovare la soluzione.

     

    Ti aspettiamo sempre sul forum nel caso avessi bisogno di altri consigli per il tuo itinerario.

    Buon fine settimana!

    Irina


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    LinkedIn

    venerdì 29 luglio 2011 13:51