Email service with default email composer
Send email from Xamarin Forms requires different implementation for iOS and Android. The default behaviour of using the default email service from each platform will populate a composer, which is visiable to the end user with the option to see, send, cancel, etc.
Concepts: iOS
Compoment: MFMailComposeViewController
Present MFMailComposeViewController
In order to use the above iOS component as a dependency service, it is required to have a statement to present the view controller explicitly in your code. In this case, we use:
UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(mailer,
true
,
null
)
Dismiss MFMailComposeViewController
When finished sending the email, it is required to dismiss the view controller manually. The DismissViewController has to be inside the MainThread of iOS.
mailer.Finished += (s,e)=>{
UIApplication.ShareApplication.InvokeMainThread(()=>{
((MFMailComposeViewController)s).DismissViewController(
true
,()=>{});
});
}
Set Mime Type for an attachment
It is important to provide the right "Mime Type" to the attachment you plan to add to your email.
Concepts: Android
Intent: Intent.ActionSend (Not "Intent.ActionSendTo" , using this will cause some error when sending email to exchange or google)
Intent type: "message/rfc822" (follow the receipe from Xamarin website: http://developer.xamarin.com/recipes/android/networking/email/send_an_email/)
Present Composer
Setting the Intent’s mime type to message/rfc822 causes the mail application to launch. If multiple applications are capable of handling mail, the user will get a list to choose from.
Note: user can choose, sending out a message via gmail, exchange, skype, hangout. whatsapp, etc.
File object:
With the given file path of the attachment, you still need the Java object to form the file object. But, use Android.Net.Uri.FromFile to form the uri to the file.
var file =
new
Java.IO.File(attachmentPath);
Use intent.PutExtra(Intent.ExtraStream, Android.Net.Uri.FromFile(file)
Start Android Activity:
It is important to start the Android activity via the right context.
In Xamarin Forms, we use:
Forms.Context.StartActivity(intent)
//Not: this.Context.StartActivity(intent)
It is important to set "setReadable()" after obtaining a file object in Android.
Without this line, you would't get the attachment even though you can see the attachment appear in the email composer.
file.SetReadable(true, false)
Usage:
//Example in Xamarin.Forms
var mailService = DependencyService.Get<IEmailService>();
if
(mailService.CanSend){
mailService.ShowDraft(
"Subject"
,
"Body"
,
false
,
"receipient email address"
,
"path to the attachment"
);
}
else
{
//Please activate or setup your email account from your device settings.
}
Alternative approach:
MAILTO
string
strMailTo =
@"mailto:jeff.wei-lim@artesiansolutions.com?Subject=test&Body=testBody"
;
Device.OpenUri(
new
Uri(strMailTo));
Note for using MailTo:
- user can choose, sending out a message via email client only (such as email app or gmail...)
- Unable to send an email with attachment.