2010-02-27 3 views
1

Mailman 메일 링리스트에서 사용자를 추가하거나 제거해야하는 .Net 응용 프로그램을 개발해야합니다. 제 질문은 .Net 커넥터 또는 Dll 연결 여부입니다 .Net을 사용하여 우편 발송자 메일 링리스트로..Net을 사용하여 Mailman 메일 링리스트에 연결하는 방법

+0

당신은 당신이 무슨 뜻인지 명확히 주 시겠어요 "연결"하십시오. 원하는 인터페이스를 설명하고 필요한 인터페이스가 무엇인지 명확하게하십시오. – AxelEckenberger

+0

답장을 보내 주셔서 감사합니다. 실제로 메일 맨 메일 링리스트에서 사용자를 가입 또는 탈퇴해야합니까? 어떻게 할 수 있습니까? – chaithu

답변

1

편집 (9/21/14) : 저는 HTTP 호출을 통해 Mailman v2 목록의 대부분을 조작하기위한 NuGet 패키지를 방금 출시했습니다. https://www.nuget.org/packages/MailmanSharp/

Mailman 인터페이스는 모두 웹에 있기 때문에 HttpWebRequest를 사용하여 "제어"할 수 있습니다. 나는 최근에 구독자 목록을 검색하고, 구독을 취소하거나 사람들을 구독 취소 할 수있는 작은 응용 프로그램을 작성하고, 보통/노멀/기타와 같은 개별 플래그를 설정합니다. POST에서 어떤 변수를 설정해야하는지, 몇 가지 시행 착오를 확인하려면 Mailman 페이지의 소스에서 약간의 정보가 필요합니다. 임시 Mailman 목록을 설정하는 것이 좋습니다.

대부분의 작업을 수행하려면 다른 HttpWebRequests에 연결할 수있는 영구적 인 CookieContainer가 필요합니다. 첫 번째 호출은 다른 페이지에 대한 액세스를 제공하는 세션 쿠키를 설정하는 관리자 비밀번호가있는 관리 페이지의 POST입니다.

일부 POST는 일반 application/x-www-form-urlencoded 유형이지만 일부는 multipart/form-data입니다. 후자의 경우, 내가 http://www.briangrinstead.com/blog/multipart-form-post-in-c에 매우 도움이 코드를 발견 나는 내 CookieContainer 여기

전달할 수 있도록 변경의 몇했습니다 몇 가지 예제 코드는 다음과 같습니다

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.Text.RegularExpressions; 
using System.Data; 
using System.Threading; 

