                                  _   _ ____  _
                              ___| | | |  _ \| |
                             / __| | | | |_) | |
                            | (__| |_| |  _ <| |___
                             \___|\___/|_| \_\_____|

MAIL ETIQUETTE

 1. About the lists
  1.1 Mailing Lists
  1.2 Netiquette
  1.3 Do Not Mail a Single Individual
  1.4 Subscription Required
  1.5 Moderation of new posters
  1.6 Handling trolls and spam
  1.7 How to unsubscribe
  1.8 I posted, now what?

 2. Sending mail
  2.1 Reply or New Mail
  2.2 Reply to the List
  2.3 Use a Sensible Subject
  2.4 Do Not Top-Post
  2.5 HTML is not for mails
  2.6 Quoting
  2.7 Digest
  2.8 Please Tell Us How You Solved The Problem!

==============================================================================

1. About the lists

  1.1 Mailing Lists

  The mailing lists we have are all listed and described at
  https://curl.haxx.se/mail/

  Each mailing list is targeted to a specific set of users and subjects,
  please use the one or the ones that suit you the most.

  Each mailing list have hundreds up to thousands of readers, meaning that
  each mail sent will be received and read by a very large amount of people.
  People from various cultures, regions, religions and continents.

  1.2 Netiquette

  Netiquette is a common name for how to behave on the internet. Of course, in
  each particular group and subculture there will be differences in what is
  acceptable and what is considered good manners.

  This document outlines what we in the cURL project considers to be good
  etiquette, and primarily this focus on how to behave on and how to use our
  mailing lists.

  1.3 Do Not Mail a Single Individual

  Many people send one question to one person. One person gets many mails, and
  there is only one person who can give you a reply. The question may be
  something that other people are also wanting to ask. These other people have
  no way to read the reply, but to ask the one person the question. The one
  person consequently gets overloaded with mail.

  If you really want to contact an individual and perhaps pay for his or her
  services, by all means go ahead, but if it's just another curl question,
  take it to a suitable list instead.

  1.4 Subscription Required

  All curl mailing lists require that you are subscribed to allow a mail to go
  through to all the subscribers.

  If you post without being subscribed (or from a different mail address than
  the one you are subscribed with), your mail will simply be silently
  discarded. You have to subscribe first, then post.

  The reason for this unfortunate and strict subscription policy is of course
  to stop spam from pestering the lists.

  1.5 Moderation of new posters

  Several of the curl mailing lists automatically make all posts from new
  subscribers require moderation. This means that after you've subscribed and
  send your first mail to a list, that mail will not be let through to the
  list until a mailing list administrator has verified that it is OK and
  permits it to get posted.

  Once a first post has been made that proves the sender is actually talking
  about curl-related subjects, the moderation "flag" will be switched off and
  future posts will go through without being moderated.

  The reason for this moderation policy is that we do suffer from spammers who
  actually subscribe and send spam to our lists.

  1.6 Handling trolls and spam

  Despite our good intentions and hard work to keep spam off the lists and to
  maintain a friendly and positive atmosphere, there will be times when spam
  and or trolls get through.

  Troll - "someone who posts inflammatory, extraneous, or off-topic messages
  in an online community"

  Spam - "use of electronic messaging systems to send unsolicited bulk
  messages"

  No matter what, we NEVER EVER respond to trolls or spammers on the list. If
  you believe the list admin should do something particular, contact him/her
  off-list. The subject will be taken care of as good as possible to prevent
  repeated offenses, but responding on the list to such messages never lead to
  anything good and only puts the light even more on the offender: which was
  the entire purpose of it getting to the list in the first place.

  Don't feed the trolls!

  1.7 How to unsubscribe

  You unsubscribe the same way you subscribed in the first place. You go to
  the page for the particular mailing list you're subscribed to and you enter
  your email address and password and press the unsubscribe button.

  Also, this information is included in the headers of every mail that is sent
  out to all curl related mailing lists and there's footer in each mail that
  links to the "admin" page on which you can unsubscribe and change other
  options.

  You NEVER EVER email the mailing list requesting someone else to get you off
  the list.

  1.8 I posted, now what?

  If you aren't subscribed with the exact same email address that you used to
  send the email, your post will just be silently discarded.

  If you posted for the first time to the mailing list, you first need to wait
  for an administrator to allow your email to go through. This normally
  happens very quickly but in case we're asleep, you may have to wait a few
  hours.

  Once your email goes through it is sent out to several hundred or even
  thousand recipients.  Your email may cover an area that not that many people
  know about or are interested in. Or possibly the person who knows about it
  is on vacation or under a very heavy work load right now. You have to wait
  for a response and you must not expect to get a response at all, but
  hopefully you get an answer within a couple of days.

  You do yourself and all of us a service when you include as many details as
  possible already in your first email. Mention your operating system and
  environment. Tell us which curl version you're using and tell us what you
  did, what happened and what you expected would happen. Preferably, show us
  what you did in details enough to allow others to help point out the problem
  or repeat the same steps in their places.

  Failing to include details will only delay responses and make people respond
  and ask for the details and you have to send a follow-up email that includes
  them.

  Expect the responses to primarily help YOU debug the issue, or ask you
  questions that can lead you or others towards a solution or explanation to
  whatever you experience.

  If you are a repeat offender to the guidelines outlined in this document,
  chances are that people will ignore you at will and your chances to get
  responses will greatly diminish.


2. Sending mail

  2.1 Reply or New Mail

  Please do not reply to an existing message as a short-cut to post a message
  to the lists.

  Many mail programs and web archivers use information within mails to keep
  them together as "threads", as collections of posts that discuss a certain
  subject. If you don't intend to reply on the same or similar subject, don't
  just hit reply on an existing mail and change subject, create a new mail.

  2.2 Reply to the List

  When replying to a message from the list, make sure that you do "group
  reply" or "reply to all", and not just reply to the author of the single
  mail you reply to.

  We're actively discouraging replying back to the single person by setting
  the Reply-To: field in outgoing mails back to the mailing list address,
  making it harder for people to mail the author only by mistake.

  2.3 Use a Sensible Subject

  Please use a subject of the mail that makes sense and that is related to the
  contents of your mail. It makes it a lot easier to find your mail afterwards
  and it makes it easier to track mail threads and topics.

  2.4 Do Not Top-Post

  If you reply to a message, don't use top-posting. Top-posting is when you
  write the new text at the top of a mail and you insert the previous quoted
  mail conversation below. It forces users to read the mail in a backwards
  order to properly understand it.

  This is why top posting is so bad:

      A: Because it messes up the order in which people normally read
         text.
      Q: Why is top-posting such a bad thing?
      A: Top-posting.
      Q: What is the most annoying thing in e-mail?

  Apart from the screwed up read order (especially when mixed together in a
  thread when someone responds using the mandated bottom-posting style), it
  also makes it impossible to quote only parts of the original mail.

  When you reply to a mail. You let the mail client insert the previous mail
  quoted. Then you put the cursor on the first line of the mail and you move
  down through the mail, deleting all parts of the quotes that don't add
  context for your comments. When you want to add a comment you do so, inline,
  right after the quotes that relate to your comment. Then you continue
  downwards again.

  When most of the quotes have been removed and you've added your own words,
  you're done!

  2.5 HTML is not for mails

  Please switch off those HTML encoded messages. You can mail all those funny
  mails to your friends. We speak plain text mails.

  2.6 Quoting

  Quote as little as possible. Just enough to provide the context you cannot
  leave out. A lengthy description can be found here:

      https://www.netmeister.org/news/learn2quote.html

  2.7 Digest

  We allow subscribers to subscribe to the "digest" version of the mailing
  lists. A digest is a collection of mails lumped together in one single mail.

  Should you decide to reply to a mail sent out as a digest, there are two
  things you MUST consider if you really really cannot subscribe normally
  instead:

  Cut off all mails and chatter that is not related to the mail you want to
  reply to.

  Change the subject name to something sensible and related to the subject,
  preferably even the actual subject of the single mail you wanted to reply to

  2.8 Please Tell Us How You Solved The Problem!

  Many people mail questions to the list, people spend some of their time and
  make an effort in providing good answers to these questions.

  If you are the one who asks, please consider responding once more in case
  one of the hints was what solved your problems. The guys who write answers
  feel good to know that they provided a good answer and that you fixed the
  problem. Far too often, the person who asked the question is never heard of
  again, and we never get to know if he/she is gone because the problem was
  solved or perhaps because the problem was unsolvable!

  Getting the solution posted also helps other users that experience the same
  problem(s). They get to see (possibly in the web archives) that the
  suggested fixes actually has helped at least one person.

