Mutt kullanarak markdown'da yazılan e-postayı gönder


21

Bazen google-grup satır içi kod parçası göndermek gerekir. Metin burada yardımcı olmaz; Ben markdown yazabilir, html (pandoc vb kullanarak) dönüştürmek, mutt olarak eklemek text/htmlve göndermek.

Orada mevcut bir iyi bir çözümdür burada ama dış kullandığı sendmaile-posta göndermek için programı. Kendi başına IMAP üzerinden e-posta gönderme yetenekleri olan mutt kullanıyorum .


1
Neden sadece komut satırı Markdown biçimlendiricisinden çıktı almayı değil sendmail?
Naftuli Kay

Hmm .. paylaşılan bilgisayar! Harici sendmail için şifre saklamak istemiyorum.
Dilawar

Mevcut sonuçlarınızın google-gruplarında neye benzediğini görebileceğimiz herhangi bir örnek var mı?
slm

Ayrıca, işleri markdown'a yazmak istiyorsunuz, ancak bunları e-postalarınıza eklemeden önce oluşturuluyor, değil mi?
slm

Bu, istediğiniz gibi görünür, ancak değiştirilmesi gerekebilir: dgl.cx/2009/03/html-mail-with-mutt-using-markdown . Ayrıca markdownmail.py kullanabileceğiniz bir şey gibi geliyordu.
slm

Yanıtlar:


28

Bir ileti oluşturduktan sonra, ancak göndermeden önce kullanabileceğiniz birçok seçenek vardır. ?Görüntülemek için tuşuna basın .

Burada yardımcı olabilecek bazıları:

  • F eki harici bir işlemci üzerinden filtrelemek için
    • pandoc -s -f markdown -t htmlHTML'ye dönüştürmek için kullanın
  • ^T ek MIME türünü düzenlemek için
    • Konumundan olarak text/plaindeğiştirin text/html.

Şimdi her şeyi tek adımda yapacak bir makro. Bunu şu adrese ekleyin .muttrc:

macro compose \e5 "F pandoc -s -f markdown -t html \ny^T^Utext/html; charset=us-ascii\n"
set wait_key=no

Eğer Mesajı hazırladığınızda sonra, bu makro kullanmak için ancak göndermeden önce basın Escsonra 5HTML içine markdown biçimlendirilmiş mesajı dönüştürmek.

Bu makroyu uygun gördüğünüzde doğal olarak özelleştirebilirsiniz. Mutt zaten yerleşik birçok anahtar bağlamaya sahiptir, bu nedenle bağlamayı seçtiğiniz anahtar dizisi ne olursa olsun, başka bir şeyin üzerine yazmadığından emin olun (veya onsuz yaşayabileceğiniz bir şey).


Harici komutlar çalıştırıldığında seçenek set wait_key=noMutt'un Press any key to continue...istemini bastırır . Eğer wait_keybir yessen basına gerekecek (varsayılan) Esc, daha sonra 5, o zaman herhangi bir tuşa devam etmek.


1
Bu gerçekten zarif bir çözüm! +1
sinisterstuf

5
bu güzel, ama çekirdek kusuru var. e-postanın düz metin kısmını ortadan kaldırır, bu da istemcilerin okumasını emer ... mutt;) HTML e-postalarında düz metin ve html bileşeni olmalıdır. ham işaretleme düz metin, dönüştürülen HTML olmalıdır.
masukomi

1
@Masukomi ile anlaşın, e-posta istemcileri genel olarak e-postanın hem html hem de metin sürümlerini gönderir. Html sürümünü ekleyen ve orijinali metin / düz olarak bırakan bir makroya sahip olmak güzel olurdu.
pepper_chico



1

Sendmail genellikle e-posta göndermek için esnek değildir.

Esnek SMTP için belirli hesaplarda mutm ile birlikte msmtp kullanıyorum.

Mutt değişikliği ile kullanmak için:

# ~/.muttrc  
set sendmail="/usr/bin/msmtp -a default"   

ve

# ~/.msmtprc  
defaults
tls off
logfile ~/.msmtp.log  
account default   
host your.smtp.host  
port 25  
from your-user-name@your-host.com  
auth off  
user username  
password password  

0

Yapabildim. Çözümümden tamamen memnun değilim ama yeterince iyi. Başka birinin daha iyi bir çözüm sunmasını bekliyorum.

