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

다른 팁

또는 실패한 mutt:

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을 사용합니다.

mpack -s subject file user@example.com

불행히도 mpack은 '-'를 stdin의 별칭으로 인식하지 않습니다.그러나 다음 작업은 (셸) 별칭이나 스크립트로 쉽게 래핑될 수 있습니다.

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

나는 한때 Solaris에서 ksh에 대해 이 함수를 작성한 적이 있습니다(base64 인코딩에 Perl을 사용함):

# 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에서는 sendmail을 사용하여 PDF 첨부 파일이 포함된 HTML 본문 이메일을 보냅니다.

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 그리고 "the"로 명확하게 식별될 수 있는 단일 코드 베이스는 없습니다. mail.

그러나 그 자리에 대한 경쟁자 중 하나는 확실히 원래 이름이 "Berkeley Mail"이었습니다. Mail 2BSD(1978)에서는 대문자 M을 사용합니다.그러나 3BSD(1979)에서는 소문자를 대체했습니다. mail 명령도 추가되어 새로운 혼란을 야기합니다.SVR3(1986)에는 다음과 같은 파생물이 포함되어 있습니다. mailx.그만큼 x 아마도 독특하고 뚜렷하게 만들기 위해 추가되었을 것입니다.그러나 이 역시 이제 복사되고, 재구현되고, 훼손되어 확정적인 단일 버전이 없습니다.

옛날에는 사실상 전자 메일을 통해 바이너리를 보내는 표준은 uuencode.여전히 존재하지만 사용성 문제가 많이 있습니다.가능하다면 1980년대 후반과 통신할 수 있도록 특별히 노력하지 않는 한 MIME 첨부 파일을 대신 보내야 합니다.

몸짓 광대극 1990년대 초반에 영어의 하위 집합(하와이어)에만 적합한 단일 문자 집합의 일반 텍스트 이외의 다양한 콘텐츠 유형에 대한 지원을 포함하여 이메일의 여러 문제를 해결하기 위해 도입되었습니다. .이는 다중 부분 메시지, 국제화, 풍부한 콘텐츠 유형 등에 대한 지원을 도입했으며 1990년대 전반에 걸쳐 빠르게 인기를 얻었습니다.

(그만큼 법정 상속 동산 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 첨부 파일 전송을 지원하는 것으로 보입니다.그것을 참조하십시오 매뉴얼 페이지 그리고 이것은 기본적으로 MacOS를 포함한 *BSD 시스템에서 찾을 수 있을 것으로 예상되는 것입니다.
  • heirloom-mailx 지금 호출되고 있습니다 s-nail 그리고 하다 MIME 첨부 파일 전송 지원 -a.그것을 참조하십시오 매뉴얼 페이지 그리고 더 일반적으로 가보 프로젝트
  • mailutils 일명 GNU 메일 유틸리티 포함 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

메타메일에는 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에서만 mail 명령을 사용합니다.나는 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

좋은 점은 내가 그것을 기억할 수 있다는 것입니다 Ctrl+R 다른 파일을 보내려고...

소스 머신에서

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 `;

2센트만 추가하면 나만의 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