Отправка электронного письма с вложением в xamarin.forms для android и ios

Я создаю приложение для отправки электронного письма с вложением. Я пробовал использовать для этого mailTo, но он не работает. Есть ли другие способы отправить электронное письмо с вложением?

Это код, который я пробовал до сих пор

private void Button_Clicked_1(object sender, EventArgs e)
{
    string toEmail = "toemail@nyp.edu.sg";
    string emailSubject = "Test Email";
    string emailBody = "Email Body";
    string attachment = "C:/Users/L30901/Desktop/download.jpg";

    Device.OpenUri(new Uri(String.Format("mailto:{0}?subject={1}&body={2}&attachment=file:///{3}", toEmail, emailSubject, emailBody, attachment)));
}

Это то, что я сделал для iOS

MainPage.xaml.cs

private void Button_Clicked_1(object sender, EventArgs e)
{
    DependencyService.Get<IDependency>().SendEmail();
}

IDependency.cs

public interface IDependency
{
    void SendEmail();
}

IOSEmail.cs

[assembly: Dependency(typeof(IOSEmail))]
namespace Notification.iOS
{
    public class IOSEmail : IDependency
    {
        MFMailComposeViewController mailController;

        public void SendEmail()
        {
            if (MFMailComposeViewController.CanSendMail)
            {
                mailController = new MFMailComposeViewController();

                mailController.SetToRecipients(new string[] { "some.person@somewhere.com" });
                mailController.SetSubject("Testing");
                mailController.SetMessageBody("See attached file", false);

                NSData data = NSData.FromFile(pdffilename);
                mailController.AddAttachmentData(data, "application/jpeg", "xxxxx.jpg");// For JPEG

                mailController.Finished += HandleMailFinished;

                UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(mailController, true, null);
            }
        }

        private void HandleMailFinished(object sender, MFComposeResultEventArgs e)
        {
            e.Controller.DismissViewController(true, null);
        }
но не работает: в чем ошибка? Добавьте это к своему вопросу, пожалуйста
Leviand 26.10.2018 09:35

Никакой ошибки не выходит. Visual Studio работает как обычно, но как только я нажимаю кнопку в приложении электронной почты, все будет заполнено, кроме вложения.

Irfaan Ahmed 26.10.2018 09:56

Добро пожаловать в Stack Overflow! Другие пользователи отметили ваш вопрос как низкое качество и необходимость улучшения. Я переформулировал / отформатировал ваш ввод, чтобы его было легче читать / понимать. Просмотрите мои изменения, чтобы убедиться, что они отражают ваши намерения. Но я думаю, что на ваш вопрос пока нет ответа. Ты должен ответить редактировать на ваш вопрос сейчас, чтобы добавить недостающие детали (см. минимальный воспроизводимый пример). Не стесняйтесь писать мне комментарий, если у вас есть дополнительные вопросы или отзывы для меня.

GhostCat 26.10.2018 10:04

И пожалуйста: используйте только соответствующий тег. Android, ios, что это?

GhostCat 26.10.2018 10:04

@GhostCat, если он использует Xamarin.Forms, то они оба.

Woj 26.10.2018 10:06

@Woj Вопрос скорее в том, на каком устройстве он тестирует? Потому что это указывает, как он может получить больше информации для отслеживания / регистрации, которая здесь очень важна.

GhostCat 26.10.2018 10:08

Я пробовал это в эмуляторе Android по умолчанию в Visual Studio. И это приложение является кроссплатформенным, поэтому я буду использовать его и в iOS.

Irfaan Ahmed 26.10.2018 10:18

Неправильный URL-адрес вложения. файл должен быть на эмуляторе (с соответствующими разрешениями на android)

Farabi Abdelwahed 26.10.2018 10:22

@FarabiAbdelwahed Итак, какой альтернативный способ мне нужен?

Irfaan Ahmed 26.10.2018 10:27

Я обновил ваш вопрос в соответствии с моим пониманием, пожалуйста, посмотрите, и если это то, что вы хотели сделать!

FreakyAli 26.10.2018 10:53

@ G.hakim Спасибо, и да, это то, что я хотел сделать.

Irfaan Ahmed 26.10.2018 10:56

@IrfaanAhmed Я добавил ответ для Android, посмотрите, пока я загружаю его бит для iOS

FreakyAli 26.10.2018 11:21
2
12
1 901
1

Ответы 1

Все, что вам нужно сделать, можно сделать только с помощью Xamarin.FormsDependencyService:

Для Android нужно сделать что-то вроде этого:

