IOS使用mailcore2发送邮件,qq邮箱发送_airmail unable to authenticate with the current se-程序员宅基地

技术标签: IOS笔记  qq邮箱  邮件  ios  

1.首先获取mailcore2的代码

git clone https://github.com/MailCore/mailcore2/

2.将下载的代码拷贝到项目文件目录下,打开自己的工程将下载的mailcore2工程文件mailcore2.xcodeproj直接拉到自己的工程下面
下载中的目录为build-mac/mailcore2.xcodeproj

3.将静态库添加到工程中
(1)在 Link Binary With Libraries 中添加:

libMailCore-ios.a  

(2)在 Target Dependencies 中添加:

static maincore2 ios 

(3)在 Link Binary With Libraries 中添加系统包:

CFNetwork.framework  
Security.framework  

4.设置编译链接选项
(1)在other linker flag 中添加:

-lctemplate-ios -letpan-ios -lxml2 -lsasl2 -liconv -ltidy -lz -lc++ -stdlib=libc++ -ObjC -lresolv  

(2)在C++ Standard Library选择:

libc++

5.选择target编译静态包

mailcore ios
static mailcore2 ios

6.添加环境变量
选择product->scheme->edit scheme->Run->Arguments->Environment Variables添加OS_ACTIVITY_MODE值威disable
二。我们使用SMTP来发送邮件
1.首先编辑发送参数,调用登陆校验方法

- (void)mailCorelogin
{
    _smtpSession = [[MCOSMTPSession alloc] init];
    _smtpSession.hostname = @"smtp.qq.com";//qq邮箱地址
    _smtpSession.port = 587;//qq邮箱端口号
    _smtpSession.username = @"[email protected]";
    _smtpSession.password = @"xxxxxxxx";//qq邮箱开启SMTP服务之后的**授权码**不是邮箱原始的密码
    _smtpSession.connectionType = MCOConnectionTypeStartTLS;//https


    MCOSMTPOperation *smtpOperation = [self.smtpSession loginOperation];
    [smtpOperation start:^(NSError * error) {
        if (error == nil) {
            NSLog(@"login successed");
        } else {
            NSLog(@"login failure: %@", error);
        }  
    }];
}

二,设置发送具体信息

-(void)buildMessage
{
    // 构建邮件体的发送内容
    MCOMessageBuilder *messageBuilder = [[MCOMessageBuilder alloc] init];
    messageBuilder.header.from = [MCOAddress addressWithDisplayName:@"张三" mailbox:@"[email protected]"];   // 发送人
    messageBuilder.header.to = @[[MCOAddress addressWithMailbox:@"[email protected]"]];       // 收件人(多人)
//    messageBuilder.header.cc = @[[MCOAddress addressWithMailbox:@"@333333qq.com"]];      // 抄送(多人)
//    messageBuilder.header.bcc = @[[MCOAddress addressWithMailbox:@"[email protected]"]];    // 密送(多人)
    messageBuilder.header.subject = @"测试邮件";    // 邮件标题
    messageBuilder.textBody = @"hello world";           // 邮件正文

    /*
     如果邮件是回复或者转发,原邮件中往往有附件以及正文中有其他图片资源,
     如果有需要你可将原文原封不动的也带过去,这里发送的正文就可以如下配置
     */
    NSString * bodyHtml = @"<p>我是原邮件正文</p>";
    NSString *body = @"我是邮件回复的内容";
    NSMutableString*fullBodyHtml = [NSMutableString stringWithFormat:@"%@<br/>-------------原始邮件-------------<br/>%@",[body stringByReplacingOccurrencesOfString:@"\n"withString:@"<br/>"],bodyHtml];
    [messageBuilder setHTMLBody:fullBodyHtml];
    [self sendMessage:messageBuilder];
}
-(void)sendMessage:(MCOMessageBuilder *)messageBuilder
{
    NSData * rfc822Data =[messageBuilder data];
    MCOSMTPSendOperation *sendOperation = [self.smtpSession sendOperationWithData:rfc822Data];
    [sendOperation start:^(NSError *error) {
        if (error == nil) {
            NSLog(@"send successed");
        } else {
            NSLog(@"send failure: %@", error);
        }  
    }];
}

三。一些问题
1.Error Domain=MCOErrorDomain Code=5 “Unable to authenticate with the current session’s credentials.” UserInfo={NSLocalizedDescription=Unable to authenticate with the current session’s credentials.}
这个错误主要是邮箱帐号或者密码错误。邮箱后缀是否正确(qq邮箱填的密码就是发送短信之后显示的授权码,而不是直接填原始密码)
2.Error Domain=MCOErrorDomain Code=1 “A stable connection to the server could not be established.” UserInfo={NSLocalizedDescription=A stable connection to the server could not be established.}
这个错误可以从以下三个方面尝试解决:
1.hostname不存在,或者拼写错误,修改hostname;该hostname不一定是 imap.**.com,我项目中用到的hostname是 10.101.10.1(主机名)。
2.需要SSL安全链接,将connectionType设置为MCOConnectionTypeTLS;
3.端口号错误。

参考文献:
1,http://blog.csdn.net/qq510304723/article/details/50150303
2.https://www.jianshu.com/p/558b3bd9f88d

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ios_lujian/article/details/78875046

智能推荐

快速玩转 Llama2!机器学习 PAI 最佳实践(二)—全参数微调训练_llama 全参数训练-程序员宅基地

文章浏览阅读1.1k次。本实践将采用阿里云机器学习平台PAI-DSW模块针对 Llama-2-7B-Chat 进行全参数微调。PAI-DSW是交互式建模平台,该实践适合需要定制化微调模型,并追求模型调优效果的开发者。_llama 全参数训练

