未找到

未发布 扫描识别工具Dynamic Web TWAIN使用教程:如何自定义扫描设置
by Harriet666 keys 分享 1512380145488
Dynamic Web TWAIN是一个专为Web应用程序设计的TWAIN扫描识别控件。你只需在TWAIN接口写几行代码,就可以用兼容TWAIN的扫描仪扫描文档或从数码相机/采集卡中获取图像。
 
本文为你介绍Dynamic Web TWAIN中如何自定义扫描设置,欢迎收藏。
 
Dynamic Web TWAIN最新版免费下载>>>
 
我们上一节介绍了三种使用Dynamic Web TWAIN的方法:属性、方法和事件。Dynamic Web TWAIN的所有内置属性、方法和事件的完整列表可在我们的在线API文档中找到,以供参考。本文将更详细地介绍Dynamic Web TWAIN的功能:在开始扫描之前,您可以设置如何扫描文档,并更改扫描仪内置用户界面中的所有设置。以虚拟扫描器为例:
image017
 
您可能希望以相同的方式扫描您的所有归档文档。使用Dynamic Web TWAIN,您可以在JavaScript代码中自定义所有这些设置。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DWObject.SelectSource();
/* You should customize the settings after opening a source */
DWObject.OpenSource(); 
/* Hide the User Interface of the scanner */               
DWObject.IfShowUI = false;    
/* Use the document feeder to scan in batches */     
DWObject.IfFeederEnabled = true; 
/* Scan in Simplex mode (only 1 side of the page) */    
DWObject.IfDuplexEnabled = false;   
/* Scan pages in GRAY */ 
DWObject.PixelType = EnumDWT_PixelType.TWPT_GRAY;
/* Scan pages in 200 DPI */
DWObject.Resolution = 200;  
/* Start scanning */           
DWObject.AcquireImage();

本次教程到此结束,希望能对Dynamic Web TWAIN的用户带来帮助,接下来还会有更多的相关教程,敬请期待!

未发布 UI工具包Xamarin.Forms更新至v2.3.5-pre3,与.NET Standard项目兼容
by Harriet666 keys 分享 1497863074339
Xamarin.Forms是一个跨平台、原生支持UI的工具包,允许开发者轻松创建用户界面。这些用户界面可以通过安卓、iOS和Windows Phone共享,使用目标平台的原生控件进行渲染,让每个平台上Xamarin.Forms应用的界面外观搭配得当。
 
【Xamarin.Forms试用版点击下载】

v2.3.5-pre3更新内容

  • Xamarin.Forms现在与.NET Standard项目兼容!并非所有创建功能都能正常工作。
  • 改进:Device.RuntimePlatform现在在WinRT和UWP上返回。
  • 改进:使用新的AutomationProperties可能会影响Android上的UI测试。AutomationId、Name以及HelpText将设置本地ContentDescription属性,Name和HelpText优先于AutomationId(Name和HelpText将被连接起来)。这意味着任何正在寻找AutomationId的测试将会失败,如果Name或HelpText也设置在该元素上。要解决此问题,请更改你的UI测试并在此方案中查找Name/HelpText的值。
  • 改进:调用WinRT/UWP中Picker上的Focus将打开下拉。
  • 弃用:Android IVisualElementRenderer.ViewGroup现在已经过时了,请改用View。

试用、下载、了解更多产品信息请点击"咨询在线客服"   
7
未发布 2017年移动开发中优秀的10大框架
by Harriet666 keys 分享 1488161905996
框架被视为复杂的软件开发环境。它们包括许多子组件,其主要工作是帮助您创建应用程序。框架提供了许多工具集、调试器、编译器、不同的代码库,应用程序编程接口和其他组件。它们都是为了让应用程序开发人员工作变得更加容易。框架是APP开发的基础,它们可以使整个开发过程变得更简单、更令人兴奋。没有框架,开发人员将从头开始编写他们想要开发的每个应用程序。这将涉及大量的编码来让应用程序可以在不同的平台上工作。这里将列举出最好的框架来让你的开发更简单和更容易。

点击查看十大框架具体信息>>>

未发布 微软的dotnet-new工具可以使创建JavaScript Web 程序变得更简单
by Harriet666 keys 分享 1488337232319

Microsoft发布了一组工具,使用他们的dotnet-new工具和使用Node.js的灵活方法可以快速生成基于JavaScript的Web 应用程序。

dotnet-new工具是.NET Core工具的一部分,用于使用简单的命令启动一个新项目。作为ASP.NET Core JavaScript Services的一部分,Web开发人员现在可以使用相同的命令来启动新的单页应用程序(SPA)。

点击查看完整内容>>>

