메일이 잘 안 될 때 읽는 글 (이 질문을 받을 때 읽을 글)
발송 주소만 변경하면 성공 여부가 달라지고 프로그램을 실행하는 서버의 설정 동작에 따라 달라진다.로컬 환경에서 보내면 어느 공급업체를 사용해서 인터넷에 접속하는지에 영향을 줄 수 있다.
질문이라도 제시해야 할 정보가 많지만, 질문자가 실제로 시도한 소스 코드를 이메일 주소에 직접 게재하는 것은 심리적으로 어렵다.(사실 필요한 정보인데...)
우연히 잘 되는 일이 드물기 때문에 이런 프로그램은 번거롭지만 대응하기 위해서는 DNS와 SMTP, IMAP 등 광범위한 지식이 필요하다.기본적인 구조를 알고 있다면 질문을 해도 어떤 정보를 제공해야 하는지를 자연스럽게 볼 수 있을 텐데... 그래서 글을 써 보았습니다.
질문할 때 제시해야 할 메시지
메일을 보내는 메커니즘을 알아보도록 하겠습니다.
다음 그림은 PC의 제조업체에서
[email protected]
로 메일을 보내는 경로를 나타낸다.PC
↓
送信(SMTP)サーバ
↓
受信(IMAP)サーバ
1. 제조사의 역할
메일의 본문을 만들고 발송 단추를 누르면 메일 사용자는 미리 설정된 발송 서버(SMTP)의 설정에 따라 발송 서버에 연결하여 생성된 메일을 보내려고 시도합니다.
送信サーバーの設定情報の例
* サーバー名 - mail.send.com
* メールアドレス - [email protected]
* ユーザー名 - [email protected]
* パスワード - password
정보(기본적으로)를 위의 정보로 설정합니다.메일은 PC에서 상기 설정 정보 중 서버 이름(mail.send.com)이 어디에 있는지 조사한다.이게 이름해결이야.이 구조는 전화와 똑같아서 서버 이름은'지미짱'에 해당한다.전화 번호는 IP 주소와 같습니다.
서버에 접속하기 위해서는 IP 주소가 없으면 접속이 불가능하기 때문에 PC(OS)는 전화번호부에 해당하는'DNS'구조를 사용해 IP 주소를 조사한다.
이 메커니즘이 윈도라면 명령을 알릴 수 있고 맥은 터미널에서 이 메커니즘을 확인할 수 있다.
#windows
$ nslookup --type=mx google.com
# Mac
$ dig google.com mx
IP 주소가 성공하면 서버에 연결 요청을 보냅니다.실패할 때 '발송 서버를 찾을 수 없음' 등의 오류를 표시하고 사용자에게 알립니다.2. 발송 서버의 역할
요청을 받은 발송 서버는 '설정 정보' 의 메일 주소, 사용자 이름, 비밀번호가 정확한지 판단하고, 정확하면 연결을 허용하며, 틀리면 '사용자 이름 또는 비밀번호 오류' 오류가 발생하여 연결을 끊습니다.
연결이 성공하면 발송 서버는 메일 데이터에서 목적지의 메일 주소를 얻고
[email protected]
이후의 구역 부분에서 이 서버가 존재하는지 판단합니다.방금 @
지령의 구조.존재하면 이 수신 서버에 메일 데이터를 보냅니다.판정이 실패했을 때, '수신자가 없는 서버' 의 뜻을 발송자에게 보냅니다.일반적으로 "MAILERDAEMON~"의 메일입니다.
이 단계에서는 수신 서버가 메일을 받았는지 확인할 수 없습니다.
3. 수신 서버의 역할
수신 서버는 발송된 메일 데이터에 따라'수신자 메일 주소
dig
'가 [email protected]
까지의 이전 부분@
에 자신의 서버에 해당 사용자가 존재하는지 판단하고 존재하면user의 메일박스에 데이터를 만든다.사용자가 존재하지 않으면 보내는 사람의 메일 주소에 잘못된 메일을 보냅니다.여기도 "MAILERDAEMON..."라는 이메일을 보냈다.
기본적으로 이런 행사지만 사실상 모든 메일을 받을 수 있는 것은 아니다.서버
user
가 존재하는 것으로 알려져 있기 때문에 @보다 빠른 부분을 무작위로 생성하여 존재할 수 있는 메일 주소로 메일을 보낼 수 있습니다.많은 스팸메일은 자동화 프로그램을 통해 발송되기 때문에 수량도 커진다.따라서 수신 서버는 스팸메일의 가능성이 높은 것을 처음부터 거부하는 메커니즘이 있다.
PHP 코드로 메일 보내기 동작 보기
mail(mb send mail) 함수를 사용한 예
<?php
//言語設定、内部エンコーディングを指定する
mb_language("japanese");
mb_internal_encoding("UTF-8");
//日本語メール送信
$to = "[email protected]";
$subject = "例の件について";
$body = "どうでしょう?";
$from = "[email protected]";
mb_send_mail($to,$subject,$body,"From:".$from);
이 예라면 서버를 인증하지 않고 수신 서버에 직접 메일을 보낸다.나는 서버가 정상적으로 메일을 받을 가능성이 매우 낮다는 것을 스스로 알고 있다.PHPMailer 사용 예
<?php
require_once("./phpmailer/class.phpmailer.php");
mb_internal_encoding("UTF-8");
$to = "[email protected]"; //宛先
$subject = "メールの件名"; //件名
$body = "メールの本文です。"; //本文
$from = "[email protected]"; //差出人
$fromname = "送信者"; //差し出し人名
$mail = new PHPMailer();
$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";
$mail->IsSMTP(); //「SMTPサーバーを使うよ」設定
$mail->SMTPAuth = TRUE; //「SMTP認証を使うよ」設定
$mail->Host = 'send.com:25'; // SMTPサーバーアドレス:ポート番号
$mail->Username = 'user'; // SMTP認証用のユーザーID
$mail->Password = 'password'; // SMTP認証用のパスワード
$mail->AddAddress($to);
$mail->From = $from;
$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8"));
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
$mail->Body = mb_convert_encoding($body,"JIS","UTF-8");
//メールを送信
$mail->Send();
PHPMailer와 같은 고기능 프로그램 라이브러리에서는 SMTP 서버를 보내는 중계 메일을 인코딩하기 쉽다.정규 송신 서버를 중계하고 있기 때문에 우편물이 도착할 가능성이 높다는 것을 안다.※ 발송 주소는 @gmail입니다.com의 경우 순조롭지 못한 상황이 있습니다.
gmail의 SMTP에 대해 "최신 보안 기준을 충족시키지 않는 프로그램이 Google 계정에 로그인하고 싶어 하는 사람이 있습니다."라는 판정이 나왔다.경고, 연결을 거부합니다. 발송 주소로 사용하지 않는 것을 권장합니다.
PHPMailer를 사용하여 Gmail의 SMTP를 통해 메시지를 보낼 때 SMTP connect()failed를 사용합니다.난감하게 나오다
스팸메일의 발송 주소에 많이 사용하기 위한 조치...
Gmail 샘플 코드 사용
<?php
ini_set('display_errors', true);
error_reporting(E_ALL);
require 'vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
// コンストラクタ
$mail = new PHPMailer();
// 文字コード
$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";
// SMTPサーバーを利用する
$mail->IsSMTP();
// デバッグ
$mail->SMTPDebug = 1;
// SMTPAuthを利用する
$mail->SMTPAuth = true;
// SMTPサーバー
$mail->Host = 'smtp.gmail.com';
// ユーザー名
$mail->Username = '[email protected]';
// パスワード
$mail->Password = 'password';
// ポート
$mail->Port = 587;
// メールヘッダー文字コード
$mimeheader_encoding = 'JIS';
// 送信者アドレス
$mail->From = '[email protected]';
// 送信者名
$mail->FromName = mb_encode_mimeheader(
'送信者名'
, $mimeheader_encoding
);
// 宛先
$mail->addAddress('[email protected]');
// メールタイトル
$mail->Subject = mb_encode_mimeheader(
'メールタイトル'
, $mimeheader_encoding
);
// メール本文
$mail->Body = mb_convert_encoding(
'本文'
, $mimeheader_encoding
);
// 添付ファイル
// マルチバイト文字を利用するときは、mb_encode_mimeheader() を使う
$mail->addAttachment(
'./test.zip'
, mb_encode_mimeheader(
'添付ファイル.zip'
, $mimeheader_encoding
)
);
if (!$mail->send()) {
echo $mail->ErrorInfo;
}
보도의 불완전에 관하여
나는 초보자 프로그래머도 알아볼 수 있도록 최선을 다하고 싶어서 "이런 표현이 더 좋지 않겠니?"라고 썼다.만약 이런 생각이 있다면 사양하지 마세요.
Reference
이 문제에 관하여(메일이 잘 안 될 때 읽는 글 (이 질문을 받을 때 읽을 글)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ShibuyaKosuke/items/309c0a7d969baf0ea8d1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)