what visual the techniques studio strategy standard portable net library different code are c# xamarin.forms portable-class-library

c# - visual - Envío de correo electrónico desde Gmail en la aplicación Xamarin.Forms



xamarin forms portable visual studio 2017 (2)

Hola, he logrado esto usando el siguiente código, también he adjuntado un archivo al correo electrónico, utilizando el servicio de dependencia que uso este método:

Androide:

public static string ICSPath { get { var path = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, StaticData.CalendarFolderName); if (!Directory.Exists(path)) Directory.CreateDirectory(path); return Path.Combine(path, StaticData.CalendarFileName); } } public async Task<bool> ShareCalendarEvent(List<ISegment> segmentList) { Intent choserIntent = new Intent(Intent.ActionSend); //Create the calendar file to attach to the email var str = await GlobalMethods.CreateCalendarStringFile(segmentList); if (File.Exists(ICSPath)) { File.Delete(ICSPath); } File.WriteAllText(ICSPath, str); Java.IO.File filelocation = new Java.IO.File(ICSPath); var path = Android.Net.Uri.FromFile(filelocation); // set the type to ''email'' choserIntent.SetType("vnd.android.cursor.dir/email"); //String to[] = { "[email protected]" }; //emailIntent.putExtra(Intent.EXTRA_EMAIL, to); // the attachment choserIntent.PutExtra(Intent.ExtraStream, path); // the mail subject choserIntent.PutExtra(Intent.ExtraSubject, "Calendar event"); Forms.Context.StartActivity(Intent.CreateChooser(choserIntent, "Send Email")); return true; }

iOS:

public static string ICSPath { get { var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), StaticData.CalendarFolderName); if (!Directory.Exists(path)) Directory.CreateDirectory(path); return Path.Combine(path, StaticData.CalendarFileName); } } public async Task<bool> ShareCalendarEvent(List<ISegment> segmentList) { //Create the calendar file to attach to the email var str = await GlobalMethods.CreateCalendarStringFile(segmentList); if (File.Exists(ICSPath)) { File.Delete(ICSPath); } File.WriteAllText(ICSPath, str); MFMailComposeViewController mail; if (MFMailComposeViewController.CanSendMail) { mail = new MFMailComposeViewController(); mail.SetSubject("Calendar Event"); //mail.SetMessageBody("this is a test", false); NSData t_dat = NSData.FromFile(ICSPath); string t_fname = Path.GetFileName(ICSPath); mail.AddAttachmentData(t_dat, @"text/v-calendar", t_fname); mail.Finished += (object s, MFComposeResultEventArgs args) => { //Handle action once the email has been sent. args.Controller.DismissViewController(true, null); }; Device.BeginInvokeOnMainThread(() => { UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(mail, true, null); }); } else { //Handle not being able to send email await App.BasePageReference.DisplayAlert("Mail not supported", StaticData.ServiceUnavailble, StaticData.OK); } return true; }

Espero que esto ayude.

Estoy tratando de enviar correos electrónicos desde una aplicación Xamarin Forms, usando Gmail.

Creé una interfaz con solo 1 método: SendEmail ();

Luego, en el proyecto Droid, agregué una clase que implementa dicha interfaz. Usando el atributo Dependency y obteniendo la implementación del método en el proyecto principal, todo está bien, excepto el siguiente error:

Could not resolve host ''smtp.gmail.com''

Esta es la implementación real del método:

string subject = "subject here "; string body= "body here "; try { var mail = new MailMessage(); var smtpServer = new SmtpClient("smtp.gmail.com", 587); mail.From = new MailAddress("[email protected]"); mail.To.Add("[email protected]"); mail.Subject = subject; mail.Body = body; smtpServer.Credentials = new NetworkCredential("username", "pass"); smtpServer.UseDefaultCredentials = false; smtpServer.EnableSsl = true; smtpServer.Send(mail); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); }

Buscando alrededor no pude encontrar ningún otro detalle con respecto a la dirección SMTP real.

Además, he utilizado el procedimiento de aplicaciones menos seguras de Google, no recibiendo un error de credenciales, supongo que se puede conectar a la cuenta muy bien.


¡Pensé que era el dueño finalmente!

En primer lugar, estaba usando Android Player de Xamarin, que aparentemente no es compatible con la conectividad de red.

Así que mi solución fue sencilla: usé un emulador de Android (cualquier versión de él para el caso) creado en Visual Studio Community 2015, y probé la conectividad de red utilizando el complemento de James Montemagno (Xam.Plugin.Connectivity en NuGet).