未发布 【推荐】2017年你应该了解的11款新型编程工具
by Harriet666 keys 分享 1503912408799
对于开发人员来说,工具是至关重要的。工具可以使开发人员的日常工作更加轻松、高效,因为只要关注最重要的事情即可。想要寻找到更好的替代工具往往比坚持使用熟悉的、过时的工具要困难得多。在这篇文章中,我们将列出你可以在日常工作中使用的一些新的编程工具。对在线流媒体感兴趣的许多开发人员也已经开始在其开发环境中使用这些新工具,因为这些工具与其陈旧的设施相比具有明显的优势。
 
你可能会想,如果旧的工具可以完成工作,那么是否还有必要去寻找新的替代工具呢?可以肯定的说,技术始终在变革,它正在不断地塑造、改变我们的工作方式,所以,它有必要保持更新。此外,新开发工具可以通过自动化在某些方面为你的工作增添更多价值,从而更好地帮助你控制你的工作流程。所以,如果你现在确信并准备好考虑使用市场上一些新的编程工具,请继续阅读本文,以找出其中最好的、最适合你的工具。
 

1. LiveEdu


LiveEdu 是开发人员和工程师经常光顾的好地方。它是一个基于项目的学习平台,服务于游戏开发、设计、数据科学、编程、增强现实、人工智能以及虚拟现实等方面的技能提升。学习的关键在于项目的真实性,而且 LiveEdu平台还提供了蕴含许多不同主题的项目教程,可以适用于任何人,包括初学者。
 

2.Standup


Standup 对于监控团队开发进度而言是一款非常好的工具。它可以很好地集成所有你已经在用的流行工具(例如Trello、BitBucket、GitHub等)。那么接下来,它是如何工作的呢?首先,它会根据开发团队成员的提交历史完全自动地生成工作报告。这有助于团队成员之间轻松地实现信息共享,也让团队成员之间形成了积极的竞争关系。这一想法是由Mesh Studio提出的,当时他们正在完成一个客户的严格的汇报需求的合同工作。
 

3. Cell 

Cell 自称是“自驱动的网页应用开发框架”。“框架”这一关键词应该会立刻让你想到,它应该包含APIs、方法、或其他框架应该具备的功能。但是,Cell却提供了一种全新的方式来查看如何编写HTML 代码。它适用于3个简单的规则,而且不运行任何函数就能够自主构建DOM。此外,Cell还提供了一种类似写小说的方式(a novel approach)来开发网页应用。
 

4. Osquery

Osquery 是 Facebook 通过 Query 语言揭示操作系统的方法。虽然乍看起来并不是很有趣,但它其实具有很多实际的用途。例如,它可以用于获取通过USB连接的硬件设备的列表。
 
对于那些想要保护自己的应用程序免受安全漏洞影响,或是能够更好地监视其应用程序在不同系统上的性能的Web开发人员来说,其中一个相对比较有效的方法就是不使用底层函数或API交互的能力。

 

5. React Native Firebase

React Native Firebase 可以帮助开发人员更加轻松地使用 React Native 和Firebase。利用RN Firebase,你可以 在Android和iOS系统上使用 JavaScript bridge轻松访问本地 eFirebase SDK。
 

6. Warp

Warp 是一款非常简单的工具。它可以让任何人分享他们的终端。共享终端就像输入一个 warp open 命令一样简单。这可以帮助开发人员或主机供应商轻松地分享彼此的终端。这款工具的关键特征在其“安全性”和“易于传输”。让分享变得前所未有地容易!你很快就会忘记SSH 的必要性,并使用该功能与远程团队和新成员进行互动。
 

7. Draft

Draft 是一款新工具,可以帮助开发人员轻松地在 Kubernet上构建应用程序。截至目前为止,在把应用移动到版本库之前,对应用程序进行测试仍然是一项耗时且艰巨的工作。但是,利用 Draft,开发人员就可以针对“内部循环”并在Kubernetes开发沙箱中对应用程序进行测试。沙箱可以通过公共URL轻松获得,并可以使用本地编辑器进行修改。
 

8. Docsify 

Docsify 是一个文档站点生成器工具。但是,它与其他的静态HTML文件生成器却是完全不同的。利用Docsify,你可以使用 Markdown 文件生成你的站点。这样一来,你就可以修改Markdown中的代码,并及时看到更新。这种差异性使它与其他流行工具(例如GitBook等)相比也能占据明显的竞争优势。


9. Prismic IO 

Prismic IO 是一个无头CMS系统的后台应用。多亏了API,让它可以与任何站点和应用程序一起使用,并可以轻松地与现有系统进行集成。此外,CMS 还为营销人员提供了一些现代化的发布和创作工具。


10. Javalin

