>

乐百家前段:Node接收电子邮件的实例代码

- 编辑:乐百家599手机首页 -

乐百家前段:Node接收电子邮件的实例代码

行使qq邮箱发送一封饱含附属类小部件的邮件

后记

要是google邮箱假若翻开了二遍评释,那么你须求在google后台湾学生成一个专项使用密码来报到google邮箱拉取邮件。

透过贰个简短的例证实现了什么样行使node和imap协议来接收邮件,结合上篇node发送电子邮件小说的内容,叁个轻松的邮件客户端的主导收信发信作用就有了,不过想完成多个功效完善用户体验好的邮件客户端就必要不断研讨它,设计它,完善它,希望这篇文章能带给你启发,能够完结三个属于您本人的邮件客户端。

filename 附件名
content 内容
encoding 编码格式
path 文件路径
contentType 附属类小部件内容类型

什么是POP3、SMTP和IMAP协议

电子邮件职业原理

乐百家前段 1

POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个本子,它规定何以将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的率先个离线协议正式,POP3允许用户从服务器上把邮件存款和储蓄到地面主机(即自身的管理器)上,同期删除保存在邮件服务器上的邮件,而POP3服务器则是遵照POP3合计的收到邮件服务器,用来收纳电子邮件的。(与IMAP有怎么样差别?)
SMTP
SMTP 的完备是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目标地址传输邮件的业内,通过它来支配邮件的转化格局。SMTP 协议属于 TCP/IP 协议簇,它援助每台微型Computer在发送或转账信件时找到下一个目标地。SMTP 服务器就是依据 SMTP 协议的出殡邮件服务器。   SMTP 认证,轻松地说就是须要必须在提供了账户名和密码然后才方可登陆 SMTP 服务器,那就使得那三个垃圾邮件的撒播者无可乘之隙。   增添 SMTP 认证的目标是为着使用户幸免蒙受垃圾邮件的搅和。
IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3近似邮件访问规范协议之一。差异的是,开启了IMAP后,您在电子邮件客户端抽取的邮件依旧保留在服务器上,同期在客户端上的操作都会报告到服务器上,如:删除邮件,标志已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登入邮箱只怕客户端软件登入邮箱,看到的邮件以及气象都是一模一样的。(与POP3有哪些界别?)

搜狐163无需付费邮箱相关服务器消息:

乐百家前段 2

163免费邮客户端设置的POP3、SMTP、IMAP地址

今日头条信箱已经暗许开启POP3/SMTP/IMAP服务,方便你通过客户端更加好地收发邮件,假若关闭能够通过以下方法张开:

请登录163邮箱,点击页面正上方的“设置”,再点击左侧上“POP3/SMTP/IMAP”,当中“开启SMTP服务”是系统私下认可勾选开启的。您可勾选图中另三个挑选,点击分明,就可以张开成功。不勾选图中五个选项,点击明确,可关闭成功。** **

乐百家前段 3

什么是POP3、SMTP和IMAP?

翻开node-imap详细文书档案和api请点击这里

主干代码

var Imap = require('imap')
var MailParser = require("mailparser").MailParser
var fs = require("fs")

var imap = new Imap({
    user: 'yourname@gmail.com', //你的邮箱账号
    password: 'yourpassword', //你的邮箱密码
    host: 'imap.gmail.com', //邮箱服务器的主机地址
    port: 993, //邮箱服务器的端口地址
    tls: true, //使用安全传输协议
    tlsOptions: { rejectUnauthorized: false } //禁用对证书有效性的检查
});

function openInbox(cb) {
    imap.openBox('INBOX', true, cb);
}

