Thiết lập trình thu thập thư trên Gmail, hướng dẫn từng bước. Người thu thập thư (làm cho những việc đơn giản trở nên khó khăn)

Tất nhiên, mọi thứ phải song song. Đây là nơi thư viện yêu thích của tôi, TPL DataFlow, phát huy tác dụng.

Chúng tôi sẽ thu thập thư qua POP3. Tất cả những “thứ thời thượng” của IMAP đều không cần thiết trong nhiệm vụ này - bạn cần lấy mã nguồn của bức thư càng nhanh và dễ dàng càng tốt và xóa nó trên máy chủ. POP3 ở đây là đủ cho mắt. Chúng tôi sử dụng OpenPop.NET.

Như một tùy chọn, hãy thêm tính năng giám sát vào Zabbix. (Chúng tôi sẽ làm việc 24/7 và cung cấp tốc độ được ca ngợi - chúng tôi cần chú ý đến điều này).

Đi

Hãy tạo một ứng dụng bảng điều khiển thông thường. Mở bảng điều khiển NuGet và cài đặt tất cả các gói cần thiết:

Gói cài đặt Nlog Gói cài đặt OpenPop.NET Gói cài đặt TopShelf Gói cài đặt Microsoft.TPL.DataFlow
Chuyển đến thư mục dự án, tạo App.Debug.config và App.Release.config. Chúng tôi dỡ dự án khỏi studio, mở mã của nó (Sau đây gọi là TopCrawler.csproj). Thêm vào phần config:

Cấu hình

Ứng dụng.config Ứng dụng.config


Và dưới đây là mục tiêu của riêng bạn cho MSBuild:

Chuyển đổi mục tiêu

$(TargetFileName).config


Cá nhân tôi đã quen với việc thêm chuyển đổi cấu hình vào các môi trường riêng biệt theo cách chính xác này - cách cũ.
Để thuận tiện, tôi cung cấp cấu hình kiểu mạnh. Một lớp riêng biệt sẽ đọc cấu hình. (Bạn có thể thảo luận về các khía cạnh lý thuyết của giải pháp như vậy trong phần bình luận). Cấu hình, nhật ký, giám sát là lý do tuyệt vời để triển khai mẫu Singleton.

Chúng ta tạo một thư mục cùng tên trong project (phải có thứ tự). Bên trong chúng tôi tạo 3 lớp - Config, Logger, Zabbix. Trình ghi nhật ký của chúng tôi:

Tiều phu