Javalin 为Kotlin和Java提供了简单的REST API。该REST API非常易于使用,且API也是非常流畅的。它不是一个框架,因此不应该被混淆。其目的主要是提供一个非常简单易用的轻量级 REST API库。
 
以下是用Kotlin实现的 “Hello World”API的示例:
import io.javalin.Javalin
funmain(args: Array) {
    val app = Javalin.create().port(7000)
    app.get("/") { ctx -> ctx.result("Hello World") }
}


11. Bootsnap

我们都知道,速度对于一些应用程序而言有多重要。Ruby的性能可谓是臭名昭著。然而,Bootsnap尝试通过缓存很多Ruby方法并提高其整体性能来加快其速度。Bootsnap可以以gem的形式轻松地插入你的应用程序中,它目前可用于 MacOS 和 Linux 系统。
未发布 Essential Studio for JavaScript发布2017 v4版本,添加Essential JS 2工具包
by Harriet666 keys 分享 1516351007437
Essential Studio for JavaScript是首款专门用于LOB应用开发的JavaScript框架。包含40多种独特的、全新设计的控件,包括网格、图表、计量器、编辑器、树形视图、菜单、OLAP网格等等。
 

ESSENTIAL JS 2:企业级JAVASCRIPT UI工具包

Essential JS 2是一个现代的JavaScript UI工具包,具有轻量级、响应式和模块化的特点。它是用TypeScript编写的,完全支持Angular和React框架的完整支持。目前有以下组件可供使用:
  • Grid
  • Chart
  • Drop-Down List
  • Tree View
  • Date Picker
  • Dialog
  • Numeric Text Box
  • Tab
  • Toolbar
  • Circular Gauge
  • Linear Gauge
  • Form Validator
  • Combo Box
  • Autocomplete
  • Multiselect Drop-Down
  • Calendar
  • Date Range Picker
  • Button
  • Radio Button
  • Check Box
  • Text Box
  • Time Picker
  • Masked Text Box
  • List View
  • Tooltip
  • Context Menu
  • Accordion
完整的包可以从npmGitHub中获得。
查看演示
2d0ee79c3c0b40b781b46b85c269d443ojpg
 

支持ANGULAR 5

用于Angular组件的基本JavaScript已经升级到无缝支持Angular 5。
 

组合框

新的控件
组合框组件允许用户输入一个值或从预定义选项列表中选择一个选项。单击此组件的箭头图标时,下拉列表将显示用户可以从中选择的值列表。
 
主要特征
  • 数据绑定:允许绑定和访问本地或服务器端数据源的项目列表。
  • 分组:支持将单个或特定类别下的逻辑相关项目进行分组。
  • 排序:支持按字母顺序(升序或降序)排序列表项。
  • 过滤:允许根据组件中输入的字符过滤列表项目。
  • 模板:允许自定义列表项目、选定的值、页眉、页脚、类别组页眉。
  • 可访问性:内置的可访问性支持有助于通过键盘、屏幕阅读器或其他辅助技术设备访问所有组件的功能。
 

媒体播放器

新的控件
JavaScript的媒体播放器提供了一个简单而强大的视频和音频播放器,内置控制选项。它支持HTML5标准音频和视频格式,如MP4、MP3、WebM和Ogg。
 
主要特征
  • 支持HTML5标准视频。
  • 支持YouTube视频。
  • 内置控制栏,用于桌面和移动设备的所有基本操作,包括播放/暂停、下一首、上一首、音量控制和全屏。
  • 时间轴滑块,便于导航。
  • 标题栏。
c9b384463e464f0b9e59dfe642f91166ojpg
 

CHART

轴标签
支持显示多行轴标签。

 
显示外部数据标签
现在可以在图表区域内显示部分可见的数据标签。
 

数据管理器

防伪
防伪令牌可用于帮助保护应用程序免受跨站请求伪造。它生成一个隐藏的表单字段(防伪造标记),在提交表单时进行验证。
 
额外的数据操作
提供了IN和NotIN过滤器操作用于在WHERE过滤器中指定多个值。
 

DIAGRAM

对齐
支持定制用户手柄的位置。

 
端口增强
现在可以拖动端口来重新定位端口。

 
对称布局
对称布局是用于以圆形和对称方式排列图的自动布局。

 
标签交互
已经为标签提供了交互支持。他们可以被选中、拖动、调整大小和旋转。
 

AUTOCOMPLETE

搜索索引多栏弹出
现在可以区分多列AUTOCOMPLETE控件中的显示格式和搜索字段,允许用户在列表中搜索任意数量的字段,而无需修改所选的文本格式。
 

条码

EAN
条形码控制器现在支持EAN-8和EAN-13条形码。
 

计算

