মুট্ট ব্যবহার করে মার্কডাউনে লিখিত ইমেল প্রেরণ করুন


21

কখনও কখনও আমাকে গুগল-গ্রুপ ইনলাইনে কোডের একটি টুকরো প্রেরণ করতে হবে। পাঠ্য এখানে সাহায্য করে না; আমি এটিকে মার্কডাউন টাইপ করতে, এটি এইচটিএমএল রূপান্তর করতে পারি (প্যান্ডোক ইত্যাদি ব্যবহার করে), মুট হিসাবে সংযুক্ত করে text/htmlএটি প্রেরণ করতে পারি।

এখানে একটি ভাল সমাধান পাওয়া যায় তবে এটি sendmailইমেল প্রেরণের জন্য বাহ্যিক প্রোগ্রাম ব্যবহার করে । আমি মুট ব্যবহার করছি যা নিজে থেকেই IMAP- এর মাধ্যমে ইমেল প্রেরণের ক্ষমতা রাখে ।


1
কেন কেবল কমান্ড-লাইন মার্কডাউন ফর্ম্যাটার থেকে পাইপ আউটপুট হবে না sendmail?
নাফতুলি কে

হুম .. শেয়ার করা কম্পিউটার! বাহ্যিক সেন্ডমেলের জন্য পাসওয়ার্ড সংরক্ষণ করতে চাই না।
দিলওয়ার

আপনার বর্তমান ফলাফলগুলি গুগল-গোষ্ঠীগুলিতে দেখতে কেমন তার কোনও উদাহরণ আমরা দেখতে পাচ্ছি?
slm

এছাড়াও আপনি মার্কডাউনতে জিনিসগুলি টাইপ করতে চান, তবে আপনার ইমেলগুলিতে সংযুক্ত করার আগে সেগুলি রেন্ডার করা হয়েছে, তাই না?
slm

এটি আপনি যা চাইছেন তা মনে হচ্ছে তবে এটিকে সংশোধন করা দরকার: dgl.cx/2009/03/html-mail-with-mutt- using-markdown । এছাড়াও মার্কডাউনমেল.পি আপনি ব্যবহার করতে পারেন এমন কিছু লাগছিল।
slm

উত্তর:


28

আপনি কোনও বার্তা রচনা করার পরে, তবে প্রেরণের আগে আপনার কাছে প্রচুর বিকল্প উপলব্ধ। ?সেগুলি দেখতে টিপুন ।

কিছু যারা এখানে সহায়তা করতে পারে:

  • F একটি বাহ্যিক প্রসেসরের মাধ্যমে সংযুক্তি ফিল্টার করতে
    • pandoc -s -f markdown -t htmlএইচটিএমএল রূপান্তর করতে ব্যবহার করুন
  • ^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- এ আপনার markdown ফরম্যাট বার্তা রূপান্তর করবে।

আপনি যথাযথ দেখতে দেখতে এই ম্যাক্রোটিকে স্বাভাবিকভাবেই অনুকূলিতকরণ করতে পারেন। ইতিমধ্যে ইতিমধ্যে অন্তর্নির্মিত মুটের অনেকগুলি কী বাঁধাই রয়েছে, তাই আপনি যে কী কী অনুক্রমকে আবদ্ধ করতে বেছে নিচ্ছেন তা নিশ্চিত করুন এটি অন্য কোনও কিছুতে ওভাররাইট না করে (বা এটি আপনি ছাড়া বাঁচতে পারেন)।


বহিরাগত কমান্ডগুলি চালিত হলে বিকল্পটি set wait_key=noমুটের প্রম্পটকে দমন করে Press any key to continue...। যদি wait_keyএটি হয় yes(যা পূর্বনির্ধারিত) তবে আপনাকে টিপতে হবে Esc, তারপরে 5, চালিয়ে যাওয়ার জন্য অন্য কোনও কী।


1
এটি সত্যিই মার্জিত সমাধান! +1
sinisterstuf

5
এটি দুর্দান্ত, তবে এটি মূল ত্রুটি পেয়েছে। এটি ইমেলের প্লেইন টেক্সট অংশটি সরিয়ে দেয় যা ক্লায়েন্টগুলিতে ... মিউট;) পড়ার জন্য এটি স্তন্যপান করে তোলে এইচটিএমএল ইমেলের একটি প্লেটেক্সট এবং এইচটিএমএল উপাদান থাকা উচিত। কাঁচা মার্কডাউনটি প্লেইন টেক্সট হওয়া উচিত, রূপান্তরিত হওয়া উচিত HTML।
মাসুকোমি