安捷伦Agilent/惠普HP 4349B高值电阻表_安捷伦4349b-程序员宅基地

文章浏览阅读33次。安捷伦Agilent 4349B高值电阻表的用途:适用于测量各种电器设备、元件测试、电感器、线圈、生产线的电阻,4349B增加测试吞吐率,同时对4通道绝电阻进行测量。Agilent 4349B增加测试吞吐率,同时对4通道绝电阻进行测量。测量时间:9.5 mS / 28 mS / 98 mS / 397 mS。90-132/198-264 伏交流电;快速接触检查:2毫秒/点。输入/输出电阻:1 kohm。测试电缆长度:最长 2 m。GPIB和处理器接口。显示分辨率:3/4/5位。HP-IB 和处理器接口。_安捷伦4349b

【Dubbo】Dubbo入门_hessian 2.0 serialization protocol-程序员宅基地

文章浏览阅读342次。一、Dubbo是什么 分布式服务框架 高性能和透明化的RPC远程服务调用方案 SOA服务治理方案 二、如何使用Dubbo本地服务 &lt;bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /&gt; &lt;bean id=“xxxAction” class=“com.xxx.XxxAction”&..._hessian 2.0 serialization protocol

LSTM 自动编码器进行时间序列数据异常检测_时间序列lstm识别充电桩异常-程序员宅基地

文章浏览阅读1.5k次,点赞31次,收藏16次。本文将介绍并代码演示使用LSTM对时间序列数据进行异常值检测。_时间序列lstm识别充电桩异常

编写一个简单Java程序,计算银行年存款的本息_编写一个java程序,计算存款的利息,用户将输入存款金额和年利率,然后程序计算一年-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏21次。编写一个简单Java程序,计算银行年存款的本息要求:程序运行后要求用户输入存款本金、年利率和存款年限,最后程序计算并输出相应年限后存款的金额。相应的计算公式为:存款总额=本金 * (1 + 利率)存款年限。提示:请检测用户输入的合法性。可以使用Math类来进行次方的运算:Math.pow(底数,指数)。代码块如下package interestCaculation;/** *@auth..._编写一个java程序,计算存款的利息,用户将输入存款金额和年利率,然后程序计算一年

ELK之 kibana 报错master_not_discovered_exception] null or kibana-Request Timeout after 30000ms_unable to connect to elasticsearch. error: request-程序员宅基地

文章浏览阅读6.4k次,点赞5次,收藏5次。ELK之 kibana 报错master_not_discovered_exception] null or kibana-Request Timeout after 30000ms{“type”:“log”,"@timestamp":“2020-05-18T13:34:53Z”,“tags”:[“warning”,“savedobjects-service”],“pid”:4674,“message”:“Unable to connect to Elasticsearch. Error: Reques_unable to connect to elasticsearch. error: request timeout after 30000ms

随便推点

优化Hadoop Balancer运行速度_failed to move blk_1076014847_2274553 with size=89-程序员宅基地

文章浏览阅读6.7k次。 1. 修改dfs.datanode.max.transfer.threads = 4096 (如果运行hbase的话建议为16384),指定用于在DataNode间传输block数据的最大线程数,老版本的对应参数为dfs.datanode.max.xcievers2. 修改dfs.datanode.balance.bandwidthPerSec = 52428800,指定DataNod..._failed to move blk_1076014847_2274553 with size=89971516 from 172.16.33.248:

关于jquery的弹窗组件简单封装_jq中将关于浏览器窗口的属性都封装到了-程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏5次。前言:由于自己工作时多数是基于移动端的页面工程,很多时候都需要用到弹窗组件,网上也有很多好用,五花八门的弹窗插件,但是由于网上各个版本有些功能过于强大,导致插件大小比较大,有些样式不好自己进行各种自定义设计,有些则是达不到自己想要的那种需求,比如实现弹窗按钮的各种回调函数,于是自己就根据公司目前项目的需求 ,自己简单封装了一个弹窗组件。可简单自定义各式各样的样式 思路分析:声明一个带有对象参数的_jq中将关于浏览器窗口的属性都封装到了

基于tiny4412的Linux内核移植 -- DM9621NP网卡驱动移植(四)-程序员宅基地

文章浏览阅读633次。作者信息作者: 彭东林邮箱:[email protected]:405728433平台简介开发板:tiny4412ADK + S700 + 4GB Flash要移植的内核版本:Linux-4.4.0 (支持device tree)u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动)busyb..._memcpy(net_dev->dev_addr, dev_info.mac_addr, eth_alen);

springboot启动不打印日志信息_SpringBoot启动遇到的记录日志冲突问题-程序员宅基地

文章浏览阅读2k次。默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台(如下图所示)。但是,有时候启动项目springboot默认打印日志与jar的打印日志会产生冲突(如下)SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/D:/mavencangku/o..._spring启动过程logback不打日志

python中表示空类型的是_python中表示空-程序员宅基地

文章浏览阅读1.7k次。广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!nonetype表示该值是一个空对象,空值是python里一个特殊的值,用none表示。 none不能理解为0,因为0是有意义的,而none是一个特殊的空值。 可以将none赋值给任何变量,也可以给none值变量赋值in: type()out: str知识点扩展:在python中,n..._python中表示空的是

Google Protocol Buffers 概述-程序员宅基地

文章浏览阅读513次。1. 概述Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。本文概述介绍Protocol Buffers,以及开始如何开始Protoco_google protocol buffers

推荐文章

热门文章

相关标签