namespace UpdateListserv 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       File.Delete(_logFilename); 
       Log(String.Format("Starting: {0}", DateTime.Now)); 
       Login(); 
       var roster = GetSubscribers(); 
       Unsubscribe(roster); 
       string members = GetMemberEmails(); 
       Subscribe(members); 
       Unmoderate("[email protected]"); 
       Log("Done"); 
      } 

      catch(Exception e) 
      { 
       Log(e.Message); 
      } 
     } 

     private static void Unmoderate(string email) 
     {     
      Log("Unmoderating " + email); 
      email = email.Replace("@", "%40"); 
      _vars.Clear(); 
      _vars["user"] = email; 
      _vars[email + "_nomail"] = "off"; 
      _vars[email + "_nodupes"] = "on"; 
      _vars[email + "_plain"] = "on"; 
      _vars[email + "_language"] = "en"; 
      _vars["setmemberopts_btn"] = "Submit Your Changes"; 
      FormUpload.MultipartFormDataPost(_adminUrl + _membersPage, "foobar", _vars, _cookies); 
     } 

     private static CookieContainer _cookies = new CookieContainer(); 
     private static string _adminUrl = "http://mylist.com/admin.cgi/listname"; 
     private static string _rosterUrl = "http://mylist.com/roster.cgi/listname"; 
     private static string _pw = "myPassword"; 
     private static string _adminEmail = "[email protected]"; 
     private static Dictionary<string, object> _vars = new Dictionary<string, object>(); 

     private static string _addPage = "/members/add"; 
     private static string _removePage = "/members/remove"; 
     private static string _membersPage = "/members"; 

     private static string _logFilename = "Update Listserv.log"; 

     private static void Log(string message) 
     { 
      Console.WriteLine(message); 
      using (var log = File.AppendText(_logFilename)) 
       log.WriteLine(message); 
     } 


     private static void Subscribe(string members) 
     { 
      // members is a list of email addresses separated by \n 
      Log("Subscribing everyone"); 
      _vars.Clear(); 
      _vars["subscribees"] = members; 
      _vars["subscribe_or_invite"] = 0; 
      _vars["send_welcome_msg_to_this_batch"] = 0; 
      _vars["send_notifications_to_list_owner"] = 0; 
      FormUpload.MultipartFormDataPost(_adminUrl + _addPage, "foobar", _vars, _cookies); 
     } 

     private static string GetMemberEmails() 
     { 
      // This method retrieves a list of emails to be 
      // subscribed from an external source 
      // and returns them as a string with \n in between. 
     } 

     private static void Unsubscribe(string roster) 
     { 
      // roster is a list of email addresses separated by \n 
      Log("Unsubscribing everybody"); 
      _vars.Clear(); 
      _vars["unsubscribees"] = roster; 
      _vars["send_unsub_ack_to_this_batch"] = 0; 
      _vars["send_unsub_notifications_to_list_owner"] = 0; 
      FormUpload.MultipartFormDataPost(_adminUrl + _removePage, "foobar", _vars, _cookies); 
     } 

     private static string GetSubscribers() 
     { 
      // returns a list of email addresses subscribed to the list, 
      // separated by \n 
      Log("Getting subscriber list"); 
      var req = GetWebRequest(_rosterUrl); 
      req.Method = "post"; 
      _vars.Clear(); 
      _vars["roster-email"] = _adminEmail; 
      _vars["roster-pw"] = _pw; 

      var rosterLines = GetResponseString(req).Split('\n').Where(l => l.StartsWith("<li>")); 
      Log(String.Format("Got {0} subscribers", rosterLines.Count())); 

      var roster = new List<string>(); 
      var regex = new Regex("<a.*>(.*)</a>"); 

      foreach (var line in rosterLines) 
      { 
       roster.Add(regex.Match(line).Groups[1].Value.Replace(" at ", "@")); 
      } 

      return String.Join("\n", roster); 
     } 

     private static void Login() 
     { 
      Log("Logging in to list admin panel"); 
      var req = GetWebRequest(_adminUrl); 
      req.Method = "post"; 
      _vars["adminpw"] = _pw; 
      SetPostVars(req); 
      req.GetResponse(); 
     } 

     private static HttpWebRequest GetWebRequest(string url) 
     { 
      var result = HttpWebRequest.Create(url) as HttpWebRequest; 
      result.AllowAutoRedirect = true; 
      result.CookieContainer = _cookies; 
      result.ContentType = "application/x-www-form-urlencoded"; 

      return result; 
     } 

     private static string GetResponseString(HttpWebRequest req) 
     { 
      using (var res = req.GetResponse()) 
      using (var stream = res.GetResponseStream()) 
      using (var sr = new StreamReader(stream)) 
      { 
       return sr.ReadToEnd(); 
      } 
     } 

     private static void SetPostVars(HttpWebRequest req) 
     { 
      var list = _vars.Select(v => String.Format("{0}={1}", v.Key, v.Value)); 

      using (var stream = req.GetRequestStream()) 
      using (var writer = new StreamWriter(stream)) 
      { 
       writer.Write(String.Join("&", list)); 
      } 
     } 
    } 
} 
+0

나는 MailmanSharp를보고 있었고 목록의 가장 일반적인 작업을 수행하는 것으로 보입니다. 하지만이 라이브러리를 사용하여 목록을 만드는 방법을 알 수 없습니다. MailmanSharp로 그걸 할 수있는 방법이 있습니까? – Mike

+0

아니요, 라이브러리가 목록을 만들 수 없습니다. 목록에 대한 웹 인터페이스를 조작하여 작동하므로 인터페이스 (따라서 목록)가 이미 있다고 가정합니다. – asherber

관련 문제