Linux 쉘 스크립트에서 메일 보내기


120

Linux Shell 스크립트에서 이메일을 보내고 싶습니다. 이 작업을 수행하는 표준 명령은 무엇이며 특수 서버 이름을 설정해야합니까?


8
수퍼 유저 [ superuser.com ] 또는 더 나은 방법은 Unix 및 Linux SE [ unix.stackexchange.com ]에 문의하십시오 .
Dan Molding 2011 년

답변:


119

서버가 잘 구성되어있는 경우 (예 : MTA가 실행중인 경우) mail 명령을 사용할 수 있습니다.

예를 들어, 파일의 내용을 보내려면 다음과 같이 할 수 있습니다.

$ cat /path/to/file | mail -s "your subject" your@email.com

man mail 상세 사항은.


7
여기서 'mta'는 무엇을 의미합니까? 전체 이름이나 링크가 있습니까? 초보자로서 그것이 제가 알고 싶은 것입니다. 나는 그것을 할 경험이 부족합니다.

5
@Zen MTA는 메일 전송 에이전트를 나타냅니다. 후위, 센드 메일, 큐메일 등
프란체스코 Laurita

대부분의 경우 @Zen은 MTA를 SMTP 또는 IMAP 서버를 의미하는 것으로 간주 할 수 있습니다.
user151841 2015 년

1
당신이하지 않은 경우 확인 방법 설치 / 구성하고 우분투에있어합니다 : sudo apt-get install mailutils선택 인터넷 사이트를 : 메일은 SMTP를 사용해 직접 보내고 받게됩니다. .
user1717828

86

당신이 bash는 깨끗하고 간단한 방법을 원하고, 당신이 사용하지 않을 경우 cat, echo등, 가장 간단한 방법은 다음과 같습니다

mail -s "subject here" email@address.com <<< "message"

<<<표준 입력을 리디렉션하는 데 사용됩니다. 오랫동안 bash의 일부였습니다.


6
echo -e "일부 \ n 여러 줄 및 탭 \ t 메시지"| mail -s "제목"your@email.com
Pipo

cat << END...END | mail -s "subject" test@example.com
ulidtko

헤이, 이것은 나를 위해 잘 작동했습니다, 감사합니다! 배송 할 주소를 여러 개 지정하려면 어떻게해야합니까?
E.Owen

1
@ E.Owen -t 옵션을 사용하여 공백으로 구분 된 여러 주소로 보낼 수 있습니다
Jon

25

exim과 ssmtp가 모두 실행 중이면 문제가 발생할 수 있습니다. 따라서 간단한 MTA를 실행하고 간단한 smtp 클라이언트로 insistance에 대한 전자 메일 알림을 보내려면 exim 또는 postfix 와 같이 최종적으로 사전 설치된 MTA를 제거해야합니다. 먼저 먼저 제거하고 ssmtp를 다시 설치해야합니다.

그런 다음 2 개의 파일 (revaliases 및 ssmtp.conf) 만 구성하는 것은 매우 간단합니다.-ssmtp doc-를 참조하십시오. bash 또는 bourne 스크립트의 사용법은 다음과 같습니다.

#!/bin/sh  
SUBJECT=$1  
RECEIVER=$2  
TEXT=$3  

SERVER_NAME=$HOSTNAME  
SENDER=$(whoami)  
USER="noreply"