İşlem takip ediyor. İşaretlemeyi html'ye dönüştürün ve mesaja ekleyin. Bu eki eke çevirin inline. Ama şimdi iki ekim var, ilk olarak işaretleme ve ikincisi html. Yalnızca html gönderilecek şekilde işaretleme içeriğini boş dize ile değiştirin.

Aşağıdaki satırı ~/.muttrcdosyaya ekledim .

macro compose B ":set editor=text2mime-markdown.py<enter>E:set editor=email-editor<enter>Da/tmp/html-markdown-alternative.html<enter>^Du"

İşte söz email-editorkonusu yayınlanan bağlantıdan ödünç alınan.

#!/bin/sh
if grep -q In-Reply-To $1; then
  # Jump to first line of message
  exec vim -c 'norm }j' $1
else
  # Enter insert mode on the To: line
  exec vim  $1
fi

Ve çağrılan ana python dosyası aşağıdadır. Bu, söz konusu bağlantıdan perl betiğinden esinlenmiştir.

#!/usr/bin/env python
import os
import sys
from formatter import *
version = "0.1"

file = sys.argv[1]
new_file = "/tmp/html-markdown-alternative.html"
with open(file, "r") as f:
    text = f.read()

lines = text.split('\n')
header = []
body = []
headerStart = True
for l in lines:
    if headerStart:
        m = re.search(r'^[\w\-]+\:', l)
        if m:
            header.append(l)
        else:
            headerStart = False
            body.append(l)
    else:
        body.append(l)

header = '\n'.join(header)
body = '\n'.join(body)

htmlBody = markdownToHtml(body);

html = []
html.append('<html>')
html.append('<head>')
html.append('<meta name=\"generator\" content=\"text2mime-markdown{}\">'.format(version))
html.append('<style>')
html.append("code { font-family: 'Andale Mono', 'Lucida Console', \
        'Bitstream Vera Sans Mono', 'Courier New', monospace; }")
html.append('pre { border-left: 20px solid #ddd; margin-left: 10px; \
        padding-left: 5px; }')
html.append('</style>')
html.append('</head>')
html.append('<body>')
html.append('{0}'.format(body))
html.append('</body>')
html.append('</html>')
html = '\n'.join(html)

with open(new_file, "w") as newF:
    newF.write(html)

with open(file, 'w') as f:
    f.write(header)

Bu adlandırılan bir daha piton dosyasına bağlıdır formatter.pykullandığı pandocPostamı biçimlendirmek ama eğer pandocmevcut değildir, kullanabileceği python-markdown2paketi. Bu script takip ediyor.

import subprocess
import re
import os 
import sys
import html2text 
import collections

# check if pandoc exists
panDoc = True
try:
    subprocess.call(["pandoc", '--version']
            , stdout=subprocess.PIPE
            , stdin=subprocess.PIPE
            )
except OSError:
    panDoc = False

if not panDoc:
    import text.html2text as html2text
    import markdown 

def decodeText(text):
    return text.decode('utf-8')

def markdownToHtml(content, convertor='pandoc'):
    global panDoc
    if panDoc:
        cmd = ["pandoc", "-f", "markdown", "-t", "html"]
        p = subprocess.Popen(cmd
                , stdin = subprocess.PIPE
                , stdout = subprocess.PIPE
                )
        p.stdin.write(content)
        content = p.communicate()[0]
        return decodeText(content)
    else:
        return markdown.markdown(decodeText(content))


def htmlToMarkdown(content, convertor='pandoc'):
    global panDoc
    if panDoc and convertor == 'pandoc':
        cmd = ["pandoc", "-t", "markdown", "-f", "html"]
        p = subprocess.Popen(cmd
                , stdin = subprocess.PIPE
                , stdout = subprocess.PIPE
                )
        p.stdin.write(content)
        content = p.communicate()[0]
        return decodeText(content)
    # Use markdown package to convert markdown to html
    else:
        h = html2text.HTML2Text()
        content = h.handle(decodeText(content))
        return content

def titleToBlogDir(title):
    if title is None:
        return ''
    if len(title.strip()) == 0:
        return ''
    blogDir = title.replace(" ","_").replace(':', '-').replace('(', '')
    blogDir = blogDir.replace('/', '').replace('\\', '').replace('`', '')
    blogDir = blogDir.replace(')', '').replace("'", '').replace('"', '')
    return blogDir