1
@ মাসুকিমির সাথে সম্মত হন, সাধারণভাবে ইমেল ক্লায়েন্টরা ইমেলটির এইচটিএমএল এবং পাঠ্য সংস্করণ উভয়ই প্রেরণ করে। এইচটিএমএল সংস্করণ যুক্ত করে মূলটিকে পাঠ্য / সরল হিসাবে ছেড়ে দেয় এমন ম্যাক্রো রাখা ভাল লাগবে।
গোলমরিচ_চিকো

2
শেষ পর্যন্ত আমি এই nosubstance.me/post/mutt-secret-sauce
মরিচ_চিকো

1
@ রাস্তাপোপ্লোস হ্যাঁ: গিথুব.
ডটফিলস

1

মেইল প্রেরণের জন্য সেন্ডমেল প্রায়শই নমনীয় হয় না।

আমি নমনীয় এসএমটিপির জন্য নির্দিষ্ট অ্যাকাউন্টগুলিতে মুটের সাথে একসাথে এমএসএমটিপি ব্যবহার করি।

এটি মুট পরিবর্তনের সাথে ব্যবহার করতে:

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

আমি এটা করতে সক্ষম ছিল। আমি আমার সমাধান সম্পর্কে সম্পূর্ণ খুশি নই তবে এটি যথেষ্ট শালীন। আরও ভাল সমাধান দেওয়ার জন্য অপেক্ষা করছেন।

প্রক্রিয়া অনুসরণ করা হয়। মার্কডাউনটি এইচটিএমএলে রূপান্তর করুন এবং বার্তায় এটি সংযুক্ত করুন। এই সংযুক্তিটি inlineসংযুক্তিতে পরিণত করুন। তবে এখন আমার দুটি সংযুক্তি রয়েছে, প্রথমটি মার্কডাউন এবং দ্বিতীয়টি এইচটিএমএল। খালি স্ট্রিং দিয়ে মার্কডাউন সামগ্রীটি প্রতিস্থাপন করুন যাতে কেবল এইচটিএমএল প্রেরণ করা হয়।

আমি ~/.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

এবং মূল পাইথন ফাইল যা বলা হয় তা নিম্নলিখিত is এটি প্রশ্নের লিঙ্ক থেকে পার্ল স্ক্রিপ্ট থেকে অনুপ্রাণিত।

#!/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- মোড) ব্যবহার করি vim। যদিও, আমি vimপাশাপাশি একজন ব্যবহারকারী। তবে, আমি বেশিরভাগই Emacsঅশুভ-মোডের সাথে ব্যবহার করি ।

আমার মধ্যে .muttrcআমি emacsপরিবর্তে সম্পাদক সেট আপ করেছি vim। নতুন ইমেল লেখার সময় neomuttআগুন জ্বলে emacsওঠে। তারপরে আমি "org- মোড" কল করি, বার্তাটি লিখি এবং আমার যে ফর্ম্যাটটি চাই তা রফতানি করি।

আমি PDFফর্ম্যাটে রফতানি করতে পারি । তারপরে আমি এটি সংরক্ষণ করি এবং PDFফাইলটি আমার মধ্যে সংযুক্ত করি /tmp। এর পরে আমি যাকে পাঠাতে পারি।

আমি যদি htmlফর্ম্যাটটি চাই , আমি এটি একইভাবে রফতানি করি এবং ইমেলটি প্রেরণের আগে আমি স্বয়ংক্রিয়ভাবে আউটপুট দেখতে পারি।

তা ছাড়াও org- মোডে আরও অনেক রফতানি ফর্ম্যাট রয়েছে। শুধু, আপনি যা চান তা চয়ন করুন। অন্যান্য লোকের কাছে কোড প্রেরণের জন্য, আপনি যে ভাষাটি চান সেটিতে কেবল উত্স কোড যুক্ত করুন। Org-wiki এ সমস্ত কিছু ব্যাখ্যা করা আছে ।


0

আপনি multipart/alternativeউভয় সমন্বিত text/plainএবং হিসাবে ইমেলগুলি প্রেরণ করতে পারেন text/html

প্রয়োজনীয়তা: প্যান্ডোক

মূলত এটি মার্কডাউন বার্তা প্লেটেক্সট এবং এইচটিএমএল 5 থেকে তৈরি করে। এই অংশগুলি থেকে সংযুক্তি তৈরি করে, সেগুলিকে ইনলাইন সংযুক্তি হিসাবে চিহ্নিত করে, সঠিক মাইম প্রকার সেট করে এবং মাল্টিপার্ট বার্তায় একত্রিত করে।

রচনা মেনুতে এই ম্যাক্রোটি চালানোর পরে অন্য কোনও সংযুক্তি যুক্ত হওয়ার কথা। Ptionচ্ছিকভাবে সাইন ইন / এনক্রিপ্ট বার্তা চূড়ান্ত পদক্ষেপ হিসাবে করা উচিত

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.