[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"  
[[ -z $2 ]] && RECEIVER="another_configured_email_address"   
[[ -z $3 ]] && TEXT="no text content"  

MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"  
echo -e $MAIL_TXT | sendmail -t  
exit $?  

방화벽 출력을 smtp 포트 (25)로 여는 것을 잊지 마십시오.


이 스크립트에서 포트 번호를 어디에서 변경할 수 있습니까? 내 서버에서 smtp 포트는 8181 이상에서 작동합니다.
manix

나는이 쉘에서 이것을하지 않을 것이다. 그렇지 않으면 조만간 갇히게 될 것이다. 구성 파일에서 할 수 있습니다. unix.stackexchange.com/a/132731
hornetbzz

1
간단한 에코 $ MAIL_TXT를 만들면 왜 줄 바꿈이 발생합니까?
KernelPanic 2014

1
@Marko : Pls는이 -e 옵션 남자 에코를 참조하십시오 백 슬래시 이스케이프의 해석 가능
hornetbzz

죄송합니다. -e 매개 변수를 잘못 입력했습니다
KernelPanic 2014

10

bash 스크립트의 또 다른 옵션 :

mailbody="Testmail via bash script"
echo "From: info@myserver.test" > /tmp/mailtest
echo "To: john@mywebsite.test" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • /tmp/mailtest이 스크립트를 사용할 때마다 파일 을 덮어 씁니다.
  • sendmail의 위치는 시스템마다 다를 수 있습니다.
  • cron 스크립트에서 이것을 사용할 때 sendmail 명령에 절대 경로를 사용해야합니다.

1
둘 이상의 프로세스가 동시에 스크립트를 호출 할 수 있기 때문에 거부되었습니다. 이로 인해 손상되거나 잘못된 tmp 파일이 발생할 수 있습니다. 또한 / tmp 파일은이 파일을 사용할 때마다 덮어 쓰지 않습니다. 실제로 내부에 모든 이전 이메일을 포함하는 각 이메일과 함께 커집니다. 안좋다.
Taterhead

1
/ tmp / mailtest에 대한 첫 번째 쓰기는 덮어 쓰기이므로 이전에 있던 내용을 제거합니다. 그래도이 방법은 설명한 다른 이유로 이상적이지 않습니다.
Simon

8

일반적으로 mail명령을 사용하여 로컬 MTA를 사용하여 메시지를 보낼 수 있습니다 (SMTP를 사용하여 대상에 메시지를 전달하거나 ISP와 같은 더 강력한 SMTP 서버로 전달). 로컬 MTA가없는 경우 (유닉스 계열 시스템에서이를 생략하는 것은 약간 드문 경우지만) ssmtp 와 같은 최소한의 MTA를 사용할 수 있습니다 .

ssmtp구성하기가 매우 쉽습니다. 기본적으로 공급자의 SMTP 서버가 어디에 있는지 지정하기 만하면됩니다.

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail

또 다른 옵션은 SMTP 서버에 직접 연결하고 Smtp-Auth-Email-Script , smtp-cli , SendEmail 등과 같은 메시지를 게시하는 수많은 스크립트 중 하나를 사용하는 것입니다 .


"ssmtp"가 컴퓨터에 설치되어있어서 시도해 볼 수 없었지만 어쨌든 감사합니다
appshare.co

5

일부 smtp 서버를 사용하고 싶다면 다음을 수행 할 수 있습니다.

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

변경 somehost, someportsomeaccount@somedomain실제 값에 당신이 사용할 것. 이 예에서는 암호화 및 인증이 수행되지 않습니다.


만약 무엇을해야하는 mailx설치되어 있지?
nalply

2

mail명령 (누가 ;-) 짐작했을 것이라고한다. 쉘을 열고 입력 man mail하여 사용 mail가능한 모든 옵션 에 대한 명령에 대한 매뉴얼 페이지를 가져 오십시오 .


2
나는 그렇게했지만 사용할 서버를 지정하는 옵션이 없습니다
appshare.co 2011 년

1
이는 로컬 메일 전송 에이전트 구성의 일부입니다 (예 : Sendmail 또는 Postfix).
DarkDust 2011 년

2

MTA도 필요하지 않습니다. SMTP 프로토콜은 SMTP 서버에 직접 쓸 수있을만큼 간단합니다. OpenSSL 패키지가 설치된 경우 SSL / TLS를 통해 통신 할 수도 있습니다. 이 게시물 확인 : https://33hops.com/send-email-from-bash-shell.html

위의 내용은 바로 사용할 수있는 텍스트 / html 이메일을 보내는 방법에 대한 예입니다. 첨부 파일을 추가하려는 경우 작업이 좀 더 복잡해질 수 있습니다. 바이너리 파일을 base64로 인코딩하고 경계 사이에 삽입해야합니다. 이것은 조사를 시작하기에 좋은 곳입니다 : http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

Linux에서는 메일 유틸리티를 사용하여 "-a"옵션으로 첨부 파일을 보낼 수 있습니다. 옵션에 대해 읽으려면 man 페이지를 살펴보십시오. 예를 들어 다음 코드는 첨부 파일을 보냅니다.

mail -s "THIS IS SUBJECT"-a attachment.txt name@domain.com <<< "Hi Buddy, Please find failure reports."


SO에 오신 것을 환영합니다. 답변을 게시 해 주셔서 감사합니다. 좋은 답변을 작성하는 방법에 대한 정보를 읽고 그에 따라 수정하십시오. 즐기세요 ;-)
ZF007

2

LINUX에서 Gmail로 메일 보내기

POSTFIX 사용

1 : 소프트웨어 설치

Debian 및 Ubuntu :

apt-get update && apt-get install postfix mailutils

OpenSUSE :

zypper update && zypper install postfix mailx cyrus-sasl

페도라 :

dnf update && dnf install postfix mailx