def titleToFilePath(title, blogDir):
    if len(blogDir.strip()) == 0:
        return ''
    fileName = os.path.join(blogDir, titleToBlogDir(title))
    return fileName


def htmlToHtml(html):
    return decodeText(html)

def metadataDict(txt):
    mdict = collections.defaultdict(list)
    md = getMetadata(txt)
    for c in ["title", 'type', "layout", "status", "id", "published", "category", "tag"]:
        pat = re.compile(r'{0}\:\s*(?P<name>.+)'.format(c), re.IGNORECASE)
        m = pat.findall(txt)
        for i in m:
            mdict[c].append(i)
    return mdict

def getMetadata(txt):
   """
   Get metadata out of a txt
   """
   if not "---" in txt:
       print txt
       sys.exit(1)

   pat = re.compile(r'\-\-\-+(?P<metadata>.+?)\-\-\-+', re.DOTALL)
   m = pat.search(txt)
   if m:
       return m.group('metadata')
   else:
       sys.exit(0)

def getContent(txt):
    """ 
    Return only text of the post.
    """
    pat = re.compile(r'\-\-\-+(?P<metadata>.+?)\-\-\-+', re.DOTALL)
    return re.sub(pat, "", txt)

def readInputFile(fileName):
    """
    read file and return its format. html or markdown
    """
    assert fileName
    if not os.path.exists(fileName):
        raise IOError, "File %s does not exists" % fileName

    # Check the fmt of file.
    fmt = os.path.splitext(fileName)[1].lower()
    if fmt in ["htm", "html", "xhtml"]:
        fmt = "html"
    elif fmt in ["md", "markdown"]:
        fmt = "markdown"
    else:
        fmt = "markdown"
    txt = open(fileName, 'r').read()   
    return (fmt, txt)

def formatContent(txt, fmt):
    """
    Format the content as per fmt.
    """
    content = getContent(txt)
    if fmt == "html":
        content = htmlToHtml(content)
    elif fmt == "markdown":
        content = markdownToHtml(content)
    else:
        content = markdownToHtml(content)
    return content

Bu dosyalara da buradan ulaşabilirsiniz https://github.com/dilawar/mutt


0

Kullanarak herhangi bir biçimde e-posta gönderebilirim neomutt. Bunun yerine sadece Emacs(org-mode) kullanıyorum vim. Ben de bir vimkullanıcıyım. Ama çoğunlukla Emacskötü modla kullanıyorum.

Benim .muttrciçin emacsbunun yerine editör ayarladım vim. Yeni bir e-posta yazarken neomutttetiklenir emacs. Sonra "org-mode" diyorum, mesajı yazıyorum ve istediğim formatta veriyorum.

PDFBiçime dışa aktarabilirim . Sonra onu kaydedip PDFdosyayı dosyama ekliyorum /tmp. Ondan sonra kime gönderebilirim.

htmlBiçimi istiyorsam , bunu aynı şekilde dışa aktarırım ve e-postayı göndermeden önce çıktıyı otomatik olarak görebilirim.

Bunun dışında kuruluş modunda başka birçok dışa aktarma biçimi de var. Sadece ne istediğinizi seçin. Başkalarına kod göndermek için, kaynak kodu istediğiniz dile ekleyin. Her şey org-wiki'de açıklanıyor .


0

E-postaları multipart/alternativehem text/plainve hem de içeren olarak gönderebilirsiniz text/html.

Gereksinimler: pandoc

Temel olarak işaretleme mesajı düz metin ve html5 oluşturur. Bu parçalardan ekler oluşturur, bunları satır içi ekler olarak işaretler, doğru mime tipini ayarlar ve bunları birden fazla iletide birleştirir.

Bu makroyu oluşturma menüsünde çalıştırdıktan sonra diğer tüm eklerin eklenmesi gerekir. İsteğe bağlı olarak mesaj imzalama / şifreleme son adım olarak yapılmalıdır.

macro compose ,m \
"<enter-command>set pipe_decode<enter>\
<pipe-message>pandoc -f gfm -t plain -o /tmp/msg.txt<enter>\
<pipe-message>pandoc -s -f gfm -t html5 -o /tmp/msg.html<enter>\
<enter-command>unset pipe_decode<enter>a^U/tmp/msg.txt\n^Da^U/tmp/msg.html\n^D^T^Utext/html; charset=utf-8\n=DTT&d^U\n" \
"Convert markdown gfm to HTML and plain" 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.