Как подключиться к списку рассылки Mailman с помощью .Net - PullRequest
1 голос
/ 27 февраля 2010

Мне нужно разработать приложение .Net, в котором я должен добавить или удалить пользователя из списка рассылки Mailman. Мой вопрос заключается в том, есть ли какой-либо соединитель .Net или Dll для подключения к списку рассылки Mailman с использованием .Net.

1 Ответ

1 голос
/ 19 июня 2011

Редактировать (21.09.14): Я только что выпустил пакет NuGet для управления большинством аспектов списка Mailman v2 через HTTP-вызовы. https://www.nuget.org/packages/MailmanSharp/

Я не знаю ни одного существующего компонента для этого, но, поскольку интерфейс Mailman находится в Интернете, вы можете «контролировать» его с помощью HttpWebRequest; Недавно я написал небольшое приложение, которое может извлекать список подписчиков, подписывать / отписываться от людей и устанавливать индивидуальные флаги, такие как умеренный / nomail / и т. Д. Требуется немного покопаться в источнике страниц Mailman, чтобы увидеть, какие переменные должны быть установлены в POST, а также проб и ошибок. Я предлагаю настроить список временного почтальона, чтобы поиграть с ним.

Чтобы сделать большую часть этого, вам понадобится постоянный CookieContainer, который вы можете подключить к различным HttpWebRequests; Первый вызов - это POST для страницы администратора с паролем администратора, чтобы установить cookie сеанса, который дает вам доступ к другим страницам.

Некоторые из 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("foo@example.com");
                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 = "foo@example.com";
        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));
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...