27个新的Excel公式
支持以下Excel公式:
ASINH,ATANH,AVERAGEIF,AVERAGEIFS,BASE,BESSELI,BESSELJ,BESSELK,BESSELY,COUNTIF,MMULT,MOD,NORMSDIST,NORMDIST,ODD,POWER,PV,RADIANS,RAND,ROUND,ROUNDUP,ROUNDDOWN,SECH,SUMPRODUCT,TEXT, VLOOKUP和STDEV。
 

下拉列表

服务器过滤
在搜索框中输入文本时,此功能将过滤数据源。过滤是基于包含来自整个数据源的匹配项。
 
服务器过滤:远程数据
 
服务器过滤:本地数据
 

文件管理器

支持鼠标选择
支持在文件资源管理器控件中使用鼠标管理文件/文件夹。
 

KANBAN

外部拖放
KANBAN控件现在支持与其他控件之间的拖放操作。
 
没有数据源的KANBAN列
KANBAN列可以在不绑定数据源的情况下显示。
 

滑块

添加按钮
添加了一个可以隐藏的按钮,允许增加和减少滑块的值。
 

甘特图

 
资源分配视图
甘特图控件支持资源分配视图。使用该视图,用户可以解释在同一日期发生的任务以及项目中资源的过度分配。
2820158d42a74615b57182485b50c1eaojpg
 
排序
现在可以根据行顺序显示具有序列号的任务。
9735e84a7c5d43b5bb25c29d3b1b1f89ojpg
 
多行选择
现在可以选择多行并执行缩进和负缩进操作。
6a44aceda37444c7b23b6d97d3180658ojpg
 
列过滤
现在可以过滤甘特图控件中的特定字段或列。
 
展开/折叠记录
甘特图控制现在支持扩展和折叠特定的记录。
未发布 网络通讯组件包Red Carpet Subscriptions 2017 v2发布,升级整个代码库
by Harriet666 keys 分享 1501060223518
Red Carpet Subscriptions 2017 v2包括整个产品线的升级代码库,拥有迄今为止最佳的性能、质量和可用性。还包括许多安全更新,支持最新的开发工具,新组件等。我们已将所有组件升级到2016版本。

更新重点


整个产品线的升级

  • 每个产品都已升级到新的代码库,提供更强大的安全性、更好的性能和改进的API。
  • .NET版本支持Microsoft Visual Studio 2017。
  • Delphi和C ++ Builder版本支持Embarcadero RAD Studio 10.2 Tokyo。
  • 默认的签名算法已经更新到SHA-256。

IP*Works! Encrypt安全更新

  • 组件通过了Google的Wycheproof测试。
  • 新的Rijndael组件支持NIST标准。
  • OpenPGP默认签名算法更新为SHA-256。
  • 添加了对SHA-512/256和SHA-512/224的Hash支持。

Cloud Storage Integrator的更多选项

  • 支持Google Drive API v3。
  • 新的AzureBlob组件允许你使用Azure Blob存储。

改进X12和EDI积分器

  • 新的X12Translator组件可轻松将X12转换为XML,反之亦然。
  • 增强API、文档解析和JSON编程功能。

使用TCP与IP*Works! SNMP

  • 新组件(SNMPTCPMgr,SNMPTCPTrapMgr和SNMPTCPAgent)允许你使用SNMP。

IP*Works! SSH的新隧道功能

  • SSHReverseTunnel组件现在具有智能重新连接的功能。

新订阅优惠:选择版本的源代码

  • 为了帮助你在任何Linux系统上进行编译,无需依赖共享对象文件,Red Carpet Subscription包含访问macOS、iOS、C ++ for Linux、PHP和Node.js版本的混淆源代码。

细节


所有产品

  • 支持Micosoft Visual Studio 2017
  • 支持Embarcadero RAD Studio 10.2 Tokyo
  • 默认签名算法更新为SHA-256

IP*Works! Encrypt

  • 新的Rijndael组件。
  • OpenPGP默认签名算法更新为SHA-256。
  • 支持SHA-512/256和SHA-512/224。

IP*Works! SNMP

  • TCP的新组件 - SNMPTCPMgr、SNMPTCPTrapMgr、SNMPTCPAgent。
  • SysUpTime属性支持64位整数集。

X12 Integrator

  • 新的X12翻译器组件 - 轻松将X12转换为XML,反之亦然。
  • API更新为标准化输入/输出选项并提供更一致的体验。
  • 用于可视化和解析文档结构的附加功能。
  • 使用RSSBus JSON模式时可以使用改进的可读值。

IP*Works! SSH

  • SSHReverseTunnel智能重连。

