2015-09-25 14 views
5

Desidero inviare un messaggio utilizzando l'API Gmail di Google. Mi sono autenticato correttamente e sto cercando di utilizzare GmailService per inviare un messaggio.Come creare un messaggio API Gmail

Mi piacerebbe usare questo:

myService.Users.Messages.Send(myMessage, "me").Execute(); 

dove myService è un Google.Apis.Gmail.v1.GmailService e myMessage è un Google.Apis.Gmail.v1.Data.Message.

myService va bene, ho fatto la danza OAuth. Posso ricevere messaggi dalla mia Posta in arrivo e tutto il resto. Ma non so come costruire myMessage. Ho uno standard .NET MailMessage, con oggetto leggibile, Corpo, A, Da, ecc

Ma la classe di Google Message prende campi Payload o Raw. Qual è il modo più semplice per convertire un intero in una stringa che posso impostare sulle proprietà Payload o Raw? O non è questo ciò che dovrei fare?

The documentation for the Message class.

risposta

7

Ho trovato una soluzione. Stranamente, .NET non sembra supportare questo in modo nativo/facilmente. C'è però un bel pacchetto di nuget, chiamato AE.Net.Mail, che può scrivere un oggetto messaggio facile da creare su uno stream.

Here's the sample code that pointed me in that direction.

copia e incollato codice come sito sembra essere verso il basso, e la cache di Google potrebbe non durare per sempre:

using System.IO; 
using System.Net.Mail; 
using Google.Apis.Gmail.v1; 
using Google.Apis.Gmail.v1.Data; 

public class TestEmail { 

    public void SendIt() { 
    var msg = new AE.Net.Mail.MailMessage { 
     Subject = "Your Subject", 
     Body = "Hello, World, from Gmail API!", 
     From = new MailAddress("[you]@gmail.com") 
    }; 
    msg.To.Add(new MailAddress("[email protected]")); 
    msg.ReplyTo.Add(msg.From); // Bounces without this!! 
    var msgStr = new StringWriter(); 
    msg.Save(msgStr); 

    var gmail = new GmailService(Context.GoogleOAuthInitializer); 
    var result = gmail.Users.Messages.Send(new Message { 
     Raw = Base64UrlEncode(msgStr.ToString()) 
    }, "me").Execute(); 
    Console.WriteLine("Message ID {0} sent.", result.Id); 
    } 

    private static string Base64UrlEncode(string input) { 
    var inputBytes = System.Text.Encoding.UTF8.GetBytes(input); 
    // Special "url-safe" base64 encode. 
    return Convert.ToBase64String(inputBytes) 
     .Replace('+', '-') 
     .Replace('/', '_') 
     .Replace("=", ""); 
    } 
} 
+1

Per chi guarda questo in futuro, assicurati di utilizzare il pacchetto Nuget 'AE.Net.Mail' (https://www.nuget.org/packages/AE.Net.Mail/) e non 'System.Net.Mail' (https://msdn.microsoft.com/en-us/library/system.net.mail(v=vs.110).aspx). Sono * molto * simili, ma funzionano in modo leggermente diverso (ad es. 'System.Net.Mail.MailMessage' non ha il metodo' Save') – derekantrican

0

Ecco una versione alternativa usando usando MimeKit.

public void SendEmail(MyInternalSystemEmailMessage email) 
{ 
    var mailMessage = new System.Net.Mail.MailMessage(); 
    mailMessage.From = new System.Net.Mail.MailAddress(email.FromAddress); 
    mailMessage.To.Add(email.ToRecipients); 
    mailMessage.ReplyToList.Add(email.FromAddress); 
    mailMessage.Subject = email.Subject; 
    mailMessage.Body = email.Body; 
    mailMessage.IsBodyHtml = email.IsHtml; 

    foreach (System.Net.Mail.Attachment attachment in email.Attachments) 
    { 
     mailMessage.Attachments.Add(attachment); 
    } 

    var mimeMessage = MimeKit.MimeMessage.CreateFromMailMessage(mailMessage); 

    var gmailMessage = new Google.Apis.Gmail.v1.Data.Message { 
     Raw = Encode(mimeMessage.ToString()) 
    }; 

    Google.Apis.Gmail.v1.UsersResource.MessagesResource.SendRequest request = service.Users.Messages.Send(gmailMessage, ServiceEmail); 

    request.Execute(); 
} 

public static string Encode(string text) 
{ 
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text); 

    return System.Convert.ToBase64String(bytes) 
     .Replace('+', '-') 
     .Replace('/', '_') 
     .Replace("=", ""); 
} 

Nota: Se hai trovato un problema e-mail di rimbalzo, è probabile a causa di non impostando il campo ReplyToList. Vedi: GMail API Emails Bouncing

Problemi correlati