Pull to refresh

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

Reading time5 min
Views5.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];
}


Исходный код приложения-примера можно скачать тут
Пишите письма!:)
Tags:
Hubs:
+15
Comments33

Articles