EDI Integrator

  • AS2事件的日志记录。
  • AS2默认签名算法更新为SHA-256。
  • 增加OFTPClient AcceptFile事件。
  • AS4默认加密算法更新为AES128-GCM。
  • OFTP LocalFile添加到Transfer和EndTransfer事件。
  • 添加了RNIF SignatureAlgorithm属性。
  • GISB默认使用内部PGP提供程序。

EDIFACT Integrator

  • API更新为标准化输入/输出选项,并提供更一致的体验。
  • 用于可视化和解析文档结构的附加功能。
  • 使用RSSBus JSON模式时可以使用改进的可读值。

IP*Works! S/MIME

  • API更新为标准化输入/输出选项,并提供更一致的体验。

IP*Works! Auth

  • 添加OneTimePassword组件。
  • ClaimsAuth现在是SAML。
  • 用于用户和组信息的Active Directory方法。
未发布 扫描识别工具Dynamic Web TWAIN使用教程:如何自定义Web TWAIN对象
by Harriet666 keys 分享 1511773524429
Dynamic Web TWAIN是一个专为Web应用程序设计的TWAIN扫描识别控件。你只需在TWAIN接口写几行代码,就可以用兼容TWAIN的扫描仪扫描文档或从数码相机/采集卡中获取图像。
本文教你在Dynamic Web TWAIN中如何自定义Web TWAIN对象,欢迎收藏。
 
Dynamic Web TWAIN最新版免费下载>>>

命名Dynamic Web TWAIN对象

默认情况下,(第一个)Dynamic Web TWAIN对象会被命名为“ DWObject ”。您应该在使用任何其他Dynamic Web TWAIN属性或方法之前设置它。内置函数Dynamsoft_OnReady是一个有效方法。例如,在我们的Hello World示例中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<title data-filtered="filtered">Hello World</title>
<script type="text/javascript" src="Resources/dynamsoft.webtwain.initiate.js" data-filtered="filtered"> </script>
<script type="text/javascript" src="Resources/dynamsoft.webtwain.config.js" data-filtered="filtered"> </script>
 
 
<input type="button" value="Scan" onclick="AcquireImage();">
<div id="dwtcontrolContainer"> </div>
<script type="text/javascript" data-filtered="filtered">
        var DWObject;
        function Dynamsoft_OnReady(){
            DWObject = Dynamsoft.WebTwainEnv.GetWebTwain('dwtcontrolContainer');
        }
        function AcquireImage(){
            if(DWObject) {
                DWObject.IfDisableSourceAfterAcquire = true;
                DWObject.SelectSource();
                DWObject.OpenSource();
                DWObject.AcquireImage();
            }
        }
    </script>
ID为“dwtcontrolContainer”的div是Dynamic Web TWAIN的占位符。它的名称和大小可以在在文件dynamsoft.webtwain.config.js 中定义,如下所示。您可以根据需要进行修改。
1
Dynamsoft.WebTwainEnv.Containers = [{ContainerId:'dwtcontrolContainer',Width:270,Height:350}];
 

更改查看器的大小

您可以简单地在dynamsoft.webtwain.config.js中更改内置查看器的大小。这里可以使用数字或百分比。例如
1
Dynamsoft.WebTwainEnv.Containers = [{ContainerId:'dwtcontrolContainer',Width: '50%',Height:350}];
 

更改安装提示的样式

如果未安装Dynamic Web TWAIN,则会看到提示用户安装SDK的内置界面。
image015
 
在大多数情况下,您可能需要修改“Dynamsoft标志”。“标志”是在文件\Resources\reference\hint.css中定义的:
1
2
3
4
5
6
.DYNLogo
    {
    background:url(logo.gif) left top no-repeat;
    width:159px;
    height:39px;
    }
图像 (\Resources\reference\logo.gif)是需要更改的文件。最简单的方法是用自己的标志替换它,但需要保持相同的名称和大小。image016
 
如果您想进一步更改此提示的样式,可以更改上面提到的css或更改文件\Resources\dynamsoft.webtwain.install.js中的代码:
1
2
3
4
5
6
7
8
9
10
11
12
function OnWebTwainNotFoundOnWindowsCallback(ProductName, InstallerUrl, bHTML5, bIE, bSafari, bSSL,
strIEVersion) { }
    /* This callback is triggered when Dynamic Web TWAIN is not installed on a PC running Windows */
    function OnWebTwainNotFoundOnMacCallback(ProductName, InstallerUrl, bHTML5, bIE, bSafari, bSSL,
strIEVersion) { }
    /* This callback is triggered when Dynamic Web TWAIN is not installed on a MAC */
    function OnWebTwainOldPluginNotAllowedCallback(ProductName) { }
    /* This callback is triggered when Dynamic Web TWAIN is disabled by a non-IE browser */
    function OnWebTwainNeedUpgradeCallback(ProductName, InstallerUrl, bHTML5, bMac, bIE, bSafari, bSSL,
strIEVersion) { }
    /* This callback is triggered when Dynamic Web TWAIN installed on the machine is older than the //one on
the server and upgrade is needed */

