Как стать автором
Обновить

Пишем письма из iOS приложения

Время на прочтение5 мин
Количество просмотров5.5K
Проблема

Хочу отправлять письмо из приложения под iOS без выхода из приложения (не использовать mailto URL) и без открытия дополнительного экрана (не использовать MFMailComposeViewController).

Решения

Дорогое: поднять на своем сервере web-сервис, который будет заниматься рассылкой писем, из приложения обращаться к нему.
Дешевое: использовать SMTP клиент внутри своего приложения.

Проблема

Нужно написать свой SMTP клиент


Решение

Простой в использовании SMTP клиент для iOS — SKPSMTPmessage

Давайте посмотрим как отправлять сообщения с его помощью — cоздадим простое приложение с полем для ввода текста письма и кнопкой «Отправить».

Идем в Xcode, создаем новый проект View-based application для iPhone. Назовем его EmailSender (иходный код)



Делаем checkout исходников SKPSMTPmessage
svn checkout skpsmtpmessage.googlecode.com/svn/trunk skpsmtpmessage-read-only
И копируем оттуда в наш проект следующие файлы (можно просто перетащит из Finder файлы в дерево проекта в Xcode):
Base64Transcoder.h
Base64Transcoder.m
HSK_CFUtilities.h
HSK_CFUtilities.m
NSData+Base64Additions.h
NSData+Base64Additions.m
NSStream+SKPSMTPExtensions.h
NSStream+SKPSMTPExtensions.m
SKPSMTPMessage.h
SKPSMTPMessage.m





Еще нам понадобится подключить к проекту CFNetwork.framework





Нам понадобится поле для текста сообщения и кнопка для отправки письма.
Подредактируем наш EmailSenderViewController.h файл
#import <UIKit/UIKit.h>
 
@interface EmailSenderViewController : UIViewController {
 
    IBOutlet UITextView *txtMessage;
}
 
-(IBAction)sendEmail;
 
@end

Добавим в EmailSenderViewController.xib TextView (проассоциируем с txtMessage) и Button (на нажатие повесим sendEmail)


Реализуем функцию отправки письма в EmailSenderViewController.m
-(IBAction)sendEmail
{
    SKPSMTPMessage *testMsg = [[SKPSMTPMessage alloc] init];
 
    testMsg.fromEmail = @"your.sender@gmail.com"// адрес, от кого отправляем письмо
    testMsg.toEmail = @"your.receiver@gmail.com"//адрес, куда отправляем письмо
    testMsg.relayHost = @"smtp.gmail.com"//smtp сервер, который вы используете
    testMsg.requiresAuth = YES//требуется ли аутентификация
    testMsg.login = @"your.login@gmail.com"//login на smtp сервев
    testMsg.pass = @"yourpassword"//пароль для smtp сервера
    testMsg.subject = @"Mail from habr"//тема письма
    testMsg.bccEmail = @"";
    testMsg.wantsSecure = YES// smtp.gmail.com doesn't work without TLS!
 
 
 
    NSDictionary *plainPart = [NSDictionary dictionaryWithObjectsAndKeys:@"text/plain",
                                                                         kSKPSMTPPartContentTypeKey,
                                                                         txtMessage.text,
                                                                         kSKPSMTPPartMessageKey,
                                                                         @"8bit",
                                                                         kSKPSMTPPartContentTransferEncodingKey,
                                                                         nil];
 
    testMsg.parts = [NSArray arrayWithObjects:plainPart,nil];
 
 
    [testMsg send];
}
 


И не забываем добавить подключение SKPSMTPMessage.h
#import "EmailSenderViewController.h"
#import "SKPSMTPMessage.h"
 

Советую завести отдельный ящик на gmail для вашего приложения и использовать его для отправки писем (и your.sender = your.loging), как показано в примере. Но, конечно, можно использовать любой другой smtp сервер.

И напоследок покажу, как сделать немного симпатичнее наш TextView (закруглим углы).

Подключаем QuartzCore.h
#import "EmailSenderViewController.h"
#import "SKPSMTPMessage.h"
#import <QuartzCore/QuartzCore.h>

И во ViewDidLoad добавляем
- (void)viewDidLoad
{
    txtMessage.clipsToBounds = YES;
    txtMessage.layer.cornerRadius = 10.0f;
    [super viewDidLoad];
}


Исходный код приложения-примера можно скачать тут
Пишите письма!:)
Теги:
Хабы:
+15
Комментарии33

Публикации

Изменить настройки темы

Истории

Работа

Swift разработчик
32 вакансии
iOS разработчик
23 вакансии

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн