كيف يمكنني إرسال ملف كمرفق بريد إلكتروني باستخدام سطر أوامر Linux؟

StackOverflow https://stackoverflow.com/questions/17359

  •  08-06-2019
  •  | 
  •  

سؤال

لقد قمت بإنشاء برنامج نصي يتم تشغيله كل ليلة على خادم Linux الذي يستخدمه mysqldump لعمل نسخة احتياطية من كل قاعدة من قواعد بيانات MySQL الخاصة بي إلى ملفات .sql وتجميعها معًا كملف .tar مضغوط.الخطوة التالية التي أريد إنجازها هي إرسال ملف tar عبر البريد الإلكتروني إلى خادم بريد إلكتروني بعيد لحفظه.لقد تمكنت من إرسال البرنامج النصي الأولي في النص عبر البريد الإلكتروني عن طريق نقل الملف النصي الاحتياطي إلى mailx مثل ذلك:

$ cat mysqldbbackup.sql | mailx backup@email.com

cat يردد صدى نص ملف النسخ الاحتياطي الذي يتم نقله إلى ملف mailx برنامج مع عنوان البريد الإلكتروني للمستلم الذي تم تمريره كوسيطة.

في حين أن هذا يحقق ما أحتاج إليه، أعتقد أنه يمكن أن يكون خطوة واحدة أفضل، هل هناك أي طريقة، باستخدام برامج شل النصية أو غير ذلك، لإرسال ملف .tar المضغوط إلى رسالة بريد إلكتروني صادرة كملف مرفق? وهذا من شأنه أن يتغلب على الاضطرار إلى التعامل مع رسائل البريد الإلكتروني الطويلة جدًا التي تحتوي على بيانات الرأس وغالبًا ما تحتوي على مشكلات في التفاف الكلمات وما إلى ذلك.

هل كانت مفيدة؟

المحلول

لم يعمل أي من هؤلاء المغفلين معي.كان يعتقد أن عنوان البريد الإلكتروني كان جزءًا من المرفق.كان علي أن أفعل:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com

نصائح أخرى

أو أيها الفاشل:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com

من النظر man mailx, ، لا يحتوي برنامج mailx على خيار لإرفاق ملف.يمكنك استخدام برنامج آخر مثل mutt.

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com

يمكن عرض خيارات سطر الأوامر لـ mutt باستخدام mutt -h.

اعتمادًا على إصدار Linux الخاص بك، قد يُطلق عليه اسم البريد.على حد تعبير @ David أعلاه:

mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

أو أيضًا:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com 

أنا استخدم إمباك.

mpack -s subject file user@example.com

لسوء الحظ، لا يتعرف mpack على "-" كاسم مستعار لـ stdin.لكن العمل التالي يمكن تغليفه بسهولة في اسم مستعار (Shell) أو برنامج نصي:

mpack -s subject /dev/stdin loser@example.com < file

أستخدم SendEmail، الذي تم إنشاؤه لهذا السيناريو.لقد تم تعبئتها خصيصًا لـ Ubuntu لذا أفترض أنها متوفرة

sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip

http://caspian.dotconf.net/menu/Software/SendEmail/

 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com

يمكنك استخدام المغفل لإرسال البريد الإلكتروني مع المرفقات

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

لقد كتبت ذات مرة هذه الوظيفة لـ ksh على Solaris (يستخدم Perl لتشفير base64):

# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
    to="$1"
    cc="$2"
    subject="$3"
    body="$4"
    filename="${5:-''}"
    boundary="_====_blah_====_$(date +%Y%m%d%H%M%S)_====_"
    {
        print -- "To: $to"
        print -- "Cc: $cc"
        print -- "Subject: $subject"
        print -- "Content-Type: multipart/mixed; boundary=\"$boundary\""
        print -- "Mime-Version: 1.0"
        print -- ""
        print -- "This is a multi-part message in MIME format."
        print -- ""
        print -- "--$boundary"
        print -- "Content-Type: text/plain; charset=ISO-8859-1"
        print -- ""
        print -- "$body"
        print -- ""
        if [[ -n "$filename" && -f "$filename" && -r "$filename" ]]; then
            print -- "--$boundary"
            print -- "Content-Transfer-Encoding: base64"
            print -- "Content-Type: application/octet-stream; name=$filename"
            print -- "Content-Disposition: attachment; filename=$filename"
            print -- ""
            print -- "$(perl -MMIME::Base64 -e 'open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))' $filename)"
            print -- ""
        fi
        print -- "--${boundary}--"
    } | /usr/lib/sendmail -oi -t
}