CentOS :

yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain

아치 리눅스 :

pacman -Sy postfix mailutils

FreeBSD :

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

구성에서 SASL 지원 선택

make install clean

pkg install mailx

2. Gmail 구성

/ etc / postfix. 암호 파일을 만들거나 편집합니다.

vim /etc/postfix/sasl_passwd

vim u를 사용하는 im은 nano, cat .....과 같은 파일 편집기를 사용할 수 있습니다.

> Ubuntu, Fedora, CentOS, Debian, OpenSUSE, Arch Linux :

이거 추가 해봐

여기서 user replace with your mailname and password is your gmail password

[smtp.gmail.com]:587    user@gmail.com:password

파일을 저장하고 닫은 다음 루트로만 액세스 할 수 있도록합니다. 비밀번호가 포함 된 민감한 콘텐츠 이기 때문입니다.

chmod 600 /usr/local/etc/postfix/sasl_passwd

> FreeBSD :

/ usr / local / etc / postfix 디렉토리.

vim /usr/local/etc/postfix/sasl_passwd

다음 행을 추가하십시오.

[smtp.gmail.com]:587    user@gmail.com:password

저장하고 루트로만 액세스 할 수 있도록합니다.

chmod 600 /usr/local/etc/postfix/sasl_passwd

3. Postfix 구성

구성 파일 main.cf

Postfix에서 설정해야하는 6 가지 매개 변수

Ubuntu, Arch Linux, Debian :

편집하다

 vim /etc/postfix/main.cf

다음 값을 수정하십시오.

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_security_optionsGmail과 호환되지 않는 보안 옵션 이 사용 되지 않도록 구성 에서 empty설정 됩니다.

저장하고 닫습니다

처럼

OpenSUSE :

vim /etc/postfix/main.cf

수정

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem

또한 master.cf 파일의 구성이 필요합니다.

수정 :

vim /etc/postfix/master.cf

이 줄의 주석을 제거하여 (# 제거)

#tlsmgr unix - - n 1000? 1 tlsmg

저장하고 닫습니다

Fedora, CentOS :

vim /etc/postfix/main.cf

수정

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

FreeBSD :

vim /usr/local/etc/postfix/main.cf

수정 :

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem

이것을 저장하고 닫습니다

4. 프로세스 암호 파일 :

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian :

postmap /etc/postfix/sasl_passwd

대한 FreeBSD의

postmap /usr/local/etc/postfix/sasl_passwd

4.1) 접미사 다시 시작

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian :

systemctl restart postfix.service

대한 FreeBSD의 :

service postfix onestart
nano /etc/rc.conf

더하다

postfix_enable=YES

저장 후 실행하여 시작

service postfix start

5. 아래 링크의 도움말을 사용 하여 Gmail에서 "보안 수준이 낮은 앱"을 활성화 합니다.

https://support.google.com/accounts/answer/6010255

6. 테스트 이메일 보내기

mail -s "subject" recever@domain.com

엔터 키를 치시오

당신의 소원으로 메일의 본문을 추가 Enter 키를 누릅니다 다음을 누릅니다 CTRL + D를 적절한 종료를

작동하지 않는 경우 모든 단계를 다시 확인하고 Gmail에서 "보안 수준이 낮은 앱" 을 활성화했는지 확인 하십시오.

u가 수정하면 postfix를 다시 시작하십시오.

셸 스크립트의 경우 .sh 파일을 만들고 요구 사항으로 6 단계 명령을 추가합니다.

예를 들어 단지 샘플

#!/bin/bash
REALVALUE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=80

if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' mailid@domainname.com << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi

이 스크립트는 디스크 사용량이 THRESHOLD 변수에 지정된 백분율 (여기서는 80 %) 이상으로 증가하면 이메일을 보냅니다.


이 답변의 이름이 "SEND MAIL FROM LINUX TO recever@domain.com VIA GMAIL"이어야하지 않습니까?
Cameron Hudson

1

'email'또는 'emailx'명령을 사용할 수 있습니다.

(1) $ vim /etc/mail.rc # 또는 # vim /etc/nail.rc

set from = xxx@xxx.com #
set smtp = smtp.exmail.gmail.com #gmail's smtp server 
set smtp-auth-user = xxx@xxx.com #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login

승인 된 계정에서 전송되지 않으면 이메일이 정크 메일 목록으로 이동하기 때문입니다.

(2) $ echo "Pls는 사용하지 않는 주제를 제거하는 것을 잊지 마십시오!" | mail -s "waste topic"-a a.txt developer@xxx.com #send to group user 'developer@xxxx.com'

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