>  기사  >  백엔드 개발  >  php 첨부파일과 함께 이메일 보내기

php 첨부파일과 함께 이메일 보내기

高洛峰
高洛峰원래의
2016-12-02 11:51:441722검색

'웹사이트에서 보낸 계약서가 있는데 양식을 통해 보낸 이메일에 어떻게 첨부파일을 추가하나요?'라는 질문을 자주 듣습니다.   

가장 먼저 말씀드리고 싶은 것은 이를 수행하는 쉬운 방법은 없습니다.

PHP나 기타 서버측 스크립트 언어에 대한 이해가 필요합니다.

물론 실제로 PHP를 지원하는 웹사이트의 계정도 필요합니다.

이 전제 조건이 충족되면 이 장을 읽은 후 PHP를 사용하여 첨부 파일이 포함된 이메일을 보낼 수 있습니다.

1. 첨부 파일 작동 방식

PHP 매뉴얼에서 "attachment" 기능을 검색해 본 적이 있다면 결과가 아무것도 아닐 수도 있습니다(적어도 이 글을 쓰는 시점에서는) 아니요).

나중에 이 지식을 이해하려면 많은 시간을 소비해야 합니다.

다른 사람에게 첨부 파일이 포함된 이메일을 보내면 첨부 파일이 이메일과 함께 수신자의 사서함에 저장된다고 생각할 수도 있습니다. 그녀의 편지함에는 txt 파일(이메일)과 .png 파일(첨부 파일)이 포함되어 있습니다. 그러나 이는 작동 방식이 아닙니다.

첨부 파일을 추가하면 이메일 프로그램이 첨부 파일을 일반 텍스트 파일로 변환합니다. 작성한 내용(실제 이메일) 뒤에 이 텍스트 블록을 삽입합니다. 모든 내용을 보낼 때 수신자의 편지함에는 아무 것도 남지 않습니다. 일반 텍스트 파일 - 첨부 파일과 실제 이메일 내용이 모두 포함된 파일

다음은 첨부 파일(HTML 파일)이 포함된 이메일의 예입니다.

반환 경로: 날짜: Mon, 22 May 2000 19:17:29 +0000 보낸 사람: 받는 사람: 사람 메시지 ID: <83729KI93LI9214@example.com> 콘텐츠 유형: multipart/mixed;boundary="396d983d6b89a" 제목: 제목 - -396d983d6b89a 콘텐츠 유형: text/plain; transfer-encoding: 8bit 이메일 본문입니다. --396d983d6b89a Content-type: text/html; name=attachment.html Content- disposition: filename=attachment.html Content-transfer-encoding: 8bit 첨부된 HTML 파일 --396d983d6b89a--  

처음 7줄은 이메일의 헤더이며, 그 중 Content-type Header 부분은 메일 프로그램에 이메일이 구성되어 있음을 알려줍니다. 둘 이상의 부분: 메시지 자체. 첨부 파일이 있는 이메일은 일반적으로 메시지와 첨부 파일의 두 부분으로 구성됩니다. 🎜>이렇게 하면 두 개의 첨부 파일이 있는 이메일은 메시지, 첫 번째 첨부 파일의 세 부분으로 구성됩니다. , 두 번째 첨부 파일입니다.

첨부 파일이 있는 이메일의 여러 부분은 구분선

구분선은 Content--type 헤더에 정의되어 있습니다. 메시지의 각 새 섹션은 두 개의 하이픈(--)과 구분선으로 시작됩니다. 또한 마지막 구분선 뒤에 두 개의 하이픈이 있는데, 이는 이메일에 다른 부분이 없음을 나타냅니다. ​

각 경계선 뒤에는 메일 프로그램에 이 섹션의 콘텐츠 유형을 알려주는 줄이 있습니다.

예를 들어 위 예에서 첫 번째 구분선 뒤의 두 줄(Content-type: text/plain으로 시작하는 줄)을 살펴보세요.

이 줄은 다음 부분이 ISO-8859-1 문자 집합의 일반 텍스트임을 나타냅니다.

두 번째 구분 기호 다음 줄은 메일 프로그램에 현재 부분이 HTML 파일이고 이름이 "attachment.html"임을 알려줍니다.

Content-disposition은 가능하면 첨부 파일을 인라인으로 표시하도록 이메일 프로그램에 지시합니다.

이제 새 이메일 프로그램은 메시지 뒤에 HTML 콘텐츠를 표시합니다.

Content-disposition이 첨부 파일로 설정된 경우 메일 프로그램은 HTML 파일의 내용을 표시하지 않지만 파일에 연결된 아이콘(또는 이와 유사한 것)을 표시합니다.

첨부파일의 내용을 보려면 수신자가 이 아이콘을 클릭해야 합니다. 일반적인 상황에서 첨부 파일이 텍스트(HTML 포함)인 경우 Content-disposition은 인라인으로 설정됩니다. 이는 대부분의 이메일 프로그램이 다른 브라우저를 사용하지 않고도 첨부 파일의 내용(텍스트)을 직접 표시할 수 있기 때문입니다. 첨부 파일이 텍스트(예: 그림 또는 기타 유사한 콘텐츠)가 아닌 경우 콘텐츠 처리가 첨부 파일로 설정됩니다.