本次教程到此结束,希望能对Dynamic Web TWAIN的用户带来帮助,接下来还会有更多的相关教程,敬请期待!

未发布 微软:Visual Studio 2017是迄今为止最高效的版本
by Harriet666 keys 分享 1489998441630
Visual Studio 2017 全面上市。欢迎大家即刻下载体验全新的 Visual Studio 2017!我们还为整个 Visual Studio 产品系列进行了更新,让 Visual Studio 订阅用户和 Visual Studio Dev Essentials 的会员收获更多价值。

Visual Studio 2017:迄今为止最高效的版本

我们针对 Visual Studio 2017 的多个关键领域进行了重点研发——包括改进基础部件、提供五星级的云和移动开发体验,以及提升 DevOps 功能,以确保 Visual Studio 2017 可以助力每一位开发者在各种平台上开发各类应用。

在发展 Visual Studio 2017 这一全新版本时,我们将云和移动开发置于最重要的位置。为了简化云开发流程,内置的各项工具将为您提供有关.NET Core、Azure 应用、微服务、容器等应用开发的完整集成功能,甚至现在可以更轻松地由 IDE 直接开发和部署 Azure 应用和服务。Visual Studio 2017 with Xamarin 让你能够通过先进的调试和分析工具更加快速地为安卓、iOS 和 Windows 平台开发移动应用。

我们也重视聆听用户心声,并清楚地了解到用户希望 Visual Studio 变得更为快速、更精简,即使所面对的应用开发和项目愈加庞大。因此,我们将为用户提供全新的安装体验,让一切变得轻便而模块化。为提高 Visual Studio 的性能,我们还增强了多项功能。Visual Studio 2017 还将交付多项全新特性,帮助开发团队能够轻松地实践现代化的 DevOps 做法,更为快速而持续地应对市场变化。为了帮助开发者更好地把自己的数据库嵌入 DevOps,加速发布周期,Redgate Data Tools 工具现已加入 Visual Studio Enterprise 2017 服务当中。

未发布 MailBee.NET Objects退回邮件教程(二):POP3部分
by Harriet666 keys 分享 1503567760428
MailBee.NET Objects是一款为创建、发送、接收以及处理电子邮件而设计的健壮、功能丰富的.NET控件。几行代码便可为应用程序添加E-Mail支持,
简单高效。具备“必需”以及独特的功能,这些控件帮助开发人员简单快速地将复杂的电子邮件功能添加到他们的应用程序中。

MailBee.NET Objects介绍和试用点击查看>>>
 
 
本文主要介绍了SMTP服务器退回邮件的代码示例。目前MailBee.NET Objects在线订购享75折优惠正在进行中,欢迎您下载试用版进行运用!
 
在上期的SMTP部分中,我们将退回的电子邮件发送到指定的单个电子邮件地址。
 
每封退回的电子邮件都包含失败的电子邮件地址(以及其他信息)。这个失败的地址是我们想知道的。这个任务看起来很简单 - 你需要做的是扫描退回的
邮件以确定地址的典型字段。但是有一个隐藏的危险:每个邮件服务器都有自己的邮件退回格式。虽然它们几乎具有相同的“From”和“主题”字段,但是退回地址可以在邮件的任何位置。MailEnable服务器的典型退回邮件如下所示:
From: POSTMASTER@domain.com
To: jdoe@domain.com
Subject: Message Delivery Failure

MailEnable: Message Delivery Failure.

The following recipient(s) could not be reached: 

Recipient: [SMTP: bill@domain.com] Reason: The message could not be delivered because the domain name (domain.com) does not appear 

to be registered.

函数GetInvalidEmailAddressME()检查邮件是否被退回,并从退回的邮件中提取失败的地址。由于退回邮件格式不同,此功能仅对MailEnable服务器有效。例如,如果你正在使用Communigate Pro服务器,则退回消息如下所示:
From: MAILER-DAEMON@domain.local
To: jdoe@localhost Subject:
Undeliverable mail:

Failed to deliver to ''
 
正如你所看到的,这个退回的邮件与前一个几乎相同。使用哪个服务器并不重要,退回信息总是有From,To和Subject字段,退回信息在其正文中有失败的地址。函数GetInvalidEmailAddressCP()与前一个函数几乎相同; 区别仅在于检查邮件字段并搜索失败的地址。支持尽可能多的退回电子邮件格式至关重要。这就是为什么你需要修改GetInvalidEmailAddress()函数,以适应服务器使用的退回电子邮件格式。
 
