Если у вас возникли проблемы с отправкой писем с помощью PHP, рассмотрите альтернативу, например PHPMailer или SwiftMailer .
Обычно я использую SwiftMailer всякий раз, когда мне нужно для отправки писем с PHP.
require 'mail/swift_required.php';
$message = Swift_Message::newInstance()
// The subject of your email
->setSubject('Jane Doe sends you a message')
// The from address(es)
->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
// The to address(es)
->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
// Here, you put the content of your email
->setBody('New message
Here goes the rest of my message
', 'text/html');
if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
echo json_encode([
"status" => "OK",
"message" => 'Your message has been sent!'
], JSON_PRETTY_PRINT);
} else {
echo json_encode([
"status" => "error",
"message" => 'Oops! Something went wrong!'
], JSON_PRETTY_PRINT);
}
Подробнее о том, как использовать SwiftMailer, см. в официальной документации .
>>> x = 'foo'
>>> x
'foo'
Итак, имя x
прикреплено к строке 'foo'
. Когда вы вызываете, например, repr(x)
, интерпретатор помещает 'foo'
вместо x
, а затем вызывает repr('foo')
.
>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"
repr
фактически вызывает магический метод __repr__
в x
], который дает строку, содержащую представление значения 'foo'
, присвоенное x
. Поэтому он возвращает 'foo'
внутри строки ""
, что приводит к "'foo'"
. Идея repr
состоит в том, чтобы дать строку, содержащую ряд символов, которые мы можем ввести в интерпретаторе, и получить то же значение, которое было отправлено как аргумент repr
.
>>> eval("'foo'")
'foo'
Когда мы вызываем eval("'foo'")
, это то же самое, что мы набираем 'foo'
в интерпретаторе. Это как мы непосредственно набираем содержимое внешней строки ""
в интерпретаторе.
>>> eval('foo')
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
eval('foo')
File "<string>", line 1, in <module>
NameError: name 'foo' is not defined
Если мы назовем eval('foo')
, это то же самое, что мы набираем foo
в интерпретаторе. Но нет переменной foo
и возникает исключение.
>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>>
str
- это просто строковое представление объекта (помните, что переменная x
относится к 'foo'
), так что эта функция возвращает строку.
>>> str(5)
'5'
Строковое представление integer 5
- '5'
.
>>> str('foo')
'foo'
И строковое представление строки 'foo'
- это одна и та же строка 'foo'
.
Обратная связь, которую вы получаете на интерактивном интерпретаторе, также использует repr
. Когда вы вводите выражение (пусть оно будет expr
), интерпретатор в основном выполняет result = expr; if result is not None: print repr(result)
. Таким образом, вторая строка в вашем примере - , форматирующая строку foo
в желаемое представление ('foo'
). И тогда интерпретатор создает repr
представление , что , оставляя вас с двойными кавычками.
Почему, когда я совмещаю% r с двойными кавычками и одиночными кавычками и распечатайте их, он печатает его так, как я бы написал его в моем .py-файле, но не так, как хотелось бы видеть его?
blockquote>Я не уверен, что вы здесь спрашивают. Текст
single ' and double " quotes
при прохождении черезrepr
включает экраны для одного вида цитаты. Конечно, это так, иначе это не будет корректным строковым литералом по правилам Python. Это то, о чем вы просили, вызвавrepr
.Также обратите внимание, что аналог
eval(repr(x)) == x
не имеет значения буквально. Это приближение и справедливо для большинства (всех?) Встроенных типов, но главное, что вы получаете довольно хорошее представление о типе и логическом «значении» от просмотра выходаrepr
.
repr
должно быть чем-то, что может быть передано в eval
(или скопировано и вставлено в исходный код), чтобы получить равное значение, или что-то, что поднимет SyntaxError, когда вы попробуете это (обычно стиль <…>
, созданный object.__repr__
). На протяжении многих лет это постепенно уменьшалось, а на 2.7 и 3.x это было просто «для многих типов», и есть исключения даже в stdlib (например, тип namedtuple
, созданный как локальный, даст вам a repr
вы не можете eval
), но это была оригинальная идея.
– abarnert
25 June 2018 в 21:08
str () используется для создания вывода для конечного пользователя, в то время как функция repr () используется для разработки debuggin. И он является официальным объектом.
Пример:
>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'
Из вывода видно, что repr () показывает официальное представление объекта даты.
1) Результатом repr('foo')
является строка 'foo'
. В вашей оболочке Python результат выражения также выражается как представление, поэтому вы видите repr(repr('foo'))
.
2) eval
вычисляет результат выражения. Результатом всегда является значение (например, число, строка или объект). Несколько переменных могут ссылаться на одно и то же значение, например:
x = 'foo'
y = x
x и y теперь относятся к одному и тому же значению.
3) Я понятия не имею, что вы имели в виду здесь. Можете ли вы опубликовать пример и что вы хотите увидеть?
Когда вы говорите
foo = 'bar'
baz(foo)
, вы не передаете foo
функции baz
. foo
- это просто имя, используемое для представления значения, в данном случае 'bar'
, и это значение передается функции baz
.