2. PHP를 사용하여 첨부 파일이 있는 이메일 생성

다음은 정의된 HTML 파일을 이메일에 첨부 파일로 추가하는 방법에 대한 예입니다. # 먼저 실제 메시지 내용 $emailBody를 작성합니다. = "이것은 이메일 본문에 들어가는 텍스트입니다."; # 그런 다음 HTML 파일을 첨부하려고 합니다. $attachment = "이것은 첨부된 HTML 파일입니다. " # 이메일의 여러 부분을 구분하는 구분선을 만듭니다. . # 기본적으로 구분선은 어떤 문자열이든 가능합니다. # 하지만 중요한 점은 이메일을 작성한 사람을 식별하는 것입니다. # 이렇게 하면 임의의 문자열이 작성되므로 # uniqid 함수를 사용하여 임의의 문자열을 생성합니다. $boundary = uniqid( ""); # 이제 이메일 헤더를 생성해야 합니다.

이 이메일에 하나 이상의 첨부 파일이 포함되어 있음을 나타내려면 # Content-type 헤더를 삽입하는 것을 잊지 마세요. $headers = "From: someone@example.com Content-type: multipart/mixed;boundary="$boundary"" # 좋습니다. 이제 이메일의 모든 내용을 얻었습니다. # 다음은 이메일 본문을 수정하는 것입니다. $emailBody = "--$boundary 콘텐츠 유형: text/plain; charset=iso-8859-1 콘텐츠 전송 인코딩: 8bit $emailBody --$boundary 콘텐츠 유형: text/html; name=attachment.html 콘텐츠 -disposition: inline; filename=attachment.html Content-transfer-encoding: 8bit $attachment --$boundary--"; # 이제 이메일을 보낼 수 있습니다. mail( "person@eksempel.dk", "The subject", $ emailBody, $headers); ?>

3. 사용자가 업로드한 파일을 첨부파일로 첨부합니다.

위의 예는 이해하기 어려울 수 있지만 아래에서는... 아래 예에서는 사용자가 파일을 업로드하고 보내는 이메일에 파일을 첨부할 수 있는 양식을 사용하고 있기 때문에 상황이 더욱 어렵습니다. 문제는 파일의 MIME 유형을 미리 알 수 없다는 것입니다.

이전 예에서는 HTML 파일이라는 것을 이미 알고 있으므로 이 첨부 파일에 대한 Content-type 헤더를 설정하는 것은 매우 간단합니다. 아래 예에서는 사용자가 HTML 파일, PNG 파일, vCard 파일 등을 업로드할 수 있으므로 MIME 유형은 임의적일 수 있습니다.

예제를 살펴보겠습니다. # 이제 양식을 생성해 보겠습니다. 파일을 업로드할 수 있는 폼을 생성할 때 # 넣는 것을 잊지 마세요 # 사용자가 "보내기" 버튼을 누른 경우" if ($send) { # 구분선 정의 $boundary = uniqid( ""); # 생성 email headers $headers = "From: $from Content-type: multipart/mixed;boundary="$boundary""" # 업로드된 파일의 MIME 유형을 결정합니다. if ($attachment_type) $mimeType = $attachment_type; 파일의 MIME 유형을 지정하지 않습니다. # "application/unknown"으로 설정할 수 있습니다. else $mimeType = "application/unknown" # 파일 이름을 결정합니다. $fileName = $attachment_name; fp = fopen($attachment, "r") ; # 전체 파일을 변수로 읽습니다. $read = fread($fp, filesize($attachment)) # 좋습니다. 이제 변수 $read에 내용이 포함된 텍스트 블록이 저장됩니다. #이제 이 텍스트를 메일 프로그램이 읽을 수 있는 형식으로 변환합니다. # base64 메서드를 사용하여 인코딩합니다. # 이제 긴 문자열이 생겼습니다. base64 방식을 사용하여 인코딩

# 다음은 이 긴 문자열을 한 줄에 76자로 구성된 작은 덩어리로 자르는 것입니다. $read = Chunk_split($read) # 이제 이메일 본문을 만들 수 있습니다. $body = "--$boundary 콘텐츠 유형: text/plain; charset=iso-8859-1 콘텐츠 전송 인코딩: 8bit $body --$boundary 콘텐츠 유형: $mimeType; name=$fileName 콘텐츠 처리 : attachment; filename=$fileName Content-transfer-encoding : base64 $read --$boundary--"; # 메일 보내기 mail($to, $subject, $body, $headers); } ?>  

그게 다예요. 위의 예를 잘 이해하지 못한다면 첨부 파일이 포함된 몇 개의 이메일을 자신에게 보낸 다음 이메일의 소스 코드를 주의 깊게 연구하는 것이 좋습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.