2014-07-25 4 views
6

smtp 패키지의 기본 제공 기능을 사용하여 GO에서 간단한 전자 메일을 보내려고합니다. 물건은 항상 내가 정의의 반환이 포함 된 메시지를 보낼 경우에도 config.SmtpUsername의 값으로 반환 경로 헤더를 설정하는 것입니다,GO에서 전자 메일 보내기, Return-Path 헤더를 설정할 수 없음

func sendEmail(to string, body []byte) error { 
    auth := smtp.PlainAuth(
     "", 
     config.SmtpUsername, 
     config.SmtpPassword, 
     config.SmtpHostname, 
    ) 

    return smtp.SendMail(
     fmt.Sprintf("%s:%d", config.SmtpHostname, config.SmtpPort), 
     auth, 
     config.SmtpUsername, 
     []string{to}, 
     body, 
    ) 
} 

그리고 그것은 작동합니다

내 간단한 코드처럼 보이는 기본적으로 메시지가 전송 된 후에 -Path 헤더는 메시지의 Return-Path가 smtp 사용자 이름으로 대체 된 것처럼 보입니다.

내가 어떻게 이런 일을 피할 수 있고 돌아가는 길에서 나는 무엇이든 사용할 수 있다고 생각하십니까?

LE 1 : 도움이 코드 조각은에서 사용할 수있는 경우 : http://play.golang.org/p/ATDCgJGKZ3
LE 2 : 나는 이렇게 내가 전달 서버가 어떤에서 헤더를 변경 생각하지 않습니다, swiftmailer와 PHP에서 원하는 동작을 얻을 수 있습니다 방법.

더 코드 : 여전히 인증서 오류를 방지하기 위해 난 그냥 TLS 구성에 InsecureSkipVerify: true을 설정 사용자 지정 mysmtp 패키지와

Yii::import('common.vendors.SwiftMailer.lib.classes.Swift', true); 
Yii::registerAutoloader(array('Swift', 'autoload')); 
Yii::import('common.vendors.SwiftMailer.lib.swift_init', true); 

$hostname = ''; 
$username = ''; 
$password = ''; 
$returnPath = ''; 
$subject = 'Swiftmailer sending, test return path'; 
$toEmail = ''; 

$transport = Swift_SmtpTransport::newInstance($hostname, 25); 
$transport->setUsername($username); 
$transport->setPassword($password); 

$logger = new Swift_Plugins_LoggerPlugin(new Swift_Plugins_Loggers_ArrayLogger()); 
$mailer = Swift_Mailer::newInstance($transport); 
$mailer->registerPlugin($logger); 

$message = Swift_Message::newInstance(); 

$message->setReturnPath($returnPath); 
$message->setSubject($subject); 
$message->setFrom($username); 
$message->setTo($toEmail); 
$message->setBody('Hello, this is a simple test going on here...'); 

$sent = $mailer->send($message); 

print_r($logger->dump()); 

GO : swiftmailer와

PHP, 그것은 적절한 리턴 경로를 설정합니다 리턴 경로가 잘못 : 말 그대로 어떤 것을 실패 단서 이유가 없다

hostname := "" 
username := "" 
password := "" 
returnPath := "" 
subject := "GO sending, test return path" 
toEmail := "" 
body := "Hello, this is a simple test going on here..." 

auth := mysmtp.PlainAuth(
    "", 
    username, 
    password, 
    hostname, 
) 

header := make(map[string]string) 
header["Return-Path"] = returnPath 
header["From"] = username 
header["To"] = toEmail 
header["Subject"] = subject 

message := "" 
for k, v := range header { 
    message += fmt.Sprintf("%s: %s\r\n", k, v) 
} 
message += "\r\n" + string([]byte(body)) 

err := mysmtp.SendMail(
    fmt.Sprintf("%s:%d", hostname, 25), 
    auth, 
    username, 
    []string{toEmail}, 
    []byte(message), 
) 

log.Fatal(err) 

,이 마지막 시험은 후위 MTA, IJ에 대해 진행되고있다 이 동작을 허용하려면 reject_sender_login_mismatch 정책을 후위 구성에서 제거해야합니다.

+0

메시지 본문과 실제 [] 바이트를 추가 할 수 있습니까? – Momer

+0

@Momer - http://play.golang.org/p/ATDCgJGKZ3에서보세요. 당신이 거기에 무엇을 던지 던지 상관 없습니다. 결과는 같습니다. 반환 경로는 덮어 씁니다. – Twisted1919

+1

아마 당신은 할 수 없습니다. 코드로 그렇게해라. 'Return-Path'는 SMTP 시스템에 의해 설정됩니다 (이미 존재할 때 재설정 될 수 있습니다). [RFC 5321] (https://tools.ietf.org/html/rfc5321#page-58)은 메시지 발신 시스템이 리턴 경로를 지정해서는 안된다. 예를 들어 내가 아는 한 Gmail을 사용 중이며 반송 경로가 사용자 이름과 다르면 Gmail이 사용자 이름으로 재설정합니다. – bernhardw

답변

5

Return-Path는 클라이언트가 메시지를 보낼 때 지정하는 "MAIL FROM"명령에서 파생됩니다.

http://golang.org/src/pkg/net/smtp/smtp.go에서 smtp 패키지의 구현 세부 정보를 보면 func (c *Client) Mail(from string) error 인수에 대체 주소를 사용하는 SendMail 함수를 구현하기가 너무 어렵지 않습니다.

+0

예, 맞습니다. 이렇게하면 잘됩니다. 나는 첫 번째 것들 중 하나로 시도했지만, postfix 지시어'smtpd_sender_restrictions'가'reject_sender_login_mismatch' 규칙을 포함하고 있기 때문에 작동하지 않았습니다. 내가 다시 넣으면 더 이상 작동하지 않겠지 만, 결론은이 경우에는 올바른 행동입니다. – Twisted1919