Advertisement
Ilyialat

TempMail

Apr 1st, 2014
4,228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.38 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Text;
  6. using System.Xml;
  7. using System.Xml.Linq;
  8.  
  9. namespace Temp_Mail
  10. {
  11.     internal sealed class RGenerator
  12.     {
  13.         const int BufferSize = 1024;
  14.         byte[] RandomBuffer;
  15.         int BufferOffset;
  16.         static System.Security.Cryptography.RNGCryptoServiceProvider rng;
  17.         static RGenerator()
  18.         {
  19.             rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
  20.         }
  21.         public RGenerator()
  22.         {
  23.             RandomBuffer = new byte[BufferSize];
  24.             BufferOffset = RandomBuffer.Length;
  25.         }
  26.         private byte Next()
  27.         {
  28.             if (BufferOffset >= RandomBuffer.Length)
  29.             {
  30.                 rng.GetBytes(RandomBuffer);
  31.                 BufferOffset = 0;
  32.             }
  33.             return RandomBuffer[BufferOffset++];
  34.         }
  35.         public int Next(int minValue, int maxValue)
  36.         {
  37.             int range = maxValue - minValue;
  38.             return minValue + Next() % range;
  39.         }
  40.  
  41.         const int MinStringLength = 6;
  42.         const int MaxStringLength = 10;
  43.         public string NextString()
  44.         {
  45.             StringBuilder sb = new StringBuilder();
  46.             int count = Next(MinStringLength, MaxStringLength);
  47.             for (int i = 0; i < count; i++)
  48.                 sb.Append((char)Next('a', 'z'));
  49.             return sb.ToString();
  50.         }
  51.     }
  52.     internal static class HTTPWrapper
  53.     {
  54.         static DateTime unix = new DateTime(1970, 1, 1);
  55.  
  56.         static XDocument Get(string url)
  57.         {
  58.             try
  59.             {
  60.                 var req = (HttpWebRequest)HttpWebRequest.Create(url);
  61.                 req.AutomaticDecompression = DecompressionMethods.GZip;
  62.                 req.UserAgent = "CSWrap";
  63.                 using (var resp = req.GetResponse())
  64.                 using (var s = resp.GetResponseStream())
  65.                     return XDocument.Load(s);
  66.             }
  67.             catch (WebException e)
  68.             {
  69.                 if ((e.Status & WebExceptionStatus.ProtocolError) == WebExceptionStatus.ProtocolError)
  70.                     return null;
  71.                 throw;
  72.             }
  73.             catch { throw; }
  74.         }
  75.         public static string[] GetDomains()
  76.         {
  77.             var xml = Get("http://api.temp-mail.ru/request/domains/format/xml/");
  78.             return xml.Root.Elements().Select(x => x.Value).ToArray();
  79.         }
  80.         public static Letter[] GetLetters(string hash, string lastId = null)
  81.         {
  82.             var t = Get(string.Format("http://api.temp-mail.ru/request/mail/id/{0}/format/xml/", hash));
  83.             if (t == null)
  84.                 return new Letter[0];
  85.  
  86.             //Жалко, что нельзя просто запросить новые сообщения без кучи старых,
  87.             //А новые сообщения оказываются в самом конце этой кучи =(
  88.             var arr = t.Root.Elements().Reverse().ToArray();
  89.             var result = new List<Letter>(arr.Length);
  90.             foreach (var x in arr)
  91.             {
  92.                 string mailId = x.Element("mail_id").Value;
  93.                 if (lastId == mailId)
  94.                     break;
  95.                 result.Add(new Letter
  96.                 {
  97.                     MailId = mailId,
  98.                     MailAddressId = x.Element("mail_address_id").Value,
  99.                     MailFrom = x.Element("mail_from").Value,
  100.                     MailSubject = x.Element("mail_subject").Value,
  101.                     MailPreview = x.Element("mail_preview").Value,
  102.                     MailTextOnly = x.Element("mail_text_only").Value,
  103.                     MailText = x.Element("mail_text").Value,
  104.                     MailHtml = x.Element("mail_html").Value,
  105.                     MailTimestamp = unix + TimeSpan.FromSeconds(double.Parse(x.Element("mail_timestamp").Value))
  106.                 });
  107.             };
  108.             return result.ToArray();
  109.         }
  110.     }
  111.     /// <summary>
  112.     /// Сообщение
  113.     /// </summary>
  114.     public struct Letter
  115.     {
  116.         /// <summary>
  117.         /// Уникальный идентификатор письма, присвоенный системой
  118.         /// </summary>
  119.         public string MailId;
  120.         /// <summary>
  121.         /// Md5 хеш почтового адреса
  122.         /// </summary>
  123.         public string MailAddressId;
  124.         /// <summary>
  125.         /// Отправитель
  126.         /// </summary>
  127.         public string MailFrom;
  128.         /// <summary>
  129.         /// Тема
  130.         /// </summary>
  131.         public string MailSubject;
  132.         /// <summary>
  133.         /// Предпросмотр сообщения
  134.         /// </summary>
  135.         public string MailPreview;
  136.         /// <summary>
  137.         /// Cообщение в текстовом или в html формате (основной)
  138.         /// </summary>
  139.         public string MailTextOnly;
  140.         /// <summary>
  141.         /// Cообщение только в текстовом формате
  142.         /// </summary>
  143.         public string MailText;
  144.         /// <summary>
  145.         /// Cообщение только в html формате
  146.         /// </summary>
  147.         public string MailHtml;
  148.         /// <summary>
  149.         /// Время
  150.         /// </summary>
  151.         public DateTime MailTimestamp;
  152.     }
  153.     /// <summary>
  154.     /// API для работы с temp-mail.ru
  155.     /// </summary>
  156.     public sealed class TempMail
  157.     {
  158.         RGenerator gen;
  159.         System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
  160.  
  161.         string lastMailId;
  162.         /// <summary>
  163.         /// Доступные домены
  164.         /// </summary>
  165.         public string[] Domains { get; private set; }
  166.         /// <summary>
  167.         /// Хэш используемого ящика
  168.         /// </summary>
  169.         public byte[] MailHash { get; private set; }
  170.         /// <summary>
  171.         /// Хэш используемого ящика
  172.         /// </summary>
  173.         public string MailHashString { get; private set; }
  174.         /// <summary>
  175.         /// Имя используемого ящика
  176.         /// </summary>
  177.         public string Mail { get; private set; }
  178.         /// <summary>
  179.         ///
  180.         /// </summary>
  181.         public TempMail()
  182.         {
  183.             gen = new RGenerator();
  184.         }
  185.  
  186.         /// <summary>
  187.         /// Получает список доступных доменов (@domain)
  188.         /// </summary>
  189.         public void GetDomains()
  190.         {
  191.             Domains = HTTPWrapper.GetDomains();
  192.         }
  193.  
  194.         /// <summary>
  195.         /// Random name(6-10 length string)@Random domain
  196.         /// </summary>
  197.         public void GetNewMail() { GetNewMail(gen.NextString()); }
  198.         /// <summary>
  199.         /// mailName@Random domain
  200.         /// </summary>
  201.         /// <param name="mailName"></param>
  202.         public void GetNewMail(string mailName)
  203.         {
  204.             var domain = Domains[gen.Next(0, Domains.Length - 1)];
  205.             Mail = mailName + domain;
  206.             MailHash = md5.ComputeHash(Encoding.ASCII.GetBytes(Mail));
  207.             StringBuilder sb = new StringBuilder(MailHash.Length * 2);
  208.             for (int i = 0; i < MailHash.Length; i++)
  209.                 sb.Append(MailHash[i].ToString("X2"));
  210.             MailHashString = sb.ToString();
  211.         }
  212.         /// <summary>
  213.         /// Получает сообщения с почты
  214.         /// </summary>
  215.         /// <returns>Пустой массив, если нету сообщений</returns>
  216.         public Letter[] GetLetters()
  217.         {
  218.             var result = HTTPWrapper.GetLetters(MailHashString);
  219.             if (result.Length > 0)
  220.                 lastMailId = result[0].MailId;
  221.             return result;
  222.         }
  223.         /// <summary>
  224.         /// Возвращает только новые сообщения
  225.         /// </summary>
  226.         /// <returns>Пустой массив, если нету новых сообщений</returns>
  227.         public Letter[] GetNewLetters()
  228.         {
  229.             var result = HTTPWrapper.GetLetters(MailHashString, lastMailId);
  230.             if (result.Length > 0)
  231.                 lastMailId = result[0].MailId;
  232.             return result;
  233.         }
  234.     }
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement