mutt를 사용하여 마크 다운으로 작성된 이메일 보내기


21

때로는 Google 그룹 인라인에서 코드 조각을 보내야합니다. 텍스트는 여기서 도움이되지 않습니다. 마크 다운에 입력하고 HTML (pandoc 등을 사용하여)로 변환하고 mutt에 첨부하여 text/html보낼 수 있습니다.

이 가능한 하나 개의 좋은 솔루션으로 여기는 하지만 외부 사용 sendmail보내기 이메일 프로그램을. IMAP을 통해 자체적으로 전자 메일을 보내는 기능이있는 mutt을 사용 하고 있습니다.


1
커맨드 라인 Markdown 포맷터의 출력을 sendmail?
Naftuli Kay

흠 .. 공유 컴퓨터! 외부 sendmail에 비밀번호를 저장하고 싶지 않습니다.
Dilawar

Google 그룹에서 현재 결과가 어떻게 보이는지 확인할 수있는 예가 있습니까?
slm

또한 마크 다운에 항목을 입력하고 싶지만 전자 메일에 첨부하기 전에 렌더링 했습니까?
slm

이것은 당신이 요구하는 것 같지만 수정해야 할 수도 있습니다 : dgl.cx/2009/03/html-mail-with-mutt-using-markdown . 또한 markdownmail.py 는 사용할 수있는 것처럼 들렸습니다.
slm

답변:


28

메시지를 작성한 후, 보내기 전에 많은 옵션을 사용할 수 있습니다. 눌러서 ?봅니다.

여기에 도움이 될만한 것들이 있습니다 :

  • F 외부 프로세서를 통해 첨부 파일을 필터링
    • pandoc -s -f markdown -t htmlHTML로 변환하는 데 사용
  • ^T 첨부 파일 MIME 유형을 편집하려면
    • 에서 text/plain로 변경하십시오 text/html.

이제 한 번에 모든 작업을 수행하는 매크로입니다. 이것을 다음에 추가하십시오 .muttrc.

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

당신이 당신의 메시지 작성을 완료 한 후,이 매크로를 사용하려면하지만 보내기 전에 눌러 Esc다음 5HTML로 인하 형식의 메시지를 변환 할 수 있습니다.

이 매크로를 자연스럽게 사용자 정의 할 수 있습니다. Mutt에는 이미 많은 키 바인딩이 내장되어 있으므로 바인딩하려는 키 시퀀스가 ​​무엇이든 다른 것을 덮어 쓰지 않아야합니다 (또는 당신이없이 살 수있는 것).


이 옵션 은 외부 명령이 실행될 때 set wait_key=noMutt의 Press any key to continue...프롬프트를 표시하지 않습니다. 경우 wait_key입니다 yes당신이 언론에해야합니다 (디폴트) Esc, 다음 5, 다음 다른 키를 계속합니다.


1
이것은 정말 우아한 솔루션입니다! +1
sinisterstuf

5
이것은 좋지만 핵심 결함이 있습니다. 그것은 이메일의 평문 부분을 제거하여 ... mutt;)와 같은 클라이언트에서 읽기가 빨라집니다. HTML 이메일에는 평문과 HTML 구성 요소가 있어야합니다. 원시 마크 다운은 평문이어야하고 변환 된 것은 HTML이어야합니다.
masukomi 2016 년

1
@masukomi에 동의하면 일반적으로 전자 메일 클라이언트는 전자 메일의 HTML 및 텍스트 버전을 모두 보냅니다. HTML 버전을 추가하고 원본을 텍스트 / 일반으로 남겨 두는 매크로를 사용하는 것이 좋습니다.
pepper_chico



1

Sendmail은 종종 메일 전송에 융통성이 없습니다.

유연한 SMTP를 위해 msmtp를 특정 계정에서 mutt과 함께 사용합니다.

음소거 변경과 함께 사용하려면 :

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

# ~/.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

나는 그것을 할 수 있었다. 나는 내 솔루션에 대해 완전히 행복하지는 않지만 충분합니다. 더 나은 솔루션을 제공하기 위해 다른 사람을 기다리는 중입니다.

과정은 다음과 같습니다. 마크 다운을 html로 변환하여 메시지에 첨부하십시오. 이 부착물을 inline부착물로 돌리십시오 . 그러나 이제 두 개의 첨부 파일이 있습니다. 첫 번째는 마크 다운에 있고 두 번째는 html입니다. html 만 전송되도록 마크 다운 컨텐츠를 빈 문자열로 바꾸십시오.

~/.muttrc파일에 다음 줄을 추가했습니다 .

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

다음은 email-editor문제가 게시 된 링크에서 빌린 것입니다.

#!/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

그리고 주요 파이썬 파일은 다음과 같습니다. 이것은 해당 링크의 펄 스크립트에서 영감을 얻은 것입니다.

#!/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)

이것은 내 메일을 형식화 formatter.py하는 데 사용되는 하나 이상의 파이썬 파일에 달려 pandoc있지만 pandoc사용할 수없는 경우 python-markdown2패키지 를 사용할 수 있습니다 . 이 스크립트는 다음과 같습니다.

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

이 파일은 https://github.com/dilawar/mutt 에서도 제공됩니다.


0

을 사용하여 모든 형식의 이메일을 보낼 수 있습니다 neomutt. 나는 Emacs대신 (org-mode)를 사용 vim합니다. 그러나 나는 또한 vim사용자입니다. 그러나 나는 주로 Emacs악의 모드로 사용 합니다.

.muttrc편집기를 emacs대신 설정했습니다 vim. 새 이메일을 작성할 때 neomutt발생 emacs합니다. 그런 다음 "org-mode"를 호출하고 메시지를 작성한 다음 원하는 형식으로 내 보냅니다.

PDF포맷으로 내보낼 수 있습니다 . 그런 다음 PDF파일을 저장하고 내 파일에 첨부합니다 /tmp. 그 후 나는 누구에게나 보낼 수 있습니다.

html형식을 원한다면 같은 방식으로 내보내고 전자 메일을 보내기 전에 출력을 자동으로 볼 수 있습니다.

그 외에도, org-mode에는 다른 많은 내보내기 형식이 있습니다. 원하는 것을 선택하십시오. 다른 사람에게 코드를 보내려면 원하는 언어로 소스 코드를 추가하십시오. 모든 것은 org-wiki에 설명되어 있습니다.


0

당신은으로도 전자 메일을 보낼 수 있습니다 multipart/alternative모두 포함하는 text/plaintext/html.

요구 사항 : pandoc

기본적으로 마크 다운 메시지 일반 텍스트와 html5에서 생성됩니다. 해당 파트에서 첨부 파일을 작성하고 인라인 첨부 파일로 표시하고 올바른 MIME 유형을 설정 한 후 멀티 파트 메시지로 결합합니다.

작성 메뉴에서이 매크로를 실행 한 후 다른 첨부 파일을 추가해야합니다. 선택적으로 서명 / 암호화 메시지는 마지막 단계로 수행해야합니다.

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" 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.