كيف يمكنني إرسال ملف كمرفق بريد إلكتروني باستخدام سطر أوامر Linux؟
-
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
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*