  1. Получите каталог вашего вложения с помощью Java.IO:

    Java.IO.File dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);  
    

    Примечание: Я использовал каталог загрузок, вы можете изменить его по своему усмотрению в любой момент времени.

  2. Как только вы закончите с выбором этого каталога в среде ОС Android, выберите файл примерно так:

    Java.IO.File file = new Java.IO.File(dir, "yourFile.pdf"); //This could be any other type of file aswell
    
  3. Получите URI этого файла Android примерно так:

     Android.Net.Uri path = Android.Net.Uri.FromFile(file); 
    
  4. Создайте намерение для отправки данных в ваше приложение электронной почты примерно так:

        var email = new Intent(Android.Content.Intent.ActionSend);
        email.PutExtra(Android.Content.Intent.ExtraEmail,
        new string[] { "some.person@somewhere.com" }); // to whom you want to send the email
        email.PutExtra(Android.Content.Intent.ExtraCc,
        new string[] { "some.person@somewhereelse.com" }); // to whom you want to Copy in the email (CC)
        email.PutExtra(Android.Content.Intent.ExtraSubject, "Awesome File");
        email.PutExtra(Android.Content.Intent.ExtraText,
        "See attached file");
        email.PutExtra(Intent.ExtraStream, path);
        email.SetType("message/rfc822");
        StartActivity(email);
    

Для IOS нужно сделать что-то вроде этого:

  1. Создайте экземпляр MFMailComposeViewController и добавьте к нему тему и тело сообщения;

    var mailer= new MFMailComposeViewController();
    mailer.SetSubject("xxxx");
    mailer.SetMessageBody("", true);
    mailer.Finished += HandleMailFinished; //This controllers finished event in case you need it 
    
  2. Теперь обязательно, чтобы у вас был файл в каталоге документов, чтобы он был доступен для приложения. Для получения дополнительной информации проверьте Работа с файловой системой

  3. Предполагая, что вы прочитали это и добавили файл в каталог документов вашего приложения, получите NSData для вашего вложения:

     NSData data = NSData.FromFile(pdfFileName);
     mailer.AddAttachmentData(data, "application/pdf", "xxxxx.pdf");// For PDF
     mail.AddAttachmentData(csvdata, "application/csv", "csv.txt"); // For CSV/TXT
    
  4. Получите текущий отображаемый Viewcontroller примерно так:

       public UIViewController GetCurrentUIController()
    {
        UIViewController viewController;
        var window = UIApplication.SharedApplication.KeyWindow;
        if (window == null)
        {
            return null;
        }
    
        if (window.RootViewController.PresentedViewController == null)
        {
            window = UIApplication.SharedApplication.Windows
                     .First(i => i.RootViewController != null &&
                                 i.RootViewController.GetType().FullName
                                 .Contains(typeof(Xamarin.Forms.Platform.iOS.Platform).FullName));
        }
    
        viewController = window.RootViewController;
    
        while (viewController.PresentedViewController != null)
        {
            viewController = viewController.PresentedViewController;
        }
    
        return viewController;
    }
    
  5. Затем представьте Viewcontroller примерно так:

    var _CurrentViewComtroller= GetCurrentUIController();
    _CurrentViewComtroller?.PresentViewController(mailer, true, null);
    