أرسل بريدًا إلكترونيًا نصيًا عاديًا يحتوي على مرفق نص عادي واحد باستخدام mailx:

(
  /usr/bin/uuencode attachfile.txt myattachedfilename.txt; 
  /usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com

يوجد أدناه نفس الأمر المذكور أعلاه، بدون الأسطر الجديدة

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com

تأكد من أن لديك ملف /home/el/attachfile.txt محددة مع هذه المحتويات:

<html><body>
Government discriminates against programmers with cruel/unusual 35 year prison
sentences for making the world's information free, while bankers that pilfer 
trillions in citizens assets through systematic inflation get the nod and 
walk free among us.
</body></html>

إذا لم يكن لديك uuencode، فاقرأ هذا: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

على Linux، أرسل بريدًا إلكترونيًا بتنسيق HTML مع مرفق PDF مع sendmail:

تأكد من تثبيت ksh: yum info ksh

تأكد من تثبيت وتكوين sendmail.

تأكد من تثبيت uuencode وإتاحته: https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

قم بعمل ملف جديد اسمه test.sh ووضعه في الدليل الرئيسي الخاص بك: /home/el

ضع الكود التالي فيه test.sh:

#!/usr/bin/ksh
export MAILFROM="el@defiant.com"
export MAILTO="youremail@gmail.com"
export SUBJECT="Test PDF for Email"
export BODY="/home/el/email_body.htm"
export ATTACH="/home/el/pdf-test.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
export MAILPART_BODY=`uuidgen` ## Generates Unique ID

(
 echo "From: $MAILFROM"
 echo "To: $MAILTO"
 echo "Subject: $SUBJECT"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
 echo ""
 echo "--$MAILPART"
 echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
 echo ""
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/plain; charset=ISO-8859-1"
 echo "You need to enable HTML option for email"
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/html; charset=ISO-8859-1"
 echo "Content-Disposition: inline"
 cat $BODY
 echo "--$MAILPART_BODY--"

 echo "--$MAILPART"
 echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
 echo "Content-Transfer-Encoding: uuencode"
 echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
 echo ""
 uuencode $ATTACH $(basename $ATTACH)
 echo "--$MAILPART--"
) | /usr/sbin/sendmail $MAILTO

قم بتغيير متغيرات التصدير في الجزء العلوي من test.sh لتعكس عنوانك وأسماء الملفات.

قم بتنزيل مستند pdf تجريبي ووضعه فيه /home/el دعا pdf-test.pdf

أنشئ ملفًا باسم /home/el/email_body.htm وضع فيه هذا السطر:

<html><body><b>this is some bold text</b></body></html>

تأكد من أن ملف pdf يحتوي على 755 إذنًا كافيًا.

قم بتشغيل البرنامج النصي ./test.sh

تحقق من صندوق البريد الإلكتروني الخاص بك، حيث يجب أن يكون النص بتنسيق HTML ويتم تفسير ملف pdf تلقائيًا على أنه ملف ثنائي.احرص على عدم استخدام هذه الوظيفة أكثر من 15 مرة في اليوم، على سبيل المثال، حتى لو قمت بإرسال رسائل البريد الإلكتروني إلى نفسك، يمكن لمرشحات البريد العشوائي في Gmail إدراج نطاق يرسل رسائل البريد الإلكتروني في القائمة السوداء دون إعطائك خيار السماح لها بالمرور.وستجد أن هذا لم يعد يعمل، أو أنه يسمح فقط بالمرور عبر المرفق، أو أن البريد الإلكتروني لا يصل على الإطلاق.إذا كان عليك إجراء الكثير من الاختبارات على هذا، فقم بتوزيعها على مدار أيام وإلا سيتم تصنيفك كمرسل بريد عشوائي ولن تعمل هذه الوظيفة بعد الآن.

هناك العديد من الإجابات هنا تقترح mail أو mailx لذلك فهذه مجرد خلفية لمساعدتك في تفسيرها في السياق.

ملاحظات تاريخية

أصول يونكس mail عد إلى ضباب التاريخ المبكر لـ Bell Labs Unix™ (1969؟)، وربما لا يمكننا أن نأمل في الخوض في علم الأنساب الكامل هنا.يكفي أن نقول أن هناك العديد من البرامج التي ترث الكود من أو يعاد تنفيذه (أو ترث الكود من إعادة تنفيذ) mail وأنه لا توجد قاعدة تعليمات برمجية واحدة يمكن تحديدها بشكل لا لبس فيه على أنها "" mail.

ومع ذلك، فمن المؤكد أن أحد المتنافسين على هذا المنصب هو "Berkeley Mail" الذي كان يسمى في الأصل Mail بحرف كبير M في 2BSD (1978)؛ولكن في 3BSD (1979)، تم استبدال الأحرف الصغيرة mail الأمر أيضًا، مما أدى إلى بعض الارتباك الجديد.SVR3 (1986) تضمن مشتقًا كان يسمى mailx.ال x ومن المفترض أنه تمت إضافته لجعله فريدًا ومتميزًا؛ولكن هذا أيضًا قد تم الآن نسخه وإعادة تنفيذه وتشويهه بحيث لا توجد نسخة فردية واحدة نهائية.

مرة أخرى في اليوم، بحكم الأمر الواقع كان المعيار لإرسال الثنائيات عبر البريد الإلكتروني uuencode.لا يزال موجودًا، ولكن به العديد من مشكلات قابلية الاستخدام؛إذا كان ذلك ممكنًا، فيجب عليك إرسال مرفقات MIME بدلاً من ذلك، إلا إذا كنت تسعى على وجه التحديد لتكون قادرًا على التواصل مع أواخر الثمانينيات.

MIME تم تقديمه في أوائل التسعينيات لحل العديد من المشكلات المتعلقة بالبريد الإلكتروني، بما في ذلك دعم أنواع مختلفة من المحتوى بخلاف النص العادي في مجموعة أحرف واحدة والتي تكون مناسبة فقط لمجموعة فرعية من اللغة الإنجليزية (وقيل لنا، لغة هاواي) .أدى ذلك إلى تقديم الدعم للرسائل متعددة الأجزاء، والتدويل، وأنواع المحتوى الغني، وما إلى ذلك، وسرعان ما اكتسب قوة جذب خلال التسعينيات.

(ال الإرث mail/mailx ملاحظات التاريخ كانت مفيدة للغاية عند تأليف هذا، وهي بالتأكيد تستحق القراءة إذا كنت مهتمًا بهذا النوع من الأشياء.)

العروض الحالية

اعتبارًا من عام 2018، لدى دبيان ثلاث حزم تتضمن ملف mail أو mailx يأمر.(يمكنك البحث عن Provides: mailx.)

debian$ aptitude search ~Pmailx
i   bsd-mailx                       - simple mail user agent
p   heirloom-mailx                  - feature-rich BSD mail(1)
p   mailutils                       - GNU mailutils utilities for handling mail

(أنا لا أشير إلى دبيان كتوصية؛هذا ما أستخدمه، لذا فأنا على دراية به؛ويوفر وسيلة للتمييز بين البدائل المختلفة بشكل لا لبس فيه من خلال الإشارة إلى أسماء الحزم الخاصة بها.ومن الواضح أيضًا أنها التوزيعة التي يحصل منها Ubuntu على هذه الحزم.)

  • bsd-mailx هو بسيط نسبيا mailx الذي يفعل لا يبدو أنه يدعم إرسال مرفقات MIME.انظر لها صفحة يدوية ولاحظ أن هذا هو النظام الذي تتوقع العثور عليه على نظام *BSD، بما في ذلك نظام التشغيل MacOS، بشكل افتراضي.
  • heirloom-mailx يتم الآن استدعاؤه s-nail و يفعل دعم إرسال مرفقات MIME مع -a.انظر لها صفحة يدوية وبشكل أعم مشروع الإرث
  • mailutils الملقب ب جنو ميلوتيلز يتضمن أ mail/mailx غلاف التوافق أيّ يفعل دعم إرسال مرفقات MIME مع -A

مع هذه المخاوف، إذا كنت تريد أن تكون التعليمات البرمجية الخاصة بك قابلة للنقل ويمكن أن تعتمد على حزمة معقدة إلى حد ما، فإن الطريقة البسيطة لإرسال مرفقات MIME بشكل قابل للنقل هي يستخدم mutt.

بديل آخر - سواكس (سكين الجيش السويسري لـ SMTP).

swaks -tls \
    --to ${MAIL_TO} \
    --from ${MAIL_FROM} \
    --server ${MAIL_SERVER} \
    --auth LOGIN \
    --auth-user ${MAIL_USER} \
    --auth-password ${MAIL_PASSWORD} \
    --header "Subject: $MAIL_SUBJECT" \
    --header "Content-Type: text/html; charset=UTF-8" \
    --body "$MESSAGE" \
    --attach mysqldbbackup.sql

يحتوي metamail على أداة metasend

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b

إستعملت

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c" 

وهذا يعمل بشكل جيد بالنسبة لي....

mailx لديه -a الخيار الآن للمرفقات.

عادةً ما أستخدم أمر البريد على RHEL فقط.لقد قمت بتجريب mailx وهو فعال جدًا.

mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com

This is the content of my msg.

.

أقصر طريق بالنسبة لي هو

file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address

لذلك على سبيل المثال الخاص بك سوف يكون

file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com

الجزء الجيد هو أنني أستطيع أن أتذكر ذلك السيطرة + ص لإرسال ملف آخر...

من الجهاز المصدر

mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com

على آلة الوجهة.احفظ نص البريد المستلم باسم db.sql.gz.b64;ثم..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf

باستخدام أمر mailx

 echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com

باستخدام سيندميل

#!/bin/ksh

fileToAttach=data.txt

`(echo "To: user@company.com"
  echo "Cc: user@company.com"
  echo "From: Application"
  echo "Subject: your subject"
  echo  your body
  uuencode $fileToAttach $fileToAttach
  )| eval /usr/sbin/sendmail -t `;

فقط لإضافة سنتي، سأكتب نص PHP الخاص بي:

http://php.net/manual/en/function.mail.php

هناك العديد من الطرق للقيام بالمرفق في الأمثلة الموجودة في تلك الصفحة.

ليست طريقة لإرسال البريد الإلكتروني، ولكن يمكنك استخدام خادم Git عبر الإنترنت (على سبيل المثال.Bitbucket أو خدمة مماثلة) لذلك.

بهذه الطريقة، يمكنك استخدام git push الأوامر، وسيتم تخزين جميع الإصدارات بطريقة مضغوطة ومنظمة.

هذه هي الطريقة التي أفعلها مع ملف سجل كبير واحد في CentOS:

MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="`basename "$0"`_`date "+%Y%m%d_%H%M"`"
# Arhiveerime ning kui hästi, saadame edasi:
/bin/tar -zcvf ${LOGDIR}/${LOGNAME}.tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    cd ${LOGDIR}
    # This works too. The message content will be taken from text file below
    # echo 'Hello!' >/root/scripts/audit_check.sh.txt
    # echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    /bin/rm "${LOGDIR}/${LOGNAME}.log"
fi

إذا كان الملف نصيًا، فيمكنك إرساله بسهولة في النص على النحو التالي:

sendmail recipient@example.com < message.txt

Mailutils يجعل هذه قطعة من الكعكة

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
  • -A file يرفق ملف
  • -M يمكّن MIME، بحيث يمكنك الحصول على مرفق ونص عادي.

إذا لم يتم تثبيته بعد، قم بتشغيله

sudo apt install mailutils

شيء آخر عنه mutt:بشكل افتراضي، يستخدم عنوانك واسمك في الحقل "من:".إذا لم يكن هذا هو ما تحتاجه، فيمكنك إنشاء ملف muttrc بديل يحتوي على سلسلة مثل هذه:مجموعة من = "برنامج البريد الخفي الخاص بي"

استخدم هذا الملف مع -F خيار سطر الأوامر.

إذا كان mutt لا يعمل أو لم يتم تثبيته، فجرّب هذا-

*#!/bin/sh

FilePath=$1
FileName=$2
Message=$3
MailList=$4

cd $FilePath

Rec_count=$(wc -l < $FileName)
if [ $Rec_count -gt 0 ]
then
(echo "The attachment contains $Message" ; uuencode $FileName $FileName.csv ) | mailx -s "$Message" $MailList
fi*
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top