lớp tĩnh Logger ( public static NLog.Logger Log ( get; Private set; ) public static NLog.Logger Archive ( get; Private set; ) static Logger() ( Log = LogManager.GetLogger("Global"); Archive = LogManager. GetLogger("Trình lưu trữ");


Giám sát bằng Zabbix xứng đáng có một bài riêng, vì vậy tôi sẽ chỉ để lại ở đây lớp triển khai tác nhân:

Zabbix

không gian tên TopCrawler.Singleton ( ///

/// Singleton: lớp người gửi zabbix /// lớp tĩnh Zabbix ( public static ZabbixSender Sender ( get; Private set; ) static Zabbix() ( Sender = new ZabbixSender(Config.ZabbixServer, Config.ZabbixPort); ) ) struct ZabbixItem ( public string Host; public string Key; public string Value ; ) lớp ZabbixSender ( struct nội bộ SendItem ( // ReSharper vô hiệu hóa InconsistentNaming - Zabbix là ​​máy chủ chuỗi công khai phân biệt chữ hoa chữ thường; khóa chuỗi công khai; giá trị chuỗi công khai; đồng hồ chuỗi công khai; // ReSharper khôi phục InconsistentNaming ) #pragma cảnh báo vô hiệu hóa 0649 cấu trúc nội bộ ZabbixResponse ( Phản hồi chuỗi công khai; Thông tin chuỗi công khai ) #pragma cảnh báo khôi phục 0649 #khu vực --- Hằng số --- chuỗi const công khai DefaultHeader = "ZBXD\x01"; chuỗi const công khai SendRequest = "dữ liệu người gửi"; --- Các trường --- riêng tư chỉ đọc DateTime _dtUnixMinTime = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); chuỗi chỉ đọc riêng tư _zabbixserver; riêng tư chỉ đọc int _zabbixport; #endzone #khu vực --- Trình xây dựng --- public ZabbixSender(string zabbixserver, int zabbixport) : this(zabbixserver, zabbixport, DefaultTimeout) ( ) public ZabbixSender(string zabbixserver, int zabbixport, int timeout) ( _zabbixserver = zabbixserver; _zabbixport = zabbixport; _timeout = timeout; ) #endkhu vực #khu vực --- Phương thức --- chuỗi công khai SendData(ZabbixItem itm) ( return SendData(danh sách mới) (1) ( itm )); ) chuỗi công khai SendData(Danh sách lstData) ( try ( var serializer = new JavaScriptSerializer(); var value ​​= Danh sách mới (lstData.Count); value.AddRange(lstData.Select(itm => new SendItem ( Host = itm.Host, key = itm.Key, value = itm.Value, clock = Math.Floor((DateTime.Now.ToUniversalTime() - _dtUnixMinTime). TotalSeconds).ToString(CultureInfo.InvariantCulture) ))); var json = serializer.Serialize(new ( request = SendRequest, data = value.ToArray() )); var header = Encoding.ASCII.GetBytes(DefaultHeader); var length = BitConverter.GetBytes((long)json.Length); var data = Encoding.ASCII.GetBytes(json); gói var = byte mới; Buffer.BlockCopy(tiêu đề, 0, gói, 0, header.Length); Buffer.BlockCopy(length, 0, packet, header.Length, length.Length); Buffer.BlockCopy(data, 0, packet, header.Length + length.Length, data.Length); sử dụng (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) ( socket.Connect(_zabbixserver, _zabbixport); socket.Send(packet); //Header var buffer = byte mới; ReceivData(socket) , buffer, 0, buffer.Length, _timeout); if (DefaultHeader != Encoding.ASCII.GetString(buffer, 0, buffer.Length)) ném Ngoại lệ mới ("Tiêu đề không hợp lệ"); , buffer.Length, _timeout); var dataLength = BitConverter.ToInt32(buffer, 0); if (dataLength == 0) ném Ngoại lệ mới ("Độ dài dữ liệu không hợp lệ" = byte mới ReceivData (socket, buffer, 0, bộ đệm.Độ dài, _timeout); (Encoding.ASCII.GetString(buffer, 0, buffer.Length)); return string.Format("Phản hồi: (0), Thông tin: (1)", reply.Response, reply.Info); ) ) bắt (Ngoại lệ e) ( return string.Format("Exception: (0)", e); ) ) riêng tĩnh void ReceivData(Socket pObjSocket, byte buffer, int offset, int size, int timeout) ( var startTickCount = Môi trường.TickCount; var đã nhận = 0; do ( if (Environment.TickCount > startTickCount + timeout) ném TimeoutException mới(); thử ( đã nhận += pObjSocket.Receive(buffer, offset + đã nhận, size - đã nhận, SocketFlags.None) ; ) bắt (SocketException ex) ( if (ex.SocketErrorCode == SocketError.WillBlock || ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) Thread.Sleep(30); else Throw; ) ) trong khi (đã nhận< size); } #endregion } }


Cấu hình... Đã đến lúc phải làm ít nhất điều gì đó thú vị. Đầu tiên, chúng tôi sẽ lưu trữ các hộp mà chúng tôi thăm dò trong configs. Thứ hai, cài đặt DataFlow. Tôi đề nghị thế này:

Cấu hình



Vì vậy, máy chủ và cổng nơi nó kết nối, người dùng và mật khẩu - mọi thứ đều rõ ràng ở đây. Tiếp theo là loại hộp. Giả sử dịch vụ được sử dụng bởi bộ phận tiếp thị (cũng như các bộ phận khác). Họ có các hộp thư nơi gửi phản hồi tự động cho các thư cũng như các báo cáo về thư rác FBL. Bản thân hộp thư đã phân loại thư, vì vậy trong những trường hợp như vậy, chúng tôi sẽ đặt ngay loại hộp thư. Cài đặt DataFlow sẽ trở nên rõ ràng hơn sau này khi chúng ta bắt đầu tạo đối tượng. Ở đây chúng ta sẽ có các phần riêng trong config. Có rất nhiều hướng dẫn về cách thực hiện việc này, vì vậy tôi sẽ chỉ cho bạn thấy kết quả:

Xác định loại

#khu vực --- Loại --- lớp tĩnh MailboxType ( public const string Bo = "bo"; public const string Crm = "crm"; public const string Fbl = "fbl"; public const string Bounce = "bounce"; ) lớp MailboxInfo ( chuỗi công khai Loại ( get; set; ) chuỗi công khai Tên máy chủ ( get; set; ) chuỗi công khai Người dùng ( get; set; ) chuỗi công khai Mật khẩu ( get; set; ) public int Port ( get; set; ) ) class DataBlockOptions ( public int Maxdop ( get; set; ) public int BoundedCapacity ( get; set; ) public DataBlockOptions() ( Maxdop = 1; BoundedCapacity = 1; ) ) #endzone


Tạo phần

///

/// Phần cấu hình tùy chỉnh /// lớp công khai CustomSettingsConfigSection: ConfigurationSection ( public CredentialsCollection CredentialItems ( get ( return base["CredentialsList"] as CredentialsCollection; ) ) public DataBlockOptionsCollection DataFlowOptionsItems ( get ( return base["DataFlowOptionsList"] as DataBlockOptionsCollection; ) ) )


///

/// Bộ sưu tập tùy chỉnh - danh sách thông tin xác thực /// lớp công khai Thông tin xác thựcCollection: ConfigurationElementCollection, IEnumerable ( ghi đè được bảo vệ ConfigurationElement CreateNewElement() ( return new CredentialsElement(); ) đối tượng ghi đè được bảo vệ GetElementKey(ConfigurationElement element) ( return ((CredentialsElement)element).Username; ) public CredentialsElement cái này ( get ( return BaseGet(index) as CredentialsElement; ) ) công khai IEnumerator mới < Count; i++) { yield return BaseGet(i) as CredentialsElement; } } } /// /// Mục thông tin xác thực tùy chỉnh /// public class CredentialsElement: ConfigurationElement ( chuỗi công khai Tên máy chủ ( get ( return base["hostname"] as string; ) ) public string Tên người dùng ( get ( return base["username"] as string; ) ) public string Mật khẩu ( get ( return base ["password"] as string; ) ) public string Loại ( get ( return base["type"] as string; ) ) public string Port ( get ( return base["port"] as string; ) ) ) /// /// Bộ sưu tập tùy chỉnh - Danh sách tùy chọn DataBlock /// lớp công khai DataBlockOptionsCollection: ConfigurationElementCollection, IEnumerable ( ghi đè được bảo vệ ConfigurationElement CreateNewElement() ( return new DataBlockOptionsElement(); ) đối tượng ghi đè được bảo vệ GetElementKey(ConfigurationElement element) ( return ((DataBlockOptionsElement)element).Name; ) public CredentialsElement cái này ( get ( return BaseGet(index) as CredentialsElement; ) ) công khai IEnumerator mới GetEnumerator() ( for (var i = 0; i< Count; i++) { yield return BaseGet(i) as DataBlockOptionsElement; } } } /// /// Mục tùy chọn DataBlock tùy chỉnh /// lớp công khai DataBlockOptionsElement: ConfigurationElement ( Tên chuỗi công khai ( get ( return base["name"] as string; ) ) public string Maxdop ( get ( return base["maxdop"] as string; ) ) public string BoundedCapacity ( get ( return base ["boundedcapacity"] dưới dạng chuỗi; ) ) )


Tôi sẽ không viết phần triển khai đầy đủ của cấu hình; người ta cho rằng trong quá trình phát triển, các tham số chúng ta cần sẽ được thêm vào đó.

Hãy đọc cài đặt tùy chỉnh của chúng tôi như thế này:

Đọc

Danh sách công khai Danh sách thông tin xác thực ( get; bộ riêng tư; ) Từ điển công khai DataFlowOptionsList ( get; Private set; ) ... static Config() ( try ( var customConfig = (CustomSettingsConfigSection)ConfigurationManager.GetSection("CustomSettings"); //Nhận hộp thư foreach (var item trong customConfig.CredentialItems) CredentialsList.Add( new MailboxInfo ( Tên máy chủ = item.Tên máy chủ, Cổng = Convert.ToInt32(item.Port), Người dùng = item.Username, Loại = item.Type, Mật khẩu = item.Password ) //Nhận cài đặt DataFlow foreach (var item in customConfig.DataFlowOptionsItems) DataFlowOptionsList.Add(item.Name, new DataBlockOptions ( Maxdop = Convert.ToInt32(item.Maxdop), BoundedCapacity = Convert.ToInt32(item.BoundedCapacity) ) ) bắt (Ngoại lệ cũ) ( Logger.Log. Fatal( "Lỗi khi đọc cấu hình: (0)", ex.Message);


Bằng cách nào đó, nó đã trở nên rất dài và chúng ta thậm chí còn chưa đi đến phần thú vị nhất.

Bây giờ chúng ta hãy bỏ qua việc khai thác TopShelf, bộ đếm hiệu suất và liên lạc với cơ sở dữ liệu và bắt tay vào công việc! Chúng tôi tạo lớp Crawler - cốt lõi. Đầu tiên chúng ta hãy đọc email:

bool dễ bay hơi riêng tư _stopPipeline; ... public void Start() ( do ( var getMailsTasks = _config.CredentialsList.Select(credentials => Task.Run(() => GetMails(credentials))).ToList(); foreach (var task trong getMailsTasks) .Wait(); Thread.Sleep(2000); while (!_stopPipeline); //Dừng đường dẫn - đợi hoàn thành tất cả các điểm cuối // Đường dẫn DataFlow sẽ dừng ở đây nếu (_stopPipeline) Logger.Log.Warn("Pipeline has đã bị người dùng dừng"); )
Đây là lúc mà sự lười biếng đã ảnh hưởng đến tôi và tôi quyết định không bận tâm - nếu có khoảng 20-30 hộp, bạn có thể chạy một nhiệm vụ cho mỗi hộp và không phải lo lắng về số lượng luồng. (Tôi cho phép bạn ném cà chua.)

Chúng ta hãy chuyển sang phần đọc chính nó:

Khoảng trống riêng tư GetMails(Thông tin MailboxInfo) ( thử ( sử dụng (var client = new Pop3Client()) (
Hãy tính toán ngay thời gian truy cập vào hộp thư - nó sẽ hữu ích cho việc chẩn đoán tải mạng và máy chủ.

//Nhận số liệu Zabbix var đồng hồ bấm giờ = đồng hồ bấm giờ mới(); đồng hồ bấm giờ.Start(); //Lấy số lượng thư client.Connect(info.Hostname, info.Port, false); client.Authenticate(info.User, info.Password); đồng hồ bấm giờ.Stop();
Đang gửi dữ liệu tới Zabbix. Thật đơn giản - chúng tôi chỉ ra tên máy chủ (vì nó được nhập trong Zabbix), khóa (một lần nữa, đúng như trong Zabbix) và giá trị chuỗi.

//Gửi nó tới Zabbix Zabbix.Sender.SendData(ZabixItem mới ( Host = Config.HostKey, Key = info.Type + Config.TimingKey, Value = stopwatch.ElapsedMilliseconds.ToString() )); Logger.Log.Debug("Gửi thời gian [(0)] tới Zabbix: được kết nối với "(1)" dưới dạng "(2)", thời gian (3)ms", info.Type, info.Hostname, info.User, đồng hồ bấm giờ.ElapsedMilliseconds); var count = client.GetMessageCount(); if (đếm == 0) trả về; Logger.Log.Debug("Chúng tôi"có (0) tin nhắn mới trong "(1)"", count, info.User); // Gửi tin nhắn đến khối sắp xếp cho (var i = 0; i< count; i++) { try { var mailInfo = new MessageInfo { IsSpam = false, Mail = client.GetMessage(i + 1), Type = MessageType.UNKNOWN, Subtype = null, Recipient = null, Mailbox = info }; Logger.Log.Debug("Download message from "{0}". Size: {1}b", info.User, mailInfo.Mail.RawMessage.Length);
Đường dẫn DataFlow sẽ được tạo khi lớp Trình thu thập thông tin được tạo. Chúng tôi tin rằng giai đoạn đầu tiên của chúng tôi là sắp xếp bức thư.

Trong khi (!_sortMailDataBlock.Post(mailInfo)) Thread.Sleep(500);
Bạn thấy nó đơn giản thế nào - chỉ có một băng tải. Tất cả các tác vụ đọc thư sẽ gửi từng thư một vào đó. Nếu khối bận, Post sẽ trả về false và chúng ta sẽ đợi cho đến khi nó rảnh. Cái hiện tại sau đó tiếp tục làm việc vào thời điểm này. Đây là những gì tôi gọi là sự song song không lo lắng.

Tin nhắn đã được gửi đến băng tải, bây giờ bạn có thể yên tâm lưu nó vào kho lưu trữ RAW (vâng, vâng! Chúng tôi lưu mọi thứ chúng tôi đọc vào kho lưu trữ tệp. Dịch vụ hỗ trợ sẽ cảm ơn chúng tôi sau).

Ví dụ: hãy thiết lập xoay vòng lưu trữ:

NLog.config



Sau đó, bạn có thể sử dụng logStash trên đó, nhưng đó lại là một câu chuyện khác...

// Lưu mọi thư để lưu trữ Logger.Log.Debug("Lưu trữ thư"); Logger.Archive.Info(Functions.MessageToString(mailInfo.Mail)); ) bắt (Ngoại lệ cũ) ( Logger.Log.Error("Lỗi phân tích cú pháp email: (0)", ex.Message); Functions.ErrorsCounters.Increment(); //Vẫn lưu trữ thư Logger.Log.Debug("Lưu trữ tin nhắn "); Logger.Archive.Info(Encoding.Default.GetString(client.GetMessageAsBytes(i + 1))); ) if (_config.DeleteMail) client.DeleteMessage(i + 1); nếu (_stopPipeline) bị hỏng; ) Logger.Log.Debug("Xong với "(0)"", info.User); ) ) bắt (Ngoại lệ cũ) ( Logger.Log.Error("Lỗi chung - loại: (0), tin nhắn: (1)", ex, ex.Message); Functions.ErrorsCounters.Increment(); ) )
Ở đây chúng tôi đã sử dụng bộ đếm lỗi tĩnh (theo loại hộp thư), trong đó ErrorsCounters là:

Từ điển tĩnh công khai ErrorCounters = từ điển mới ();
Và bản thân các bộ đếm có thể được thực hiện như thế này:

Bộ đếm.cs

lớp Bộ đếm ( riêng tư dài _counter; công khai Bộ đếm() ( _counter = 0; ) công khai void Increment() ( Interlocked.Increment(ref _counter); ) công khai dài Read() ( return _counter; ) công khai dài Làm mới() ( return Khóa liên động .Exchange(ref _counter, 0); ) public void Add(long value) ( ​​​Interlocked.Add(ref _counter, value); ) public void Set(long value) ( ​​​Interlocked.Exchange(ref _counter, value) ; ) )


Hãy chuyển sang tạo đường ống. Giả sử chúng ta có các hộp nơi phản hồi tự động đổ vào. Những bức thư như vậy cần được phân tích cú pháp (loại trả lời tự động là gì, từ ai, cho danh sách gửi thư nào, v.v.) và đưa kết quả vào bộ lưu trữ (DB). Giả sử có những ô chứa báo cáo FBL. Chúng tôi ngay lập tức đưa những bức thư như vậy vào cơ sở dữ liệu. Chúng tôi coi tất cả các chữ cái khác là “hữu ích” - chúng cần được kiểm tra thư rác và gửi đến hệ thống bên ngoài, chẳng hạn như CRM.

Như bạn đã hiểu, ví dụ này chủ yếu xem xét việc sử dụng trình thu thập cho các nhiệm vụ tiếp thị - thu thập số liệu thống kê về gửi thư, thông tin về thư rác.

Vì vậy, chúng tôi đã quyết định về quy trình làm việc. Chúng ta khai báo các khối cần thiết trong lớp Crawler:

Lớp MessageInfo ( public bool IsSpam ( get; set; ) public Message Mail ( get; set; ) public string Subtype ( get; set; ) public string Người nhận ( get; set; ) public MessageType ( get; set; ) public MailboxInfo Hộp thư ( get; set; ) ) lớp Trình thu thập thông tin ( //Pipeline Private TransformBlock _sortMailDataBlock; TransformBlock riêng tư _spamFilterDataBlock; TransformBlock riêng tư _checkBounceDataBlock; TransformBlock riêng tư _identifyDataBlock; Khối hành động riêng tư _addToCrmDataBlock; Khối hành động riêng tư _addToFblDataBlock; Khối hành động riêng tư _addToBounceDataBlock; ...
Chúng tôi tạo một phương thức khởi tạo và tạo các khối quy trình (để khởi tạo các khối, chúng tôi sử dụng các phần tuyệt vời của mình từ cấu hình):

Public void Init() ( //*** Tạo đường dẫn *** //Tạo TransformBlock để nhận loại tin nhắn var blockOptions = _config.GetDataBlockOptions("_sortMailDataBlock"); _sortMailDataBlock = new TransformBlock (mail => SortMail(mail), ExecutionDataflowBlockOptions mới ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Tạo TransformBlock để lọc khối thư rácOptions = _config.GetDataBlockOptions("_spamFilterDataBlock"); _spamFilterDataBlock = TransformBlock mới (mail => FilterSpam(mail), ExecutionDataflowBlockOptions mới ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Tạo TransformBlock để sắp xếp các lần trả lại blockOptions = _config.GetDataBlockOptions("_checkBounceDataBlock"); _checkBounceDataBlock = TransformBlock mới (mail => BounceTypeCheck(mail), ExecutionDataflowBlockOptions mới ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Tạo TransformBlock để xác định chủ sở hữu bị trả lại blockOptions = _config.GetDataBlockOptions("_identifyDataBlock"); _identifyDataBlock = TransformBlock mới (mail => GetRecipient(mail), ExecutionDataflowBlockOptions mới ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Tạo ActionBlock để gửi thư đến CRM blockOptions = _config.GetDataBlockOptions("_addToCrmDataBlock"); _addToCrmDataBlock = ActionBlock mới (mail => AddToCrm(mail), ExecutionDataflowBlockOptions mới ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Tạo ActionBlock để gửi FBL tới MailWH blockOptions = _config.GetDataBlockOptions("_addToFblDataBlock"); _addToFblDataBlock = ActionBlock mới (mail => AddToFbl(mail), ExecutionDataflowBlockOptions mới ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity )); //Tạo ActionBlock để gửi Bounce tới MailWH blockOptions = _config.GetDataBlockOptions("_addToBounceDataBlock"); _addToBounceDataBlock = ActionBlock mới (mail => AddToBounce(mail), ExecutionDataflowBlockOptions mới ( MaxDegreeOfParallelism = blockOptions.Maxdop, BoundedCapacity = blockOptions.BoundedCapacity ));
Chúng tôi lắp ráp băng tải theo sơ đồ của chúng tôi:

//*** Xây dựng đường dẫn *** _sortMailDataBlock.LinkTo(_spamFilterDataBlock, info => info.Type == MessageType.GENERAL); _sortMailDataBlock.LinkTo(_addToFblDataBlock, info => info.Type == MessageType.FBL); _sortMailDataBlock.LinkTo(_checkBounceDataBlock, info => info.Type == MessageType.BOUNCE); _sortMailDataBlock.LinkTo(DataflowBlock.NullTarget (), info => info.Type == MessageType.UNKNOWN); /*STUB*/ _checkBounceDataBlock.LinkTo(_identifyDataBlock); _identifyDataBlock.LinkTo(_addToBounceDataBlock); _spamFilterDataBlock.LinkTo(_addToCrmDataBlock, info => !info.IsSpam); _spamFilterDataBlock.LinkTo(DataflowBlock.NullTarget (), thông tin => info.IsSpam); /*SƠ KHAI*/
Như bạn có thể thấy, mọi thứ cực kỳ đơn giản - chúng tôi kết nối khối với khối tiếp theo (với khả năng đặt điều kiện kết nối). Tất cả các khối được thực hiện song song. Mỗi khối có mức độ song song và dung lượng khác nhau (sử dụng dung lượng, bạn có thể điều chỉnh hàng đợi phía trước khối, tức là khối đã nhận được tin nhắn nhưng chưa xử lý). Do đó, bạn có thể đặt mức độ song song cao cho các thao tác “phức tạp” và dài, chẳng hạn như phân tích nội dung của một bức thư.

Tôi sẽ không mô tả phần cứng DataFlow, tốt hơn hết bạn nên đọc mọi thứ trong TPL DataFlow nguồn gốc.

SortMailDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_spamFilterDataBlock).Fault(t.Exception); else _spamFilterDataBlock.Complete(); )); _sortMailDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_addToFblDataBlock).Fault(t.Exception); else _addToFblDataBlock.Complete(); )); _sortMailDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_checkBounceDataBlock).Fault(t.Exception); else _checkBounceDataBlock.Complete(); )); _spamFilterDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_addToCrmDataBlock).Fault(t.Exception); else _addToCrmDataBlock.Complete(); )); _checkBounceDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_identifyDataBlock).Fault(t.Exception); else _identifyDataBlock.Complete(); )); _identifyDataBlock.Completion.ContinueWith(t => ( if (t.IsFaulted) ((IDataflowBlock)_addToBounceDataBlock).Fault(t.Exception); else _addToBounceDataBlock.Complete(); )); )
Vậy là xong, trên thực tế, băng tải đã hoạt động, bạn có thể đăng tin nhắn lên đó. Tất cả những gì còn lại là dừng nó bằng cách thêm phương thức Start của chúng tôi:

