Merge pull request #7861 from owncloud/idn-domains-support-on-emails-master

idn have to be converted before being used
This commit is contained in:
Thomas Müller 2014-03-25 12:38:32 +01:00
commit 531c9564b3
4 changed files with 50 additions and 3 deletions

View File

@ -73,6 +73,7 @@ class OC_Mail {
$mailo->FromName = $fromname;; $mailo->FromName = $fromname;;
$mailo->Sender = $fromaddress; $mailo->Sender = $fromaddress;
try { try {
$toaddress = self::buildAsciiEmail($toaddress);
$mailo->AddAddress($toaddress, $toname); $mailo->AddAddress($toaddress, $toname);
if($ccaddress<>'') $mailo->AddCC($ccaddress, $ccname); if($ccaddress<>'') $mailo->AddCC($ccaddress, $ccname);
@ -124,7 +125,23 @@ class OC_Mail {
* @param string $emailAddress a given email address to be validated * @param string $emailAddress a given email address to be validated
* @return bool * @return bool
*/ */
public static function ValidateAddress($emailAddress) { public static function validateAddress($emailAddress) {
$emailAddress = self::buildAsciiEmail($emailAddress);
return PHPMailer::ValidateAddress($emailAddress); return PHPMailer::ValidateAddress($emailAddress);
} }
/**
* IDN domains will be properly converted to ascii domains.
*
* @param string $emailAddress
* @return string
*/
public static function buildAsciiEmail($emailAddress) {
list($name, $domain) = explode('@', $emailAddress, 2);
$domain = idn_to_ascii($domain);
return "$name@$domain";
}
} }

View File

@ -266,7 +266,7 @@ class Util {
$host_name = \OC_Config::getValue('mail_domain', $host_name); $host_name = \OC_Config::getValue('mail_domain', $host_name);
$defaultEmailAddress = $user_part.'@'.$host_name; $defaultEmailAddress = $user_part.'@'.$host_name;
if (\OC_Mail::ValidateAddress($defaultEmailAddress)) { if (\OC_Mail::validateAddress($defaultEmailAddress)) {
return $defaultEmailAddress; return $defaultEmailAddress;
} }

View File

@ -6,7 +6,7 @@ OCP\JSON::callCheck();
$l=OC_L10N::get('core'); $l=OC_L10N::get('core');
// Get data // Get data
if( isset( $_POST['email'] ) && filter_var( $_POST['email'], FILTER_VALIDATE_EMAIL) ) { if( isset( $_POST['email'] ) && OC_Mail::validateAddress($_POST['email']) ) {
$email=trim($_POST['email']); $email=trim($_POST['email']);
OC_Preferences::setValue(OC_User::getUser(), 'settings', 'email', $email); OC_Preferences::setValue(OC_User::getUser(), 'settings', 'email', $email);
OC_JSON::success(array("data" => array( "message" => $l->t("Email saved") ))); OC_JSON::success(array("data" => array( "message" => $l->t("Email saved") )));

30
tests/lib/mail.php Normal file
View File

@ -0,0 +1,30 @@
<?php
/**
* Copyright (c) 2014 Thomas Müller <deepdiver@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
class Test_Mail extends PHPUnit_Framework_TestCase {
/**
* @dataProvider buildAsciiEmailProvider
* @param $expected
* @param $address
*/
public function testBuildAsciiEmail($expected, $address) {
$actual = \OC_Mail::buildAsciiEmail($address);
$this->assertEquals($expected, $actual);
}
function buildAsciiEmailProvider() {
return array(
array('info@example.com', 'info@example.com'),
array('info@xn--cjr6vy5ejyai80u.com', 'info@國際化域名.com'),
array('info@xn--mller-kva.de', 'info@müller.de'),
array('info@xn--mller-kva.xn--mller-kva.de', 'info@müller.müller.de'),
);
}
}