  6. Метод Handled Finish будет выглядеть примерно так:

     private void HandleMailFinished(object sender, MFComposeResultEventArgs args)
     {
         DismissViewController (true, null);
     }
    

Спасибо, что поделились, я попробую этот метод и вернусь к вам

Irfaan Ahmed 26.10.2018 11:28

Я также обновил iOS, взгляните и дайте мне знать, сработало ли это для вас

FreakyAli 26.10.2018 11:58

Я не могу сделать первый шаг, а показывает несколько ошибок, например «Не удалось найти тип или имя пространства имен» и «Android не содержит определения для ОС». Можете ли вы мне помочь с этим?

Irfaan Ahmed 29.10.2018 02:00

У меня это работает, поэтому я не понимаю, что именно вы здесь делаете!

FreakyAli 29.10.2018 07:12

Этот код нужно положить в общую папку или в папку android.

Irfaan Ahmed 29.10.2018 07:51

В папке Android, конечно, это вся причина, по которой я сказал вам изучить службы зависимостей.

FreakyAli 29.10.2018 08:09

Извините за то, что я все еще новичок в этом, я выясняю, и спасибо за быстрый ответ

Irfaan Ahmed 29.10.2018 08:13

Нет проблем, дайте мне знать, если вы все еще столкнулись с проблемой

FreakyAli 29.10.2018 08:50

Конечно, я постараюсь вернуться к тебе

Irfaan Ahmed 29.10.2018 08:55

Мне нужно поместить коды в основной метод или создать другой метод. И после этого как мне вызвать метод со страницы, которую я создал

Irfaan Ahmed 29.10.2018 09:53

Проверьте это, у него есть пример того, как правильно использовать службы зависимостей

FreakyAli 29.10.2018 10:01

Я получаю сообщение об ошибке в StartActivity (электронное письмо): «Имя StartActivity не существует в текущем контексте».

Irfaan Ahmed 30.10.2018 03:57

Используйте плагин текущая активность, чтобы получить контекст для Android

FreakyAli 30.10.2018 06:55

Нужно ли мне использовать службу зависимостей для iOS, а также мне нужно создать класс или контроллер представления для iOS, чтобы поместить в эти коды.

Irfaan Ahmed 05.11.2018 04:52

Да, вам также нужна служба зависимостей для ios, и вам нужно использовать класс, а не контроллер представления

FreakyAli 05.11.2018 06:09

Хорошо, я использовал службу зависимостей и класс, но когда я нажимаю кнопку, я ничего не получаю. Будет ли причиной проблемы использование того же интерфейса службы зависимостей

Irfaan Ahmed 05.11.2018 06:12

Это то, что у меня есть в моем xaml под методом нажатия кнопки DependencyService.Get <IDependency> () .SendEmail ();

Irfaan Ahmed 05.11.2018 06:14

Можете ли вы обновить свой код в вопросе, чтобы его было легче понять, Обновите все изменения, которые вы сделали до сих пор для iOS

FreakyAli 05.11.2018 06:57

Я обновил свой код в вопросе готов, пожалуйста, посмотрите

Irfaan Ahmed 05.11.2018 10:08

Так в чем именно проблема, я имею в виду, что у меня все в порядке?

FreakyAli 05.11.2018 11:05

Я также не уверен, что когда я нажимаю кнопку, ничего не выходит

Irfaan Ahmed 05.11.2018 11:06

Вы пытались отладить свой метод отправки почты и проверить, вызывается ли он?

FreakyAli 05.11.2018 11:07

Еще нет, но будет отладка

Irfaan Ahmed 05.11.2018 11:10

Сделайте это и проверьте, правильно ли он вызывается или нет

FreakyAli 05.11.2018 11:14

Хорошо, я проверю и вернусь к вам

Irfaan Ahmed 05.11.2018 14:26

Другие вопросы по теме