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

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 sent 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 a 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.

