Проблема
Хочу отправлять письмо из приложения под 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];
}
Исходный код приложения-примера можно скачать тут
Пишите письма!:)