imap.once('ready', function() {

    openInbox(function(err, box) {

        console.log("打开邮箱")

        if (err) throw err;

        imap.search(['UNSEEN', ['SINCE', 'May 20, 2017']], function(err, results) {//搜寻2017-05-20以后未读的邮件

            if (err) throw err;

            var f = imap.fetch(results, { bodies: '' });//抓取邮件(默认情况下邮件服务器的邮件是未读状态)

            f.on('message', function(msg, seqno) {

                var mailparser = new MailParser();

                msg.on('body', function(stream, info) {

                    stream.pipe(mailparser);//将为解析的数据流pipe到mailparser

                    //邮件头内容
                    mailparser.on("headers", function(headers) {
                        console.log("邮件头信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
                        console.log("邮件主题: "   headers.get('subject'));
                        console.log("发件人: "   headers.get('from').text);
                        console.log("收件人: "   headers.get('to').text);
                    });

                    //邮件内容

                    mailparser.on("data", function(data) {
                        if (data.type === 'text') {//邮件正文
                            console.log("邮件内容信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
                            console.log("邮件内容: "   data.html);
                        }
                        if (data.type === 'attachment') {//附件
                            console.log("邮件附件信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
                            console.log("附件名称:" data.filename);//打印附件的名称
                            data.content.pipe(fs.createWriteStream(data.filename));//保存附件到当前目录下
                            data.release();
                        }
                    });

                });
                msg.once('end', function() {
                    console.log(seqno   '完成');
                });
            });
            f.once('error', function(err) {
                console.log('抓取出现错误: '   err);
            });
            f.once('end', function() {
                console.log('所有邮件抓取完成!');
                imap.end();
            });
        });
    });
});

imap.once('error', function(err) {
    console.log(err);
});

imap.once('end', function() {
    console.log('关闭邮箱');
});

imap.connect();

暗许情状下抓取邮件后邮件服务器的邮件状态为未读,假使要在抓取后让邮箱服务器中的邮件状态成为已读,可以修改

var f = imap.fetch(results, { bodies: '' });

var f = imap.fetch(results, { bodies: '', markSeen: true }); 

1.账号未设置该服务

(二) - 各大主流邮箱服务器音讯和端口号

新浪163免费邮箱相关服务器音信:
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.163.com 993 143
SMTP smtp.163.com 465/994 25
POP3 pop.163.com 995 110
腾讯网163集团邮箱相关服务器音讯:(无需付费集团邮箱的smtp服务器名及端口号为:smtp.ym.163.com / 25)
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.qiye.163.com 993 143
SMTP smtp.qiye.163.com 994 25
POP3 pop.qiye.163.com 995 110

和讯126免费邮箱相关服务器音信:
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.126.com 993 143
SMTP smtp.126.com 465/994 25
POP3 pop.126.com 995 110

腾讯QQ无偿邮箱相关服务器音信:
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.qq.com 993 143
SMTP smtp.qq.com 465/587 25
POP3 pop.qq.com 995 110

腾讯QQ公司邮箱相关服务器音信:
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.exmail.qq.com 993 143
SMTP smtp.exmail.qq.com 465/587 25
POP3 pop.exmail.qq.com 995 110

谷歌(Google)Gmail邮箱相关服务器消息:
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.gmail.com 993 143
SMTP smtp.gmail.com 465 25
POP3 pop.gmail.com 995 110

Exchange邮箱相关服务器音讯:(待分明)
服务器名称 服务器地址 域 SSL
Exchange ex.xx.com xx.com

邮箱暗中认可配置:
服务器名称 服务器地址 SSL协议端口号 非SSL协议端口号
IMAP imap.xx.com 993 143
SMTP smtp.xx.com 465 25
POP3 pop.xx.com 995 110

透进程序接收邮件

上一篇小说写了怎么样通过node发送电子邮件,有发送就能够有接到嘛,所以那篇小说来讲说关于在node中怎么着接受电子邮件。

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
// 开启一个 SMTP 连接池
var transport = nodemailer.createTransport(smtpTransport({
 host: "smtp.qq.com", // 主机
 secure: true, // 使用 SSL
 secureConnection: true, // 使用 SSL
 port: 465, // SMTP 端口
 auth: {
  user: "gaolu19901228@qq.com", // 账号
  pass: "******" // 密码
 }
}));
// 设置邮件内容
var mailOptions = {
 from: "768065158<768065158@qq.com>", // 发件地址
 to: "528779822@qq.com", // 收件列表
 subject: "Hello world", // 标题
 text:"hello",
 html: "<b>thanks a for visiting!</b> 世界,你好!" // html 内容
}
// 发送邮件
transport.sendMail(mailOptions, function(error, response) {
 if (error) {
  console.error(error);
 } else {
  console.log(response);
 }
 transport.close(); // 如果没用,关闭连接池
});

(三) - MailCore2 详细使用

简介
MailCore是一个第三方的邮件SDK,支持POP和IMAP 情势收取邮件,以及smtp邮件发送。
安装
1、从github上拉替代码

[plain] view plain copy

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

2、增添到花色中
把build-mac/mailcore2.xcodeproj拖进工程
3、在档案的次序中加多静态库链接
当选工程--TATiguanGETS--Build Phases
在 Link Binary With Libraries 中添加:

[plain] view plain copy

libMailCore-ios.a
CFNetwork.framework
Security.framework

在 Target Dependencies 中选择:

[plain] view plain copy

static maincore2 ios

4、设置Flags
当选工程--TA安德拉GETS--Build Setting
在 Other Linker Flags 中设置

[objc] view plain copy

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

在 C Standard Library 中设置

[objc] view plain copy

libc

然后选择相应 Target 编写翻译。
SMTP(Simple Mail Transfer Protocol)
1、先创建MCOSMTPSession,配置smtp邮箱参数
[plain] view plain copy

MCOSMTPSession *smtpSession = [[MCOSMTPSession alloc] init];
smtpSession.hostname = @"smtp.exmail.qq.com";
smtpSession.port = 587;
smtpSession.username = @"hello@qq.com";
smtpSession.password = @"passward";
smtpSession.connectionType = MCOConnectionTypeStartTLS;

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

2、使用MCOMessageBuilder创设邮件体的发送内容
[objc] view plain copy

// 营造邮件体的殡葬内容
MCOMessageBuilder *messageBuilder = [[MCOMessageBuilder alloc] init];
messageBuilder.header.from = [MCOAddress addressWithDisplayName:@"张三" mailbox:@"111111@qq.com"]; // 发送人
messageBuilder.header.to = @[[MCOAddress addressWithMailbox:@"222222@qq.com"]]; // 收件人(多人)
messageBuilder.header.cc = @[[MCOAddress addressWithMailbox:@"@333333qq.com"]]; // 抄送(多人)
messageBuilder.header.bcc = @[[MCOAddress addressWithMailbox:@"444444@qq.com"]]; // 密送(多人)
messageBuilder.header.subject = @"测试邮件"; // 邮件标题
messageBuilder.textBody = @"hello world"; // 邮件正文

/*
假若邮件是过来或许转载,原邮件中屡屡有附属类小部件以及正文中有其余图片财富,
要是有须求你可将原来的小说原封不动的也带过去,这里发送的正文就足以如下配置
*/
NSString * bodyHtml = @"<p>小编是原邮件正文</p>";
NSString body = @"笔者是邮件回复的内容";
NSMutableString
fullBodyHtml = [NSMutableString stringWithFormat:@"%@
-------------原始邮件-------------
%@",[body stringByReplacingOccurrencesOfString:@"n"withString:@"
"],bodyHtml];
[messageBuilder setHTMLBody:fullBodyHtml];

// 加多正文里的叠合能源
NSArray inattachments = msgPaser.htmlInlineAttachments;
for (MCOAttachment
attachmentininattachments) {
[messageBuilder addRelatedAttachment:attachment]; //增加html正文里的附加能源(图片)
}

// 增加邮件附属类小部件
for (MCOAttachment*attachmentinattachments) {
[builder addAttachment:attachment]; //增多附属类小部件
}

3、将营造好的邮件发送出去
[objc] view plain copy

// 发送邮件
NSData * rfc822Data =[messageBuilder data];
MCOSMTPSendOperation *sendOperation = [self.smtpSession sendOperationWithData:rfc822Data];
[sendOperation start:^(NSError *error) {
if (error == nil) {
NSLog(@"send message successed");
} else {
NSLog(@"send message failure: %@", error);
}
}];

IMAP(Internet Mail Access Protocol)
1、先创设MCOIMAPSession,配置imap邮箱参数
[plain] view plain copy

MCOIMAPSession *imapSession = [[MCOIMAPSession alloc] init];
imapSession.hostname = hostname;
imapSession.port = port;
imapSession.username = username;
imapSession.password = passward;
imapSession.connectionType = MCOConnectionTypeTLS;

MCOIMAPOperation *imapOperation = [imapSession checkAccountOperation];
[imapOperation start:^(NSError * __nullable error) {
if (error == nil) {
NSLog(@"login account successedn");

    // 在这里获取邮件,获取文件夹信息  
    [self loadIMAPFolder];  
} else {  
    NSLog(@"login account failure: %@n", error);  
}  

}];

2、获取文件夹目录
[plain] view plain copy

MCOIMAPFetchFoldersOperation *imapFetchFolderOp = [imapSession fetchAllFoldersOperation];
[imapFetchFolderOp start:^(NSError * error, NSArray * folders) {
[_folderList addObjectsFromArray:folders];
[_folderTableView reloadData];
}];

3、获取收件箱邮件
[plain] view plain copy

MCOIMAPMessagesRequestKind requestKind = (MCOIMAPMessagesRequestKind)
(MCOIMAPMessagesRequestKindHeaders | MCOIMAPMessagesRequestKindStructure |
MCOIMAPMessagesRequestKindInternalDate | MCOIMAPMessagesRequestKindHeaderSubject |
MCOIMAPMessagesRequestKindFlags);

// 获取收件箱消息(包罗邮件总的数量等音讯)
NSString *folderName = @"INBOX";
MCOIMAPFolderInfoOperation * folderInfoOperation = [imapSession folderInfoOperation:folderName];
[folderInfoOperation start:^(NSError *error, MCOIMAPFolderInfo * info) {

NSLog(@"total number: %d", info.messageCount);  

NSInteger numberOfMessages = 10;  
numberOfMessages -= 1;  
MCOIndexSet *numbers = [MCOIndexSet indexSetWithRange:MCORangeMake([info messageCount] - numberOfMessages, numberOfMessages)];  

MCOIMAPFetchMessagesOperation *imapMessagesFetchOp = [imapSession fetchMessagesByNumberOperationWithFolder:folderName  
                                                                                                                                                              requestKind:requestKind  
                                                                                                                                                                    numbers:numbers];  

// 异步获取邮件  
[imapMessagesFetchOp start:^(NSError *error, NSArray *messages, MCOIndexSet *vanishedMessages) {  
    [_messageList addObjectsFromArray:messages];  
    [_messageTableView reloadData];  
}];  

}];

4、获取邮件头
[plain] view plain copy

// 拿出多少个邮件MCOIMAPMessage(里面富含邮件头等消息)
MCOIMAPMessage *message = _messageList [0];

// 使用MCOIMAPMessageRenderingOperation来获得邮件概要新闻
NSString *uidKey = [NSString stringWithFormat:@"%d", message.uid];

MCOIMAPMessageRenderingOperation *messageRenderingOperation = [imapSession plainTextBodyRenderingOperationWithMessage:message folder:@"INBOX"];
[messageRenderingOperation start:^(NSString * plainTextBodyString,NSError * error) {

// plainTextBodyString为邮件的正文文本信息  

}];

5、获取邮件内容,用MCOMessageParser分析邮件
[plain] view plain copy

MCOIMAPFetchContentOperation * fetchContentOp = [self.imapSession fetchMessageOperationWithFolder:@"INBOX" uid:[message uid]];
[fetchContentOp start:^(NSError * error, NSData * data) {
if ([error code] != MCOErrorNone) {
return;
}

// 解析邮件内容  
MCOMessageParser * msgPareser = [MCOMessageParser messageParserWithData:data];  
NSString *content = [msgPareser htmlRenderingWithDelegate:self];  

POP(Post Office Protocol)
1、先创设MCOIMAPSession,配置imap邮箱参数
[objc] view plain copy

MCOPOPSession *popSession = [[MCOPOPSession alloc] init];
popSession.hostname = @"smtp.exmail.qq.com";
popSession.port = 995;
popSession.username = @"hello@qq.com";
popSession.password = @"passward";
popSession.connectionType = MCOConnectionTypeTLS;

// 登入邮箱
MCOPOPOperation *popOperation = [popSession checkAccountOperation];
[popOperation start:^(NSError * __nullable error) {
if (error == nil) {
NSLog(@"login account successed");
} else {
NSLog(@"login account failure: %@", error);
}
}];

2、获取邮件音信(同IMAP)
3、关于MCOMessageParser

随意是pop依旧IMAP获取的邮件,最终都要获取MCOMessageParser来操作邮件内容。
[objc] view plain copy

// MCOMessageHeader包涵了邮件标题,时间等头新闻
MCOMessageHeader *header = msgPaser.header;

// 获得邮件正文的HTML内容,一般选择webView加载
NSString * bodyHtml = [msgPaser htmlBodyRendering];

// 获取附属类小部件(两个)
NSMutableArray *attachments = [[NSMutableArray alloc] initWithArray:_msgPaser.attachments];

// 得到二个附属类小部件MCOAttachment,可从中获得文件名,文件内容data
MCOAttachment *attachment = attachments[0];

将附属类小部件写入本地
[objc] view plain copy

// 获取文件路径
NSString *tmpDirectory = NSTemporaryDirectory();
NSString *filePath = [tmpDirectorystringByAppendingPathComponent : attachment.filename ];
[attachmentData writeToFile:filePathatomically:YES];

当邮件正文有图表,在webview中如何加载图片,可通过注入js的不二秘技修改html
概念脚本:
[objc] view plain copy

static NSString * mainJavascript = @"
var imageElements = function() {
var imageNodes = document.getElementsByTagName('img');
return [].slice.call(imageNodes);
};

var findCIDImageURL = function() {
var images = imageElements();

var imgLinks = [];
for (var i = 0; i < images.length; i ) {
var url = images[i].getAttribute('src');
if (url.indexOf('cid:') == 0 || url.indexOf('x-mailcore-image:') == 0)
imgLinks.push(url);
}
return JSON.stringify(imgLinks);
};

var replaceImageSrc = function(info) {
var images = imageElements();

for (var i = 0; i < images.length; i ) {
var url = images[i].getAttribute('src');
if (url.indexOf(info.URLKey) == 0) {
images[i].setAttribute('src', info.LocalPathKey);
break;
}
}
};
";

修改刚才获取的html内容
[objc] view plain copy

MCOMessageParser * msgPareser = [MCOMessageParser messageParserWithData:data];
NSString *content = [msgPareser htmlRenderingWithDelegate:self];

NSMutableString * html = [NSMutableString string];
[html appendFormat:@"<html><head><script>%@</script></head>"
@"<body>%@</body><iframe src='x-mailcore-msgviewloaded:' style='width: 0px; height: 0px; border: none;'>"
@"</iframe></html>", mainJavascript, content];
[_webView loadHTMLString:content baseURL:nil];

设置webView代理
[objc] view plain copy

smtp协议

imap协议

IMAP(Internet新闻访问协议)也是提供面向用户的邮件抽出服务。常用的版本是IMAP4。与POP3商谈类似允许电子邮件客户端下载服务器上的邮件,不相同的是,开启了IMAP后,您在电子邮件客户端收取的邮件依旧保留在服务器上,同期在客户端上的操作都会申报到服务器上,如:删除邮件,标识已读等,服务器上的邮件也会做相应的动作。换句话说,IMAP把远程文件夹当花费三步跳件夹来操作,它们中间就如于双向同步。那样的益处是,当您在多个邮件客户端看见的邮件的情景是一样的。这次接收邮件我们也应用此协议来落到实处。

使用Unicode编码
支撑Windows系统,无需设置依赖
支撑纯文本和HTML格式
支撑发送附属类小部件(包涵大型附属类小部件)
在HTML中放置图片
支撑SSL/STARTTLS安全协议
不等的传导方法,能够使用内置也得以应用外部插件的款型
提供自定义插件支持(举例增添DKIM具名,使用markdown取代HTML等等)
支撑XOAUTH2登入验证(以及有关创新的令牌反馈)

(一) - 邮箱收发协议

乐百家前段 4

参照他事他说加以考察文档

查看node-imap详细文书档案和api请点击这里
翻看Mailparser详细文书档案请点击这里

另一个,

pragma mark - webview

  • (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    NSURLRequest *responseRequest = [self webView:webView resource:nil willSendRequest:request redirectResponse:nil fromDataSource:nil];

    if(responseRequest == request) {
    return YES;
    } else {
    [webView loadRequest:responseRequest];
    return NO;
    }
    }

  • (NSURLRequest *)webView:(UIWebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(id)dataSource {

    if ([[[request URL] scheme] isEqualToString:@"x-mailcore-msgviewloaded"]) {
    [self _loadImages];
    }
    return request;
    }

// 加载网页中的图片

  • (void) _loadImages {
    NSString * result = [webView stringByEvaluatingJavaScriptFromString:@"findCIDImageURL()"];
    NSLog(@"-----加载网页中的图片-----");
    NSLog(@"%@", result);

    if (result == nil || [result isEqualToString:@""]) {
    return;
    }

    NSData * data = [result dataUsingEncoding:NSUTF8StringEncoding];
    NSError *error = nil;
    NSArray * imagesURLStrings = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

    for (NSString * urlString in imagesURLStrings) {
    MCOAbstractPart * part = nil;
    NSURL *url = [NSURL URLWithString:urlString];

      if ([MCOCIDURLProtocol isCID:url]) {  
          part = [self _partForCIDURL:url];  
      }  
      else if ([MCOCIDURLProtocol isXMailcoreImage:url]) {  
          NSString * specifier = [url resourceSpecifier];  
          NSString * partUniqueID = specifier;  
          part = [self _partForUniqueID:partUniqueID];  
      }  
    
      if (part == nil) {  
          continue;  
      }  
    
      NSString * partUniqueID = [part uniqueID];  
      MCOAttachment * attachment = (MCOAttachment *) [msgPaser partForUniqueID:partUniqueID];  
      NSData * data =[attachment data];  
    
      if (data!=nil) {  
    
          //获取文件路径  
          NSString *tmpDirectory =NSTemporaryDirectory();  
          NSString *filePath=[tmpDirectory stringByAppendingPathComponent : attachment.filename ];  
    
          NSFileManager *fileManger=[NSFileManager defaultManager];  
          if (![fileManger fileExistsAtPath:filePath]) {  
              //不存在就去请求加载  
              NSData *attachmentData=[attachment data];  
              [attachmentData writeToFile:filePath atomically:YES];  
              NSLog(@"资源:%@已经下载至%@", attachment.filename,filePath);  
          }  
    
          NSURL * cacheURL = [NSURL fileURLWithPath:filePath];  
          NSDictionary * args =@{@"URLKey": urlString,@"LocalPathKey": cacheURL.absoluteString};  
    
          NSString * jsonString = [self _jsonEscapedStringFromDictionary:args];  
          NSString * replaceScript = [NSString stringWithFormat:@"replaceImageSrc(%@)", jsonString];  
          [webView stringByEvaluatingJavaScriptFromString:replaceScript];  
      }  
    

    }
    }

  • (NSString *)_jsonEscapedStringFromDictionary:(NSDictionary *)dictionary {

    NSData * json = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil];
    NSString * jsonString = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];
    return jsonString;
    }

  • (NSURL *) _cacheJPEGImageData:(NSData *)imageData withFilename:(NSString *)filename {

    NSString * path = [[NSTemporaryDirectory()stringByAppendingPathComponent:filename]stringByAppendingPathExtension:@"jpg"];
    [imageData writeToFile:path atomically:YES];
    return [NSURL fileURLWithPath:path];
    }

  • (MCOAbstractPart *) _partForCIDURL:(NSURL *)url {
    return [_message partForContentID:[url resourceSpecifier]];
    }

  • (MCOAbstractPart *) _partForUniqueID:(NSString *)partUniqueID {
    return [_message partForUniqueID:partUniqueID]乐百家前段,;
    }

 imap接收邮件测试进程

设置node第三方包

npm install --save imap mailparser

邮件接收服务器自身采纳Gmail,发送邮件的服务器使用qq邮箱。

焚林而猎方案:

就算google邮箱假诺张开了三回注明,那么你需求在google后台生成贰个专项使用密码来报到google邮箱拉取邮件。

接到邮件测试进程

接受邮件实际上做的是三个邮件客户端的东西,对于底层的落到实处在npm上有三个写好的第三的库node-imap(node.js的imap客户端模块)这么些模块援助大家封装了数不尽的最底层操作,可是这几个模块再次回到的数量像附属类小部件、音信、邮件头等都以未解码的原本数据,所以还索要对数码举行解码,解码的模块在npm上也找到了一个写好的库Mailparser它是一个node高档电子邮件深入分析器,能够深入分析就算比比较大的多寡(100MB ),而且付出相对异常低。

使用imap接收邮件的进度可以用上边一张图表示

乐百家前段 5

Paste_Image.png

本次测试的大概进度如下

  • 在pc上登录qq邮箱
  • 透过qq邮箱发邮件到gamil(区别邮件服务器之间发邮件进度相比复杂,进程略)
  • 在pc上通过写好的依据imap的主次去拉取gmail的邮件,同有时常候本地的改换(标志邮件,删除邮件)会一同到gmail服务器
{ [SenderError: Mail from command failed - 501 mail from address must be same as authorization user]
name: 'SenderError',
data: '501 mail from address must be same as authorization user',
stage: 'mail' }
var f = imap.fetch(results, { bodies: '', markSeen: true });

pop3协议

POP3商量允许电子邮件客户端下载服务器上的邮件,可是在客户端的操作(如运动邮件、删除邮件、标志已读等),不会上报到服务器上,例如通过客户端收取了邮箱中的3封邮件并活动到别的文件夹,邮箱服务器上的那一个邮件是未曾同期被活动的。也正是说POP3共谋实际上是下载了一份邮件的副本到本地邮件客户端,而且对该地邮件别本的操作只会影响本地数据。八个邮件客户端里面包车型大巴邮件的气象大概会差异等。

from 发送者邮箱
sender 发送者区域呈现的消息
to 接收者邮箱
cc 抄送者邮箱
bcc 密送者邮箱
subject 邮箱大旨
attachments 附属类小部件内容
watchHtml apple watch指定的html版本
text 文本新闻
html html内容
headers 另加头音信
encoding 编码格式

乐百家前段 6

通进度序接收邮件

乐百家前段 7

Paste_Image.png

2.发件账号与认证账号区别

简单邮件传输协议:是一种基于文本的电子邮件传输协议,用于从源地址到目标地址传输邮件的正规化,通过它来决定邮件的转折情势,是因特网中用来在邮件服务器之间调换邮件的协商。SMTP是二个“推”的协商,它不容许依照供给从远程服务器上“拉”来新闻。要大功告成那点,邮件客户端必须选用POP3或IMAP。所以发送邮件的时候我们须求轻便的驾驭下边包车型客车那二种协议。

邮件协议

在始发那篇小说此前我们先是精通八个体协会议smtp(Simple Mail Transfer Protocol)轻松邮件传输协议,pop3(Post Office Protocol 3)邮局协议第三版本,imap(Internet Mail Access Protocol)internet音讯访问协议。

qq邮箱在测试smtp邮件服务器时,一,在qq邮箱,设置,账户设置中.开启下smtp.二,设置一下单独密码.三,在配备smtp服务器的密码时,注意早晚要填你设置的独立密码.不要用邮箱登入密码.不然会唤醒535 Authentication failed错误.

本文由乐百家前段发布,转载请注明来源:乐百家前段:Node接收电子邮件的实例代码