注意:在某些情况下,你可能需要扫描退回的电子邮件以获取其他信息。如果由于暂时的问题,退回的邮件到达,则不要删除电子邮件地址:邮箱超过配
额,邮件服务器关闭等。退回邮件可以分为两种类型:硬邮件和软邮件。如果是不存在的帐户或域,则会发生硬性退回。其他故障,如完整的邮箱或暂时
不可用的域,则是软性退回。你可以为数据库中的每个地址进行计算。也许下一次尝试发送邮件到具有一些软性退回的地址时将成功。
 
代码示例:
在此示例中,我们从指定的帐户中检索退回的电子邮件,然后从每个退回的电子邮件中提取失败的电子邮件地址。失败的地址传递给RemoveEmailFromDatabase子程序,该子程序必须从数据库中删除失败的地址。应用程序还会从服务器中删除退回的电子邮件,以避免下次处理。
C#:
// Create POP3 object
Pop3 pop = new Pop3();

// Enable logging to file
pop.Log.Enabled = true;
pop.Log.Filename = @"C:\log.txt";
pop.Log.Clear();

// Connect to POP3 server
pop.Connect("mail.domain.com");
pop.Login("bounce", "secret");

// Download headers and bodies of all messages.
MailMessageCollection msgs = pop.DownloadMessageHeaders(1, -1, -1);
                        
// Loop through all messages in the mailbox
foreach (MailMessage msg in msgs)
{
        string strLine = msg.BodyPlainText;
        Console.WriteLine("From: " + msg.From.Email);
                                
        // Get failed email address
        string str_invalid_email =  GetInvalidEmailAddressME(msg);

        // If str_invalid_email is non-empty then failed email 
        // address was found
        if (str_invalid_email.Length > 0)
        {
                // Remove failed email from database
                RemoveEmailFromDatabase(str_invalid_email);

                // Display invalid adress
                Console.WriteLine("Invalid email: " + str_invalid_email);                

                // Delete bounced email from server to avoid
                // processing it next time
                pop.DeleteMessage(msg.IndexOnServer);
        }
}

// Disconnect from POP3 server
pop.Disconnect();

// The function checks whether the message is bounced and extracts 
// failed address 
// from bounced message. Valid only for MailEnable servers
static string  GetInvalidEmailAddressME(MailMessage msg)
{
        string str_invalid_email = msg.BodyPlainText;

        // Check if this is a bounced message report
        if (msg.Subject.IndexOf("Delivery Failure") == -1)
{ 
                return "";
        }
        if (msg.From.ToString().IndexOf("POSTMASTER") == -1)
        {
                return "";
        }

        // Now we're sure this is a bounced message report
        int i_start;
        i_start = str_invalid_email.IndexOf("SMTP:");

        // Check if bounced message report contains "Recipient:" field
        if (i_start == -1)
        {
                return "";
        }
                        
        // Get failed address
        i_start += 5;
        i_end = str_invalid_email.IndexOf("]",i_start);
        str_invalid_email.Substring(i_start, i_end);
                        
        return str_invalid_email;
}

// The function checks whether the message is bounced and extracts 
// failed address 
// from bounced message. Valid only for Communigate Pro servers
static string  GetInvalidEmailAddressCP(MailMessage msg)
{
string str_invalid_email = msg.BodyPlainText;

        // Check if this is a bounced message report
        if (msg.Subject.IndexOf("Undeliverable mail") == -1) 
        {
                return "";
        }
        if (msg.From.ToString().IndexOf("MAILER-DAEMON") == -1) 
        {
                return "";
        }

        // Now we're sure this is a bounced message report
        int i_start;
        i_start = str_invalid_email.IndexOf("to '<");

        // Check if bounced message report contains 
        // "Failed to deliver to " field
        if (i_start == -1)
        { 
                return "";
        }
                        
        // Get failed address
        i_start += 5;
        i_end = str_invalid_email.IndexOf("]",i_start);
        str_invalid_email.Substring(i_start, i_end);
                        
        return str_invalid_email;
}

// This function must remove (or disable) specified
// email address from mailing list
static void RemoveEmailFromDatabase(string str_invalid_email)
{
// TODO: Add your code here                        
}
 
VB.NET:
Dim pop As New Pop3

' Enable logging to file
pop.Log.Enabled = True
pop.Log.Filename = "C:\log.txt"
pop.Log.Clear()

' Connect to POP3 server
pop.Connect("mail.domain.com")
pop.Login("jdoe", "secret")

' Download headers and bodies for all messages.
Dim msgs As MailMessageCollection = pop.DownloadMessageHeaders(1, -1, -1)