Bắt đầu

public void Start() ( do ( var getMailsTasks = _config.CredentialsList.Select(credentials => Task.Run(() => GetMails(credentials))).ToList(); foreach (var task trong getMailsTasks) task.Wait( ); Thread.Sleep(2000); while (!_stopPipeline); //Dừng đường ống - đợi hoàn thành tất cả các điểm cuối _addToCrmDataBlock.Completion.Wait(); .Completion.Wait(); ("Đường ống đã bị người dùng dừng");


Hãy chuyển sang các đại biểu.
Sắp xếp... Chà, giả sử mọi thứ đều đơn giản đối với chúng ta (chúng ta luôn có thể làm cho nó phức tạp hơn):

Private MessageInfo SortMail(MessageInfo mail) ( switch (mail.Mailbox.Type) ( case MailboxType.Crm: mail.Type = MessageType.GENERAL; break; case MailboxType.Bounce: mail.Type = MessageType.BOUNCE; break; case MailboxType. Fbl: mail.Type = MessageType.FBL ngắt thư trả lại;
Bộ lọc thư rác. Đây là bài tập về nhà - hãy sử dụng SpamAssassin.
Đây là đại biểu của bạn:

Private MessageInfo FilterSpam(MessageInfo mail) ( //TODO: Thêm thư trả về logic SpamAssassin; )
Và các lớp để làm việc với API SpamAssassin (liên kết đến dự án).
Và chúng ta chuyển sang phân tích các chữ cái. Chúng tôi phân tích các câu trả lời tự động. Đây là lúc MEF phát huy tác dụng.
Chúng tôi tạo một dự án (dll) với các giao diện cho các plugin của mình (Hãy gọi nó là Giao diện).
Thêm giao diện:

Giao diện công cộng ICondition ( string Check(Message mimeMessage); ) giao diện công cộng IConditionMetadata ( Type Type ( get; ) )
Và... thế thôi. TopCrawler của chúng tôi phụ thuộc vào dự án này và dự án plugin cũng sẽ sử dụng nó.
Hãy tạo một dự án mới (cũng là một dll), gọi nó là Điều kiện.
Hãy thêm các loại phản hồi tự động:

#khu vực --- Loại --- lớp tĩnh BounceType ( public const string Full = "BounceTypeFull"; public const string Timeout = "BounceTypeTimeout"; public const string Refused = "BounceTypeRefused"; public const string NotFound = "BounceTypeNotFound"; public chuỗi const Không hoạt động = "BounceTypeInactive"; chuỗi const công khai OutOfOffice = "BounceTypeOutOffice"; chuỗi const công khai HostNotFound = "BounceTypeHostNotFound"; chuỗi const công khai NotAuthorized"; chuỗi const công khai ManyConnections = "BounceTypeManyConnections";
Và các lớp thực hiện giao diện của chúng tôi:

Lớp công khai ConditionNotFound1: ICondition ( public string Check(Message mimeMessage) ( if (!mimeMessage.MessagePart.IsMultiPart) trả về null; mẫu chuỗi const = "Diagnostic-Code:.+smtp.+550"; var regrec = new Regex(pattern , RegexOptions.IgnoreCase); trả về mimeMessage.MessagePart.MessageParts.Any(part => part.ContentType.MediaType == "message/delivery-status" && regrec.IsMatch(part.GetBodyAsText())) ; . lớp công khai ConditionTimeout2: ICondition ( return BounceType.Timeout; ) ...
Như bạn nhận thấy, tất cả đều là về thuộc tính. Sử dụng chúng, các plugin sẽ được tải.
Hãy quay lại dự án của chúng tôi và tải các plugin:

Trình thu thập thông tin lớp ( ... //Plugins public IEnumerable > BounceTypeConditions ( get; set; ) riêng void LoadPlugins() ( try ( var container = new CompositionContainer(new DirectoryCatalog(_config.PluginDirectory), true); container.ComposeParts(this); ) Catch (Exception ex) ( Logger.Log .Error("Không thể tải plugin: (0)", ex.Message) ) ...
Chúng tôi kéo LoadPlugins trong hàm tạo của lớp chúng tôi. Tôi sẽ không giải thích chi tiết về cơ chế tải xuống - Google sẽ làm tốt hơn.

Hãy chuyển sang đại biểu kiểm tra loại Thoát của chúng tôi. Các điều kiện sẽ lần lượt được áp dụng cho đến khi phương pháp đầu tiên - loại trừ - hoạt động:

Private MessageInfo BounceTypeCheck(MessageInfo mailInfo) ( try ( foreach (var condition in BounceTypeConditions) ( var res = condition.Value.Check(mailInfo.Mail); if (res == null) continue; mailInfo.Subtype = res; Logger.Log .Debug("Điều kiện loại trả lại [(0)] được kích hoạt cho tin nhắn [(1)]", condition.Metadata.Type, mailInfo.Mail.Headers.MessageId break (Ngoại lệ) ( Logger.Log .Error); ("Không thể xác định kiểu trả lại cho thư "(0)": (1)", mailInfo.Mail.Headers.MessageId, ex.Message); Logger.ErrorsCounters.Increment();
Do đó, nếu một mô-đun logic mới xuất hiện, bạn chỉ cần thêm một lớp mới vào dự án với các plugin triển khai giao diện của chúng tôi và - thì đấy! Tôi sẽ không đính kèm ví dụ về plugin thứ hai để xác định người gửi thư - đây đã là một bài đăng dài (Trả lời tự động được tạo bởi chính máy chủ, vì vậy người gửi cũng cần được phân tích cú pháp từ các tiêu đề của thư thư).

Cũng không có gì bất thường khi ghi lại kết quả vào cơ sở dữ liệu. Ví dụ như thế này:

Private void AddToBounce(MessageInfo mail) ( try ( MailWH.BounceAdd(mail); Functions.ProcessedCounters.Increment(); Functions.Log.Debug("Gửi trả lại tới MailWH"); ) bắt (Ngoại lệ cũ) ( Functions.Log. Error("Lỗi lưu thư Trả lại "(0)" vào MailWH: (1)", mail.Mail.Headers.MessageId, ex.Message Functions.ErrorsCounters.Increment());

ThoátThêm

public static long BounceAdd(MessageInfo message) ( sử dụng (var conn = new SqlConnection(ConnectionString)) sử dụng (var cmd = new SqlDataAdapter("BounceAdd", conn)) ( var body = message.Mail.FindFirstPlainTextVersion() == null ? message.Mail.FindFirstHtmlVersion().GetBodyAsText() : message.Mail.FindFirstPlainTextVersion().GetBodyAsText(); var outId = new SqlParameter("@ID", SqlDbType.BigInt) ( Direction = ParameterDirection.Output ; CommandType.StoredProcedure; cmd.SelectCommand.Parameters.Add(new SqlParameter("@RawMessage", message.Mail.RawMessage)); cmd.SelectCommand.Parameters.Add(new SqlParameter("@Message", body)) ; SelectCommand.Parameters.Add(SqlParameter mới("@Subject", message.Mail.Headers.Subject ?? "")); cmd.SelectCommand.Parameters.Add(SqlParameter mới("@MessageID", message.Mail .Headers. MessageId ?? "")); cmd.SelectCommand.Parameters.Add(SqlParameter mới("@AddressTo", message.Mail.Headers.To.Address ?? "")); cmd.SelectCommand.Parameters.Add (SqlParameter mới ("@AddressFrom", message.Mail.Headers.From.Address ?? "")); cmd.SelectCommand.Parameters.Add(SqlParameter mới("@DateRecieved", DateTime.Now)); cmd.SelectCommand.Parameters.Add(SqlParameter mới("@BounceTypeSysName", (object)message.Subtype ?? DBNull.Value)); cmd.SelectCommand.Parameters.Add(SqlParameter mới("@SourceFrom", (object)message.Recipient ?? DBNull.Value)); // VIỆC CẦN LÀM: Thêm ListId hỗ trợ cmd.SelectCommand.Parameters.Add(new SqlParameter("@ListId", DBNull.Value)); cmd.SelectCommand.Parameters.Add(outId); conn.Open(); cmd.SelectCommand.ExecuteNonQuery(); trả về outId.Value bao lâu? ?? 0; ) )


Xin lỗi, tôi không có thời gian để hiển thị TopShelf - bài đăng đã quá cồng kềnh.

kết luận

Trong hướng dẫn này, chúng ta đã biết rằng nhiệm vụ thu thập thư có thể không đơn giản như vậy. Lõi được phát triển cho phép bạn nhanh chóng thêm các bước quy trình mới - khối DataFlow - mà không ảnh hưởng đến logic hiện có. Hệ thống con plugin cho phép bạn nhanh chóng mở rộng logic phân tích cú pháp giống như tập lệnh và DataFlow tự song song hóa tất cả các phép tính (và chúng tôi có khả năng định cấu hình linh hoạt đa luồng cho một máy cụ thể). TopShelf cung cấp cho chúng tôi khả năng chạy một dịch vụ ở cả chế độ dịch vụ và chế độ bảng điều khiển để gỡ lỗi dễ dàng hơn.

Phù... Nếu bạn quan tâm, tôi sẽ cho bạn biết cách đưa tính năng này vào lộ trình Tích hợp liên tục, thiết lập các bản dựng và phát hành tự động thông qua Quản lý phát hành VS.

Thẻ: Thêm thẻ

Tôi tiếp tục loạt bài viết về chức năng thu thập thư vào một hộp thư chính từ bất kỳ hộp thư nào khác nằm trên bất kỳ dịch vụ thư nào. Trong bài viết trước chúng ta đã nói về việc thiết lập bộ sưu tập thư trên dịch vụ Yandex, việc này rất dễ thực hiện. Và trong bài viết này, tôi sẽ nói về cách thực hiện điều tương tự trong một dịch vụ khác không kém phần phổ biến hiện nay - Mail.ru, nơi nhiều người vẫn giữ hộp thư chính của họ, mặc dù thực tế là dịch vụ GMail có những ưu điểm rõ ràng (chúng ta đã nói về việc thiết lập bộ sưu tập thư trong Gmail). Nhưng như người ta nói, đối với mỗi người và đôi khi đó chỉ là vấn đề thói quen :)

Việc thiết lập bộ sưu tập thư trong dịch vụ Mail.ru cũng dễ dàng như trong Yandex. Chỉ cần một vài bước đơn giản và mọi thứ sẽ sẵn sàng, thư sẽ bắt đầu được gửi từ các hộp thư mà bạn đã kết nối với một hộp thư trên Mail.

Quá trình thiết lập bộ sưu tập thư trong dịch vụ Mail.ru

Trước hết, hãy đăng nhập vào tài khoản Thư của bạn, tại đây bạn sẽ thu thập thư từ các tài khoản email khác và mở phần “Thư” (đó là nơi chứa thư).

Bây giờ bạn cần vào cài đặt thư của mình. Để thực hiện việc này, hãy nhấp vào nút “Thêm” ở trên cùng và chọn “Cài đặt”.

Bạn cũng có thể mở cài đặt bằng cách nhấp vào địa chỉ email của bạn ở góc trên bên phải rồi chọn “Cài đặt thư”.

Sau đó đi tới phần “Thư từ các hộp thư khác”.

Cửa sổ đầu tiên để kết nối hộp email thứ hai sẽ mở ra.

Hãy để tôi nhắc bạn rằng hộp email thứ hai mà bạn muốn thu thập thư có thể nằm trên bất kỳ dịch vụ nào, không chỉ Thư!

Trong ví dụ cho bài viết này, chúng tôi sẽ xem xét việc kết nối hộp thư nằm trên dịch vụ Yandex.

Trong cửa sổ này, bạn cần chỉ định thông tin đăng nhập và mật khẩu cho thư bạn đang kết nối. Nếu hộp thư bạn đang kết nối thuộc một trong các dịch vụ được liệt kê bên dưới thì hãy nhấp vào nút tương ứng ở trên cùng, nhập địa chỉ đầy đủ của hộp thư bên dưới và nhấp vào “Thêm hộp thư”:

Nếu hộp thư bạn muốn kết nối nằm trên một số dịch vụ khác (không phải từ danh sách trên), hãy nhấp vào nút “Thư khác” ở trên cùng, sau đó bạn cần nhập địa chỉ đầy đủ của thư bạn muốn kết nối, mật khẩu cho nó và nhấp vào “Thêm hộp thư”.

Nếu bạn chưa đăng nhập vào tài khoản email thứ hai của mình trong trình duyệt mà bạn đang kết nối này, thì trong cửa sổ tiếp theo, bạn sẽ cần nhập thông tin đăng nhập và mật khẩu của mình cho tài khoản đó. Ví dụ:

Sau đó, nhấp vào “Cho phép” (bạn cho phép thư trên Mail.ru sử dụng một số dữ liệu từ thư thứ hai được kết nối).

Nếu mọi thứ diễn ra như mong đợi, bạn sẽ nhận được thông báo cho biết bộ sưu tập đã được thêm. Bây giờ bạn cần chọn thư mục để thu thập thư: trong một thư mục được tạo đặc biệt theo tên của thư bạn đã kết nối hoặc trong hộp thư đến của bạn. Tùy bạn quyết định, nhưng theo tôi, sẽ thuận tiện hơn khi thư được thu thập từ hộp thư khác sẽ được chuyển vào một thư mục riêng. Bằng cách này hay cách khác, điều này sau đó có thể được cấu hình bằng cách lọc các chữ cái.

Tùy chọn “Áp dụng bộ lọc cho thư đã nhận” có nghĩa là tất cả các bộ lọc mà bạn đã định cấu hình trong thư chính của mình trên Thư cũng sẽ áp dụng cho thư nhận được từ hộp thư được kết nối. Tắt hay không là tùy bạn.

Thế là xong, trình thu thập thư đã được thiết lập! Bây giờ, trong vòng vài phút (đôi khi quá trình này mất nhiều thời gian hơn nếu có nhiều thư trên hộp thư được kết nối), thư từ hộp thư thứ hai sẽ bắt đầu chuyển vào hộp thư chính của bạn.

Bằng cách này, bạn có thể kết nối bao nhiêu thư tùy thích để thu thập.

Làm cách nào để xem riêng tất cả các chữ cái từ thư được kết nối?

Bạn có thể xem các bức thư riêng biệt nếu khi thiết lập bộ sưu tập thư trong Mail, bạn đã chỉ định rằng các bức thư phải được thu thập trong một thư mục riêng có tên của hộp thư được kết nối. Trong trường hợp này, hãy mở thư mục này và xem tất cả các chữ cái cần thiết. Ví dụ:

Nếu bạn chưa thiết lập ngay việc nhận thư trong một thư mục riêng, bạn có thể thiết lập nó bất kỳ lúc nào bằng cách mở bộ sưu tập đã tạo (xem thêm về điều này bên dưới).

Định cấu hình trình thu thập thư đã tạo, tắt và bật nó

Đôi khi, bạn có thể cần thực hiện các thay đổi đối với cài đặt của trình thu thập thư mà bạn đã tạo cũng như tắt hoặc bật lại nó.

Việc này có thể được thực hiện ở cùng một vị trí trong phần “Cài đặt” - “Thư từ các hộp thư khác”, nơi ban đầu bạn đã tạo bộ sưu tập thư của mình.

Ở đây bạn sẽ thấy vòi đã được tạo. Nếu bạn cần tắt hoặc bật lại, hãy nhấp vào công tắc tương ứng. Nếu bạn cần mở cài đặt bộ sưu tập, hãy nhấp vào “Chỉnh sửa”.

Và các cài đặt tương tự cho trình thu thập thư sẽ mở ra như ở giai đoạn tạo nó (xem).

Gmail thuận tiện sử dụng khi bạn có nhiều địa chỉ email. Một e-mail được sử dụng cho thư từ cá nhân. Chỉ có bạn bè và người quen của bạn biết điều đó. Một địa chỉ khác được chỉ định khi đăng ký trên các trang web khác nhau. Dịch vụ cần email của bạn để phản hồi. Xác nhận đăng ký, tin tức, v.v. được gửi đến nó. Có khả năng những kẻ gửi thư rác có thể lấy được địa chỉ email đó và khi đó thư của bạn sẽ tràn ngập những quảng cáo không cần thiết. Để tránh điều này, bạn nên đăng ký 2-3 tài khoản email cho các mục đích khác nhau.

Một mặt, cần phải có nhiều hộp thư, nhưng mặt khác, bạn phải vào từng hộp thư riêng biệt và xem tin nhắn. Nó không thoải mái. Đây là lý do tại sao người thu thập thư được phát minh. Ví dụ: trong Gmail, bạn thiết lập quyền truy cập vào tài khoản thư của mình và hệ thống sẽ lấy thư từ đó và chuyển chúng vào hộp thư Gmail của bạn mà không cần sự tham gia của bạn. Tất cả những gì bạn phải làm là thiết lập tính năng lọc thư để các chữ cái được sắp xếp vào đúng thư mục.

Làm cách nào để thiết lập trình thu thập thư trong Gmail?

Gmail cho phép bạn lấy lại email từ 5 hộp thư khác nhau. Đây có thể là tài khoản Gmail hoặc địa chỉ e-mail trên các dịch vụ thư khác hỗ trợ POP. Không cần phải lo lắng về điều này, bởi vì hầu hết các dịch vụ email, bao gồm Yandex, Mail.ru và các dịch vụ khác, đều cung cấp cơ hội này. Nếu bạn đã nhận được tài khoản trên Gmail, bạn cần kiểm tra cài đặt hộp thư xem bạn có được phép sử dụng giao thức này hay không.

Để trình thu thập bắt đầu làm việc, nó cần chỉ ra địa chỉ e-mail nào sẽ được thu thập. Một vài bước đơn giản để thực hiện việc này:

  1. Chuyển đến “Cài đặt” (nút có hình bánh răng ở bên phải).
  2. Chuyển đến phần "Tài khoản".
  3. Tìm "Kiểm tra thư từ các tài khoản khác (sử dụng POP3)" và nhấp vào "Thêm tài khoản thư POP3 của bạn".

  1. Chỉ định địa chỉ hộp thư mà thư sẽ được thu thập và nhấp vào nút “Hành động tiếp theo”.

  1. Nhập tên người dùng và mật khẩu cho hộp thư này. Định cấu hình cài đặt máy chủ thư của bạn. Gmail tự động điền địa chỉ máy chủ và cổng. Trong hầu hết các trường hợp, không cần phải thay đổi gì. Nếu sau khi hoàn tất thiết lập, các chữ cái không được truy xuất từ ​​địa chỉ bạn đã chỉ định, hãy kiểm tra cài đặt và cổng máy chủ pop trong hệ thống trợ giúp của dịch vụ nơi hộp thư được đăng ký.

  • Nếu bạn chọn hộp kiểm “Lưu bản sao của thư đã nhận trên máy chủ”, người thu thập sẽ không xóa thư trong hộp thư gốc.
  • Để không nhầm lẫn các chữ cái từ các địa chỉ email khác nhau, hãy chọn hộp kiểm “Gán nhãn cho các chữ cái đến” và chọn thư mục (chỉ định nhãn) nơi chúng sẽ được đặt.
  • Để đảm bảo rằng các tin nhắn từ địa chỉ đã chỉ định không xuất hiện trong thư mục “Hộp thư đến”, hãy sử dụng cờ “Lưu trữ tin nhắn đến (bỏ qua “Hộp thư đến”)”. Tin nhắn không bị xóa nhưng được lưu trữ và có sẵn để xem.
  1. Nhấp vào nút "Thêm tài khoản". Nếu thành công, Gmail sẽ nhắc bạn thực hiện thêm một số bước để định cấu hình các tính năng bổ sung. Chúng tôi chưa quan tâm đến khả năng này nên chúng tôi sẽ từ chối.

Bây giờ, trong phần “Tài khoản”, địa chỉ hộp thư mà Gmail sẽ thu thập thư đã xuất hiện. Tần suất thu thập được đặt tự động và bạn không thể tác động đến nó.

Lặp lại quy trình này cho các địa chỉ email khác.

Nếu xảy ra lỗi trong quá trình thiết lập, hãy nhấp vào liên kết “Chỉnh sửa” bên cạnh tài khoản thích hợp và điều chỉnh các cài đặt cần thiết.

Làm cách nào để vô hiệu hóa trình thu thập email?

Nếu bạn quyết định không thu thập email từ các tài khoản email khác, hãy tắt tính năng này.

  1. Đi tới Cài đặt tài khoản Gmail của bạn và đi tới phần Tài khoản.
  2. Tìm mục “Kiểm tra thư từ các tài khoản khác (sử dụng POP3)” và nhấp vào “Xóa” bên cạnh tài khoản bạn muốn vô hiệu hóa.

Sau đó, trình thu thập Gmail sẽ không còn thu thập thư từ hộp thư này nữa. Điều này rất có thể sẽ không xảy ra ngay lập tức. Nếu tài khoản bị vô hiệu hóa có nhiều thư đến thì chúng sẽ đến hộp thư đến Gmail của bạn trong một thời gian ngắn.

Các dịch vụ khác cũng cho phép bạn định cấu hình việc thu thập thư từ các địa chỉ email khác. Tôi đã sử dụng tính năng này từ lâu vì nó tiện lợi. Hãy thử nó và bạn sẽ đánh giá cao nó đơn giản như thế nào.

Chuyển từ tab này bằng Gmail sang tab khác bằng Yandex.Mail khá tẻ nhạt. Và nếu bạn có hàng tá tài khoản với các nhà cung cấp email khác nhau, việc kiểm tra thư mới vào buổi sáng sẽ trở thành một cực hình. Bằng cách kết hợp các chữ cái ở một nơi, bạn sẽ thoát khỏi sự bất tiện này.

giao diện web

Hầu hết các nhà cung cấp email đều cung cấp tính năng tích hợp sẵn để thu thập email từ nhiều hộp thư. Ví dụ: hãy thử thu thập thư từ tất cả các hộp thư của bạn vào một tài khoản Gmail.

Trước hết, hãy đảm bảo rằng dịch vụ bưu chính mà bạn muốn nhận thư có quyền truy cập POP. Sau đó đi tới cài đặt Gmail của bạn và nhấp vào Cài đặt ở góc trên cùng bên phải. Chuyển đến tab “Tài khoản” và tìm phần “Nhận thư từ các tài khoản khác”.

Thêm tài khoản, nhập địa chỉ email của bạn và nhấp vào Tiếp theo, sau đó nhập mật khẩu của bạn. Để làm cho việc trao đổi thư giữa các nhà cung cấp trở nên an toàn hơn, hãy đảm bảo rằng tùy chọn “Luôn sử dụng kết nối an toàn (SSL) khi nhận thư” được bật. Sau đó bấm vào “Thêm tài khoản”.

Giờ đây, những bức thư gửi đến địa chỉ đã thêm sẽ được tự động thu thập trong Hộp thư đến Gmail của bạn. Bạn có thể thêm bao nhiêu địa chỉ email tùy thích.

Máy khách để bàn

Email cần phần mềm. Có, bạn có thể làm được nhiều việc trong ứng dụng thư trên web (đôi khi nhiều hơn những gì Google hiện cho phép bạn làm trong Gmail). Nhưng giao diện web không thể so sánh với ứng dụng gốc. Ngay cả giao diện người dùng Web hiện đại nhất cũng gặp trở ngại khi làm việc với thư.

Rafe Needleman, Сnet.com

Ứng dụng email trên máy tính để bàn rất tốt vì chúng có thể tổng hợp email từ nhiều tài khoản. Đồng thời, bạn có thể làm việc với hàng tá địa chỉ và thậm chí không cần suy nghĩ xem nhà cung cấp nào lưu trữ tin nhắn này hay tin nhắn kia.

Hầu hết các ứng dụng email trên máy tính để bàn đều có Hộp thư đến chung được tích hợp sẵn. Ngay cả khi ứng dụng khách yêu thích của bạn chỉ hỗ trợ các hộp thư đến riêng lẻ, bạn vẫn có thể dễ dàng tập hợp chúng lại với nhau bằng các bộ lọc thông minh.

Mặc dù Outlook được thiết kế để quản lý nhiều hộp thư cùng lúc nhưng nó vẫn hiển thị Hộp thư đến riêng cho từng tài khoản. Nhưng điều này có thể dễ dàng khắc phục bằng cách sử dụng các bộ lọc.

Mở Outlook, chuyển đến tab Thư mục và nhấp vào Thư mục Tìm kiếm Mới trên thanh công cụ. Sau đó chọn "Tạo thư mục tìm kiếm tùy chỉnh." Bấm Chọn nhưng không chọn bất kỳ tiêu chí tìm kiếm nào để tất cả tin nhắn mới được gửi vào thư mục. Đặt tên cho thư mục theo bất kỳ tên nào bạn thích, chẳng hạn như “All Mail”.

Nhấp vào “Duyệt qua”, chọn tất cả các thư mục và hộp thư mà bạn muốn thu thập thư và chọn tùy chọn “Tìm kiếm trong thư mục con”.

Bây giờ thư mục thông minh bạn đã tạo sẽ chứa email từ tất cả tài khoản email bạn đã thêm vào Outlook. Bạn có thể bật tùy chọn "Hiển thị trong Mục ưa thích" để thư mới của bạn luôn hiển thị.

Ứng dụng email khách Mac cung cấp một hộp thư đến duy nhất cho tất cả các tài khoản được kết nối. Chỉ cần thêm tài khoản của bạn và tất cả các chữ cái mới sẽ được thu thập ở một nơi.

Trong Thunderbird, việc thu thập tất cả email của bạn vào một hộp thư đến thật dễ dàng. Vào menu View (nếu thanh menu không hiển thị thì nhấn Alt). Sau đó chọn “Thư mục” → “Đã hợp nhất”. Bây giờ bạn sẽ có một Hộp thư đến dành cho email mới, một thư mục Thư nháp, một thư mục Mục đã gửi và một thư mục Lưu trữ. Bạn sẽ không phải tìm kiếm lâu để tìm hiểu những gì ở đâu. Trong trường hợp này, tin nhắn sẽ, như trước đây, được lưu trữ trên máy chủ của nhà cung cấp dịch vụ thư của bạn.

Khách hàng di động

Hộp thư đến hợp nhất có sẵn trong nhiều ứng dụng email dành cho thiết bị di động, bao gồm cả Gmail. Ứng dụng Gmail thu thập hộp thư đến của bạn từ tất cả các tài khoản email, bao gồm Yahoo, Outlook hoặc các dịch vụ khác.

Nếu không thích ứng dụng của Google, bạn có thể dùng thử ứng dụng email khách của bên thứ ba như Outlook hoặc MyMail.

Có thể bạn có ý tưởng riêng về cách nhóm thư ở một nơi? Chia sẻ trong các ý kiến.

Nhiều thủ thuật sẽ giúp làm việc với email thuận tiện hơn - thông báo SMS, trả lời tự động, thu thập thư và các tính năng khác.

Bất chấp sự phổ biến khắp nơi của các chương trình và dịch vụ để trao đổi nhanh các tin nhắn nhỏ (ICQ, Google Talk và các dịch vụ khác), e-mail cũ tốt - phương thức trao đổi thông tin mà nói chung là Internet ra đời - vẫn được yêu thích, tôn trọng và tôn trọng.

Thật không may, nhiều người trong chúng ta không sử dụng hết tiềm năng của hộp thư email của mình. Ví dụ: bạn có biết rằng một số hộp thư, thậm chí nằm ở các dịch vụ thư khác nhau, thực sự có thể được kết hợp thành một không? Hay bạn không cần phải ngồi gần màn hình trong khi chờ đợi một lá thư quan trọng vì bạn có thể thiết lập thông báo qua SMS? Những tính năng này và nhiều tính năng khác bị ẩn trong cài đặt hộp thư của bạn; việc truy cập chúng chỉ cần vài cú nhấp chuột, nhưng bạn cần biết cách khai thác.

"Chúng tôi không ở nhà"

Nếu vì lý do này hay lý do khác mà bạn sẽ bị cắt Internet trong một thời gian dài (bất cứ điều gì cũng có thể xảy ra - bạn bị cảm lạnh, về quê hoặc đi nghỉ), thì việc bật cái gọi là máy trả lời tự động là điều hợp lý trong khoảng thời gian này, nó sẽ thông báo cho tất cả các bức thư đến mà chủ sở hữu chiếc hộp đã để lại “đi Paris có việc khẩn cấp” và sẽ không trả lời ngay lập tức.

Trong hệ thống Mail.ru (www.mail.ru), bạn có thể truy cập tính năng này bằng cách truy cập hộp thư của mình, nhấp vào nút “Thêm” ở menu trên cùng, chọn mục “Cài đặt” và trong đó - “Thư” Trình đơn Wizard”. Ở cuối trang mở ra, bạn sẽ thấy phần “Trả lời tự động”. Bằng cách chọn hộp bên cạnh “Bật trả lời tự động”, hãy điền vào trường “Văn bản trả lời tự động”. Trong đó, bạn có thể tự do viết bất cứ điều gì bạn muốn, miễn là người đăng ký của bạn hiểu rằng bạn không thể đọc thư của anh ấy ngay bây giờ, nhưng ngay khi bạn thấy mình ở máy tính, bạn sẽ đọc nó ngay lập tức. Trong trường văn bản, bạn có thể đặt thời gian hoạt động của máy trả lời - bạn không chỉ có thể chỉ định ngày mà thậm chí cả giờ và phút. Để tính năng trả lời tự động hoạt động, bạn phải nhập mật khẩu bạn sử dụng để đăng nhập vào thư của mình.

Trong Yandex.Mail (mail.yandex.ru), máy trả lời tự động có sẵn trong menu Cài đặt - Quy tắc xử lý thư. Để kích hoạt nó, bạn cần nhấp vào nút “Tạo quy tắc”, sau đó trong phần “Thực hiện hành động”, chọn “Trả lời bằng văn bản sau” và nhập văn bản mong muốn vào trường (chẳng hạn như “Tôi không thể đọc được thư ngay bây giờ, nhưng tôi hứa sẽ làm như vậy, kiểu như chỉ có tôi mới có cơ hội này thôi." Khi hoàn tất, nhấp vào nút Tạo quy tắc.

Ngoài ra còn có tính năng trả lời tự động trong hệ thống email phổ biến Gmail (www.gmail.com). Bạn có thể kích hoạt nó trong cài đặt bằng cách nhấp vào hình bánh răng ở góc trên. Trong phần cài đặt, hãy chuyển đến tab “Chung” và đặt nút chuyển sang vị trí “Bật máy trả lời”. Trong trường hợp này, bạn có thể thiết lập máy trả lời tự động để những bức thư về việc bạn không có mặt sẽ chỉ được gửi đến những người được thêm vào danh sách liên hệ - những người lạ sẽ không biết về sự vắng mặt của chủ sở hữu hộp thư.

Tất cả thư trong một hộp

Nếu bạn sử dụng nhiều hộp thư thì chức năng “thu thập thư” có thể hữu ích cho bạn. Hầu như mọi hệ thống email đều cho phép bạn kết nối với các địa chỉ email khác và tải email xuống từ chúng. Bằng cách này, bạn sẽ không cần phải giám sát nhiều hộp cùng một lúc - tất cả thư từ sẽ được lưu trữ ở một nơi. Trong Mail.ru, “trình thu thập thư” nằm trong phần “Cài đặt - Trình thu thập thư (máy chủ POP3)”. Chức năng này được cấu hình như sau: bạn cần chỉ định tên của máy chủ POP3 và nhập mật khẩu cho hộp thư. Ví dụ: nếu bạn muốn gửi thư từ Yandex.Mail đến hộp thư của mình trên Mail.ru, hãy chỉ định địa chỉ máy chủ pop.yandex.ru và mật khẩu bạn sử dụng trong thư Yandex. Và nếu bạn cần hệ thống thư của mình để “nhận” thư từ Gmail, thì địa chỉ máy chủ pop3 sẽ như thế này: pop.gmail.com. Bạn có thể tìm hiểu tên máy chủ pop3 của các dịch vụ thư khác trên trang web của các dịch vụ này. Có khá nhiều trong số chúng trên Internet và sẽ rất khó để đề cập đến từng cái.

Trong Yandex.Mail, việc thiết lập việc thu thập thư từ các hộp thư khác dễ dàng hơn: bạn chỉ cần chỉ định e-mail mà bạn muốn tải thư xuống và mật khẩu cho nó. Hệ thống sẽ thực hiện tất cả các cài đặt khác một cách độc lập. Trong Gmail, “trình thu thập thư” được định cấu hình trong phần “Cài đặt thư - Tài khoản và nhập”. Trong tab này có mục “Thu thập thư từ tài khoản khác”.

Nhân tiện, có một cách khác để thu thập tất cả thư vào một hộp. Vì vậy, trong mỗi hộp thư điện tử của mình, bạn có thể cho biết rằng bạn muốn chuyển hướng tất cả thư từ đến đến một hoặc một địa chỉ khác. Vì vậy, trong Yandex.Mail, việc này được thực hiện trong “Quy tắc xử lý thư đến”. Sau khi nhập phần này, hãy nhấp vào nút “Tạo quy tắc” và chọn hành động có tên “Chuyển tiếp tới địa chỉ”, sau đó chỉ định địa chỉ mà thư sẽ được chuyển tiếp. Trong Mail.ru, việc chuyển hướng thư được quản lý bằng menu “Chuyển tiếp” trong phần cài đặt và trong Gmail, để định cấu hình chuyển tiếp thư, hãy đi tới phần “Cài đặt thư - Chuyển tiếp và POP/IMAP”, sau đó trong menu thả xuống đầu tiên, chọn “Thêm” địa chỉ email mới".

Những vị khách không mời

Hệ thống thư cũng có thể “cắt bỏ” những bức thư mà vì lý do này hay lý do khác mà bạn không muốn nhìn thấy trong hộp thư của mình. Trong Yandex.Mail, bạn có thể thêm địa chỉ của một người vào cái gọi là “danh sách đen” trong “Cài đặt - Quy tắc xử lý thư đến”. Trong trường màu đen, chỉ cần chỉ ra e-mail “không thân thiện” và nhấp vào nút “thêm”. Mục “Danh sách đen” cũng tồn tại trong cài đặt hộp thư Mail.ru. Trong Gmail, cách dễ nhất là nhấp vào nút “Spam!”. - một lá thư từ một người nhận khó chịu sẽ được chuyển vào thùng rác, và điều tương tự sẽ xảy ra trong tương lai nhưng không có sự tham gia của bạn.

Gửi thư tới SMS

Trong khi chờ đợi một lá thư quan trọng, tuyệt đối không nhất thiết phải ngồi hàng giờ trước máy tính và kiểm tra email mỗi phút. Ví dụ: Mail.ru cho phép bạn định cấu hình gửi thông báo SMS về sự xuất hiện của thư mới. Trong phần “Thông báo qua SMS”, nhập số điện thoại di động của bạn và chọn hộp bên cạnh “Thông báo về thư mới bằng SMS”. Bạn cũng có thể chọn thời điểm mà tin nhắn SMS về các bức thư mới sẽ không được gửi - ví dụ: khó có ai muốn bị làm phiền vào ban đêm. Gmail và Yandex.Mail chưa cung cấp tùy chọn như vậy, nhưng Yandex mail cho phép bạn gửi thông báo đến một số điện thoại di động cụ thể khi gửi thư. Điều này có thể được thực hiện bằng cách nhấp vào liên kết “Tùy chọn bổ sung” ở cuối mẫu viết thư và cho biết số điện thoại trong cửa sổ tương ứng.

“Đã đăng ký với xác nhận đã giao hàng”

Hệ thống thư cho phép bạn tìm hiểu xem một lá thư đã được gửi đến người nhận hay chưa. Sau khi người nhận tin nhắn mở nó ra, một lá thư đặc biệt sẽ được gửi cho bạn để phản hồi, lá thư này sẽ cho bạn biết về điều này. Trong Yandex.Mail, việc này được thực hiện bằng cách sử dụng liên kết “Tham số bổ sung” bên dưới nội dung của một bức thư mới - trong cửa sổ mở ra, bạn chỉ cần chọn hộp bên cạnh mục “Thông báo về việc nhận thư”. Nhưng các nhà phát triển Gmail coi chức năng như vậy là không cần thiết - trong mọi trường hợp, họ không thể tìm thấy nó trong cài đặt.