' Loop through all messages in the mailbox
Dim msg As MailMessage
For Each msg In msgs
        Dim strLine As String = msg.BodyPlainText
        Console.WriteLine("From: " + msg.From.Email)

        ' Get failed email address
        Dim str_invalid_email As String = GetInvalidEmailAddressME(msg)

        ' If str_invalid_email is non-empty then failed email 
        ' address was found
        If str_invalid_email.Length > 0 Then
                'Remove failed email from database
                RemoveEmailFromDatabase(str_invalid_email)

                ' Display invalid address
                Console.WriteLine("Invalid email: " & str_invalid_email)

                ' Delete bounced email from server to avoid
                ' processing it next time
                pop.DeleteMessage(msg.IndexOnServer)
        End If
Next
Console.ReadLine()

' Disconnect from POP3 server
pop.Disconnect()

' The function checks whether the message is bounced and extracts 
' failed address 
' from bounced message. Valid only for MailEnable servers
Function GetInvalidEmailAddressME(ByVal msg As MailMessage) As String
        Dim str_invalid_email As String = msg.BodyPlainText

        ' Check if this is a bounced message report
        If msg.Subject.IndexOf("Delivery Failure") = -1 Then
                Return ""
        End If
        If msg.From.ToString().IndexOf("POSTMASTER") = -1 Then
                Return ""
        End If

        ' Now we're sure this is a bounced message report
        Dim i_start As Integer, i_end As Integer
        i_start = str_invalid_email.IndexOf("SMTP:")

        ' Check if bounced message report contains "Recipient:" field
        If i_start = -1 Then
                Return ""
        End If

        ' Get failed address
        i_start += 5
        i_end = str_invalid_email.IndexOf("]", i_start)
        str_invalid_email.Substring(i_start, i_end)

        Return str_invalid_email
End Function

' The function checks whether the message is bounced and extracts 
' failed address 
' from bounced message. Valid only for Communigate Pro servers
Function GetInvalidEmailAddressCP(ByVal msg As MailMessage) As String
        Dim str_invalid_email As String = msg.BodyPlainText

        ' Check if this is a bounced message report
        If msg.Subject.IndexOf("Undeliverable mail") = -1 Then
                Return ""
        End If
        If msg.From.ToString().IndexOf("MAILER-DAEMON") = -1 Then
                Return ""
        End If

        ' Now we're sure this is a bounced message report
        Dim i_start As Integer, i_end As Integer
        i_start = str_invalid_email.IndexOf("to '<")

        ' Check if bounced message report contains 
        ' "Failed to deliver to " field
        If i_start = -1 Then
                Return ""
        End If

        ' Get failed address
        i_start += 5
        i_end = str_invalid_email.IndexOf("]", i_start)
        str_invalid_email.Substring(i_start, i_end)

        Return str_invalid_email
End Function

' This function must remove (or disable) specified
' email address from mailing list
Sub RemoveEmailFromDatabase(ByVal str_invalid_email As String)
        ' TODO: Add your code here                        
End Sub

 近期热门 - 点击最多
  1. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  2. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  3. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  4. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  5. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别
  6. React Native使用fetch发送http登陆验证请求失败:无法读取set-cookie并显示network request failed
  7. 克服Redux的缺点在React/Native中使用消息队列,pubsub-js更加简洁的组件间通信和状态传递方法
  8. Springboot+Gradle+Mysql+Jpa最简单实例教程
  9. SpringBoot+Spring6入门指南: 使用命令行快速搭建restful web api模板
  10. 如何通过 winax 的 ActiveXObject 或 Excel.Application 往 excel 中插入一张图片

  全端社区 - 最新回复
  1. 用Gitea搭建免费Git服务器自定义Actions配置CI/CD自动化部署和测试流水线
  2. FastAPI+SQLModel+PostgreSQL+React+Vite全栈项目文件结构说明环境搭建与初始化指南
  3. Node.js 打印vite react+go项目目录树
  4. valtio基于Proxy代理比redux\zustand更简洁的react状态管理库
  5. Windows与Mac通过git ssh和rsync实现文件共享互传
  6. Windows与Mac通过git ssh和scp实现文件共享互传
  7. React结合vite使用vue3,在纯typescript的react hooks中使用vue
  8. 使用PubSub-JS时ReactNative在后台运行一段时间唤醒后,组件无法scribe到publish的事件,typescript实现一个事件订阅发布组件
  9. React Native为http网络请求添加timeout超时异常处理: 用XMLHttpRequest替换fetch发送的区别
  10. ReactNative获取Android/iOS的MAC/IP地址: react-native-device-info模块的安装与使用

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA